1

От wikipedia:Является ли сложность времени вложения реализации списка приоритетных запросов O (n) отсортированного списка?

Рассортировано реализация списка: Как кассу в супермаркете, но , где важные люди получают «вырезать» в перед менее важными людьми. (O (п) время вставки, O (1) получить, в следующий раз, O (N * Log (N)), чтобы построить)

Я думаю, если поиск позицию вставки с двоичным алгоритмом поиска , сложность времени ввода должна быть O (log (n)). Здесь я рассматриваю порядок поступления заданий как фактор приоритета.

Я тоже неправ или википедию?

Обновление: Согласно строгому определению списка из TAOCP:

Линейный список представляет собой последовательность п> = 0 узлы X 1, Х [2], ..., X [n], у которых существенные структурные свойства включают только относительные позиции между пунктами, как они появляются в строке .

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

спасибо.

+0

Не могли бы вы разместить ссылку на статью Википедии, которую вы цитировали? – 2010-02-01 15:58:04

+0

А, я сделал для вас работу. Это статья с приоритетной очередью: http://en.wikipedia.org/wiki/Priority_queue – 2010-02-01 15:59:51

ответ

3

если связанный список поддерживается, вы не можете выполнять двоичный поиск так; Нахождение точки вставки O (n), Фактическая вставка - это O (1) при изменении соседних узлов, общий O (n).

если его массив поддерживается, вы можете выполнить двоичный поиск так; найти точку вставки О (журнал (п)), но вставки в массиве представляет собой О (п), как вы, возможно, придется перенести все элементы массива, общая О (п)

это почему у вас на самом деле есть дерево/куча, поэтому все операции могут быть O (log (n))

+0

thanks.i не учитывал движение узлов до: – Jichao

3

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

+0

Я так не думаю. Список должен быть отсортирован перед вставкой. Вот почему временная сложность наращивания - это O (n * log (n)), которая является временной сложностью алгоритма общего сортирования. – Jichao

+0

@jcyang рассмотрите список '1 -> 2 -> 3 -> 4' и попробуйте вставить элемент' 5' в него вручную. Обратите внимание, что у вас нет произвольного доступа (нет 'list [3]', есть только 'list-> next') – laura

+0

@laura: Список не связан с списком. Он обычно реализуется либо как связанные списки (либо по отдельности, либо с двойной связью) или как массивы. Поэтому, если я реализую дерево prority как массив, то получаю произвольный доступ. – Jichao

1

Двоичный поиск действительно O(log n), но бинарный поиск работает на массивах - он работает в это время, потому что вы можете получить доступ к любому элементу в O (1).

Однако в литературе, когда вы видите список терминов, вы должны думать о связанных списках. В списке поэтому нет времени доступа O (1), но вам нужно искать позицию «вручную» - поэтому вставка элемента займет O (n).

+1

также, если бы это был массив, вы можете найти местоположение в O (log (n)), но вставка будет по-прежнему O (n), поскольку вам нужно скопировать массив –

+0

Но массив также является своего рода списком. – Jichao

+0

@jk: +1 Точка! – Jichao

0

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

0

Википедия верна. Как уже указывали другие, списки не являются случайным доступом, поэтому вам нужно посетить каждый узел между A и B до того, как вы доберетесь до B. Это делает поиск в двоичном формате бесполезным, так как перемещение списка происходит из O (n), поэтому вы в конечном итоге делать больше работать, чем если бы вы просто перечислили один раз. Вы можете кэшировать начальный, средний и конечный узлы в отдельном буфере и сначала проверить их. Однако это будет иметь тот же эффект, что и использование нескольких списков. Структура данных пропущенных списков принимает эту идею еще на один шаг.

Так что вместо этого используйте кучу произвольного доступа или, возможно, список пропусков: http://en.wikipedia.org/wiki/Skip_list в зависимости от ваших потребностей.

 Смежные вопросы

  • Нет связанных вопросов^_^