знаходження найменших k елементів масиву в O (k)


12

Це цікаве питання, яке я знайшов в Інтернеті. Враховуючи масив, що містить n чисел (без інформації про них), ми повинні попередньо обробити масив за лінійним часом, щоб ми могли повернути k найменших елементів за час O (k), коли нам дано число 1 <= k <= n

Я обговорював цю проблему з деякими друзями, але ніхто не міг знайти рішення; будь-яка допомога буде вдячна!

швидкі зауваження: -порядок k найменших елементів не важливий -елементи в масиві є числом, можуть бути цілими числами, а можуть бути і не (таким чином, не радіо-сортування) - число k не відомо на етапі попередньої обробки. попередня обробка - O (n) час. функція (знайти k найменших елементів) на час O (k).


4
Як щодо використання міні-купи?
Шир

1
Подивіться на k-skyband та top-k обчислення. У статті cs.sfu.ca/~jpei/publications/subsky_tkde07.pdf є хороший огляд відповідної літератури.
Андраш Саламон

1
Шир-я вивчив ідею міні-купи. однак для того, щоб надрукувати k найменших цифр у хв купі - це час (O), а не O (k), як потрібно
Ідан,

4
@idannik: Чому ви думаєте , що потрібно часу , щоб знайти найменші елементи в хв купі? kΩ(klogn)k
Крістофер Арнсфельт Хансен

8
Я не думаю, що це дослідницький рівень. Це схоже на доручення. Де ти його знайшов?
Каве

Відповіді:


24

Попередньо обробити масив значень за час :O ( n )nO(n)

  • in
  • аi>2
    • Обчислити медіану з під часA [ 1 .. i ] O ( i )mA[1..i]O(i)
    • розділ на та одночасно.A [ 1 .. i / 2 - 1 ] m A [ i / 2 + 1 .. i ] mA[1..i]A[1..i/21]mA[i/2+1..i]m
    • ii/2

Загальний час попереднього обчислення знаходиться в межахO(1+2+4+...+n)O(n)

Відповідь на запит для найменших елементів в в часі :A O ( k )kAO(k)

  • llog2k
  • виберіть -й елемент з в часіx A [ 2 л . .2 l + 1 ] O ( 2 l ) O ( k )(k2l)xA[2l..2l+1]O(2l)O(k)
  • розділ на в той же часхA[2l..2l+1]x

кA[1..k] містить найменших елементів.k

Список літератури:

  • У 1999 році Дор і Цвік дали алгоритм для обчислення медіани елементів у часі протягом , що дає алгоритм для вибору го елемента з невпорядкованих елементів у менш ніж порівнянь.2.942 n + o ( n ) k n 6 nn2.942n+o(n)kn6n

1
Я думаю, що зовнішня петля повинна бути 'для i в '. Чи відрізняється ваш алгоритм від відповіді Юваля Філімуса? {2lgn,,4,2,1}
Раду ГРИГоре

2
Це узагальнення мого алгоритму до довільної . У ньому також викладені деякі деталі реалізації, які (навмисно) були залишені з моєї відповіді. n
Yuval Filmus

3
@YuvalFilmus Чи хочете ви сказати своїм коментарем, що моя відповідь неетично близька до вашої? Це рішення, яке прийшло в голову, коли я переглядав питання. Я бачив, що ви розмістили подібний, але виявив це незрозумілим, тому написав своє (на відміну від головного редагування вашого). У кінцевому рахунку важливою є якість відповідей у ​​системах, а не насправді хто їх написав: значки та репутація - це лише стимули, а не цілі самі по собі.
Джеремі

4
@Jeremy Зовсім не; Просто те, що два рішення однакові (але ваші роботи для довільної ), і що я не деталізував деталі на випадок, якщо це насправді питання домашнього завдання. n
Yuval Filmus

