Как реализовать приоритетную очередь?

199
22 октября 2017, 19:44

Задача написать программу читающую из файла описания операций с очередью и выводящую в другой файл результат выполнения всех операций extract-min. Если перед очередной операцией extract-min очередь пуста, выводит вместо числа звездочку.

Пример:

priorityqueue.in                                             priorityqueue.out
push 3                                                       2
push 4                                                       1 
push 2                                                       3 
extract-min                                                  *
decrease-key 2 1
extract-min
extract-min
extract-min

Я написал реализацию с использованием списка, куда каждый элемента добавлял с бинарным поиском, чтобы массив был всегда отсортирован

import bisect, sys
sys.stdout = open("priorityqueue.out", "w")
queue = []
operations = open("priorityqueue.in").read().strip().split("\n")
for op in operations:
    op_parsed = op.split()
if op_parsed[0] == "push":
    bisect.insort(queue, int(op_parsed[1]))
elif op_parsed[0] == "extract-min":
    try:
        print(queue[0])
        del queue[0]
    except:
        print("*")
else:
    del queue[int(op_parsed[1]) - 1]
    bisect.insort(queue, int(op_parsed[2]))

Но проблема в том, что на некотором тесте была "ошибка времени исполнения". Как я выяснил эмпирическим путем на строчке del queue[int(op_parsed[1]) - 1] кидается исключение и скорее всего это было IndexError, но из-за чего оно кидается я понять не могу.

До этого я написал реализацию с использованием heapq у которой тоже была "ошибка времени исполнения" на том же месте

import heapq, sys
sys.stdout = open("priorityqueue.out", "w")
queue = []
operations = open("priorityqueue.in").read().strip().split("\n")
for op in operations:
    op_parsed = op.split()
    if op_parsed[0] == "push":
        heapq.heappush(queue, int(op_parsed[1]))
    elif op_parsed[0] == "extract-min":
        try:
            print(heapq.heappop(queue))
        except IndexError:
            print("*")
    else:
        queue[int(op_parsed[1]) - 1] = queue[-1]
        queue.pop()
        heapq.heappush(queue, int(op_parsed[2]))

P.S. При попытке добавления блока

try:
    ...
except:
    pass

"ошибка времени исполнения" заменяется на "неверный ответ" на том же тесте

Answer 1

В команде decrease-key 2 1 второй элемент это значение элемента в куче, а не его индекс в ней. Используй в командах push 3 значения больше, чем предположительный размер кучи и скрипт повалится раньше.

Делай так:

del queue[queue.index(op_parsed[1])]

А ее лучше, если заменишь del на .pop():

queue.pop(queue.index(op_parsed[1]))
READ ALSO
Перевод фокуса на элемент управления

Перевод фокуса на элемент управления

У меня есть форма с двумя кнопками, называющимися aButton и bButtonХочу, чтоб по нажатию мышкой на aButton выполнялась функция myFunctionMouseClickA, а по нажатию...

251
QRcode по ссылке

QRcode по ссылке

Задача следующая, нужно что бы перейдя по ссылке сразу получить изображение QR кода согласно get параметров в URLКак например тут

227
Скачать архив по FTP с сервера c#

Скачать архив по FTP с сервера c#

Добрый день, коллеги

237