Шаг 134.
Python: тонкости программирования. Общие структуры данных Python. Очереди с приоритетом. list - поддержание сортируемой очереди вручную

    На этом шаге мы рассмотрим Использование этого класса для создания очередей с приоритетом.

    Вы можете использовать сортированный список list, который позволяет быстро идентифицировать и удалять наименьший или наибольший элемент. Недостатком является то, что вставка новых элементов в список является медленной O(n) операцией.

    Несмотря на то что точка вставки может быть найдена за O(log n) время с помощью алгоритма bisect.insort стандартной библиотеки, это решение всегда находится во власти медленного шага вставки.


См. документацию Python "bisect.insort": https://docs.python.org/3.6/library/bisect.html.

    Поддержание упорядоченности путем добавления в конец списка и пересортировки также занимает минимум O(n log n) времени. Еще один недостаток - вам придется вручную заботиться о пересортировке списка во время вставки новых элементов. Пропустив этот шаг, можно легко внести ошибки, и ответственность за них всегда будет на вас как на разработчике.

    Поэтому, на наш взгляд, сортированные списки подходят как очереди с приоритетом только в тех случаях, когда вставок немного.

>>> q = []
>>> q.append((2, 'программировать'))
>>> q.append((1, 'есть'))
>>> q.append((3, 'спать'))
# ПРИМЕЧАНИЕ: Не забудьте выполнить пересортировку всякий раз,
# когда добавляется новый элемент, либо используйте
# bisect.insort().
>>> q.sort(reverse=True)
>>> while q:
	next_item = q.pop()
	print(next_item)

	
# Результат:
(1, 'есть')
(2, 'программировать')
(3, 'спать')

    На следующем шаге мы рассмотрим класс heapq.




Предыдущий шаг Содержание Следующий шаг