2
О :( Вибачте з цього приводу. (Хоча я все ще думаю, що надання повних відповідей буде пріоритетним перед підозрами на призначення)
Джеремі

14

Припустимо для простоти, що . Використовуйте алгоритм лінійного вибору часу для пошуку елементів у позиціях ; це займає лінійний час. Дано , знайдіть таким, що ; зауважимо, що . Відфільтруйте всі елементи рангу щонайбільше , а тепер використовуйте алгоритм лінійного вибору часу, щоб знайти елемент у положенні в часі .n=2m2m1,2m2,2m3,,1kt2t1k2t2t2k2tkO(2t)=O(k)

Пояснення: Може здатися, що попередня обробка потребує часу , і це дійсно так, якщо ви не обережні. Ось як зробити попередню обробку в лінійний час:Θ(nlogn)

while n > 0:
  find the (lower) median m of A[0..n-1]
  partition A in-place so that A[n/2-1] = m
  n = n/2

Перегородка на місці виконується, як у швидкості. Час виконання лінійно в і так лінійно. Зрештою, масив задовольняє наступним властивістю: для кожного , складається з найменших елементів.n+n/2+n/4++1<2nAkA[0..n/2k1]n/2k


1
Природно. Якщо масив відсортований, ви можете вирішити це в без попередньої обробки. Можливо, ви не знаєте алгоритму лінійного вибору часу, який може знайти й найбільший елемент за час ? O(1)kO(n)
Yuval Filmus

4
@Yuval Filmus: Ви не запускаєте алгоритм разів протягом загальної кількості кроків? Або ти мав на увазі якесь переплетення? lognnlogn
Андрас Саламон

3
@ AndrásSalamon: Якщо ви читаєте відповідь, яку дав Джеремі (який мені здається майже таким же, як цей), ви бачите, що спочатку обробляєте весь масив, потім першу половину тощо.
Раду ГРИГоре

3
@ AndrásSalamon Radu правильний. Коли ви знайдете медіану, ви розділите масив (на місці) на його нижню та верхню половину, а потім повторно на нижній половині. Тоді час роботи пропорційний . n+n/2+n/4++1<2n
Yuval Filmus

5
До речі, цей алгоритм з'являється як підпрограма в моїй відповіді на попереднє запитання: cstheory.stackexchange.com/questions/17378/…
Девід

2

Спочатку використовуйте для побудови міні-купи. Відомо, що ми можемо використовувати для пошуку найменших елементів у хв-купі:O(n)O(k)k

Фредеріксон, Грег Н. , Оптимальний алгоритм відбору в хвіст , Інф. Обчислення. 104, № 2, 197-214 (1993). ZBL0818.68065 ..


1
Я не бачу, як ми можемо витягти найменші елементи з міні-купи за час , оскільки видалення кожного елемента займає логарифмічний час у розмірі купи. Чи можете ви пояснити, що ви тут мали на увазі? Дякую! O ( k )kO(k)
a3nm

@ a3nm Це дійсно не простий алгоритм, але я оновив посилання.
hqztrue

До жаль, наскільки я можу сказати , посилання , що ви додали тільки говорить про вибір -го найменшого елемента (тобто, один елемент, а НЕ найменші елементи) в часі . Я не бачу , як це буде адаптуватися до витягуючи найменших елементів. Чи можете ви пояснити чи оновити посилання? k O ( k ) kkkO(k)k
a3nm

@ a3nm так, посилання дає лише -й найменший елемент . Однак, знаючи це, ви можете просто виконати dfs в купі, щоб знайти всі елементи в . x < x O ( k )kx<xO(k)
hqztrue

Вибачте, я не бачу, який DFS ви б виконали, щоб знайти ці елементи? (Деякі з них можуть не бути предками -го найменшого елемента в купі, тобто, наскільки я можу сказати, розміщуючи, наприклад, -й елемент, знаючи положення -го елемента, не є тривіальним .)k / 2 kkk/2k
a3nm

0

Використовуйте лінійний підбір часу, щоб знайти й найбільший елемент, а потім зробіть крок розділу з quicksort, використовуючи й найбільший елемент як опорний.kkk


1
В оригінальному запитанні йдеться про те, що невідомо під час попередньої обробки ....k
Джеремі

2
Я бачу. Моя помилка.
jbapple
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.