2013-07-29 2 views
2

Если я использую модифицированную версию quicksort для поиска k-го наименьшего элемента в массиве, почему ожидаемое время работы O (n) (как указано в книге Programming Pearls)?Поиск k-го наименьшего элемента в массиве с использованием quicksort => ожидаемого времени работы?

алгоритм я использую делает следующее:

1) Runs quick sort on the array 
2) If k is > the correct location of pivot, then run quicksort on the 2nd half. 
Otherwise run it on the first half. 

Я был под впечатлением, это заняло бы O (N * LOGN) работы.

+0

* quickselect * - это имя алгоритма. [Вот еще вопрос об этом] (http://stackoverflow.com/questions/10846482/quickselect-algorithm-understanding) и [охват википедии] (https://en.wikipedia.org/wiki/Selection_algorithm#Partition-based_general_selection_algorithm) в котором говорится, что это O (n) среднее, но O (n^2) в худшем случае. (Я предполагаю, что книга на самом деле имеет quickselect, так как это алгоритм выбора, основанный на быстрой сортировке. У меня нет книги для проверки.) –

ответ

4

Эта ссылка может помочь понять доказательство рандомизированном быстрого выбора, http://pine.cs.yale.edu/pinewiki/QuickSelect,

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

В приведенном ниже описании, я не пытаюсь доказать, но хотел дать интуитивное мысли, чтобы понять ожидаемую сложность,

Для простоты допустим, на каждой итерации, стержень разбивает массив на равные части , то сложность явно O (п), а

n + (n/2) + (n/4) ... <= c.n, O(n) 

для интуитивного понимания, получая наихудшее секционирование, где вы должны обработать (N-1) элементы в каждой итерации происходит с вероятностью просто (1/п). Таким образом, сложность худшего случая в любом случае равна O (n^2).

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

+0

Очень аккуратно! Существует log (n) «итераций», но каждая итерация составляет половину стоимости предыдущей итерации, поэтому это что-то вроде O (2N + logN), который является только O (N). Еще один способ думать об этом: сложность такая же, как и для двоичного поиска через связанный список. –

0

Это не будет алгоритм, описанный в книге. Скорее это один раздел в (1), (2) и т.д.

+0

Хорошо, если это так, как это работает O (n)? –

+0

Потому что это 'partition [s] только O (log n) своих O (n) разделов'. – EJP

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

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