2015-08-20 2 views
4

Я знаю, что мы можем найти k-наибольшее число из п неупорядоченных чисел в 2 способами:Можно ли найти k-наибольшие числа из n несортированных целых чисел с временной сложностью O (n) и пространственной сложностью O (k)?

  1. Используйте алгоритм, как быстро выбрать, чтобы найти k-ю наибольшее число, то мы можем получить к-наибольшее число , Сложность времени - O (n), а пространственная сложность - O (n)
  2. Используйте кучу для хранения k-наибольших чисел и итерации через n целых чисел, а затем добавьте в кучу соответствующие целые числа. Сложность времени O (nlogk) и пространство сложность O (к)

Предположим, п целые числа в потоке, и мы не имеем случайного доступа к ним

Я хочу знать это можно найти k-наибольшие числа из n несортированных целых чисел с временной сложностью O (n) и пространственной сложностью O (k)?

+2

Почему вы считаете быстрый выбор, чтобы иметь пространство сложность O (N). Он имеет сложность памяти сложения O (1) (при условии, что вы можете переустановить ввод) –

+0

Это выполнимо. См. Http://link.springer.com/chapter/10.1007%2FBFb0015429 Используя этот алгоритм, вы можете найти k-е наибольшее число в линейном времени с постоянным количеством дополнительных переменных. –

ответ

5

Это. После заполнения кучи k элементами вместо вытеснения одного элемента из кучи после каждой вставки выселите k элементов из кучи после каждого k вставок. Тогда вам больше не нужна структура кучи - просто выберите каждый раз.

+1

Звучит неплохо. Мне кажется, вам на самом деле не нужна куча, просто массив с 2k позициями. –

-1

K пассы пузырьковой сортировки дадут K наибольших элементов в последнем из Timeo массива (пк)

+0

Эта сложность времени уже хуже, чем предложение № 2 от OP ... –

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