2009-02-17 3 views
5

У меня был только вопрос с вопросом, и мне любопытно, каким должен быть ответ. Проблема была, по существу:Оптимальный поиск минимальных значений k в несортированном списке целых чисел

Скажем, у вас есть несортированный список из n целых чисел. Как вы находите k минимальных значений в этом списке? То есть, если у вас есть список [10, 11, 24, 12, 13] и вы ищете два минимальных значения, вы получите [10, 11].

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

EDIT # 1: Например, функция, как: список getMinVals (список & л, внутр к)

EDIT # 2: Похоже, это алгоритм выбора, так что я буду бросать в моем решении также; итерация по списку и использование очереди приоритетов для сохранения минимальных значений. Спецификация в очереди приоритетов заключалась в том, что максимальные значения заканчиваются в верхней части очереди приоритетов, поэтому при сравнении вершины с элементом верхняя часть будет выскользнуть, а меньший элемент будет нажат. Это предполагало, что очередь приоритетов имела O (log n) push и O (1) pop.

+0

Я помню, как это делалось год назад, и ответ, который я получил, не лучше, чем O (n * log (k)), поэтому я думаю, что у вас может быть уже это. – achinda99

+0

По совпадению я должен был фактически реализовать это на работе только вчера. Это O (n * log (k)), хотя есть несколько разных способов добраться туда. – Crashworks

+0

Всегда приятно слышать, что я не собирал интервью. Тем не менее, 2-3 решения, которые я пробовал раньше, вероятно, не очень помогли мне. –

ответ

6

Это алгоритм quickSelect. Это в основном быстрый вид, где вы только рекурсируете для одной части массива. Вот простая реализация в Python, написанная для краткости и удобочитаемости, а не эффективности.

def quickSelect(data, nLeast) : 
    pivot = data[-1] 
    less = [x for x in data if x <= pivot] 
    greater = [x for x in data if x > pivot] 
    less.append(pivot) 

    if len(less) < nLeast : 
     return less + quickSelect(greater, nLeast - len(less)) 
    elif len(less) == nLeast : 
     return less 
    else : 
     return quickSelect(less, nLeast) 

Это будет работать в O (N) в среднем, так как на каждой итерации, вы, как ожидается, уменьшить размер data с помощью мультипликативной константы. Результат не будет отсортирован. В худшем случае O (N^2), но это рассматривается, по сути, так же, как и быстрая сортировка, используя такие вещи, как медиана 3.

+0

Вопрос был для эффективности. – starblue

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