Визначення конкретної кількості за час та простір (найгірший випадок)


10

Враховуючи, що A[1..n] - цілі числа, такі, що 0A[k]m для всіх 1kn , і виникнення кожного число, крім конкретного числа в A[1..n] є непарним числом. Спробуйте знайти число, виникнення якого - парне число.

Існує алгоритм : ми сортуємо на , і розбиваємо на багато фрагментів, значення елементів яких - те саме, тому ми можемо порахувати виникнення кожного елемента.Θ(nlogn)Б [ 1 . . п ] Б [ 1 . . n ]A[1..n]B[1..n]B[1..n]

Я хочу знайти алгоритм простору у випадку -time-and- -простору.O ( n )O(n)O(n)

Припустимо, що і , отже, сортування радіації неприйнятне. Бінарні побітові операції є прийнятними, наприклад, .ϵ > 0m=Ω(n1+ϵ)ϵ>0A[1]xorA[2]


Відповідь Арябхати нижче показує, що загальний випадок не є гарним, але, можливо, у вас є додаткові обмеження? Простим (але великим) обмеженням було б встановити, що всі записи в масиві мають розмір . Це дало б досить тривіальний лінійний алгоритм. O(n)
Люк Матхісон

1
@LukeMathieson: Я видалив цю відповідь, оскільки я ще не впевнений, що цитований нами документ буде працювати без будь-яких модифікацій, і крім того, ОП, здається, цікавить лише модель RAM з однаковою вартістю.
Ар'ябхата

@Aryabhata: хе-х, ну відповідь, що тоді вже немає! З цікавого і, можливо, корисного для Френка, що, на вашу думку, було проблемою з адаптацією результату в роботі? Швидке скло запропонувало застосувати, але я, очевидно, не прочитав це.
Люк Матхісон

@LukeMathieson: Той факт, що інші елементи повинні з’являтися непарною кількістю разів у поточній проблемі. Оскільки я теж скупився над доказом ...
Ар'ябхата

Було б цікаво, якщо вас цікавлять теоретичні результати чи практичні рішення. З теоретичної точки зору, моя перша швидка відповідь полягає в тому, що ви можете сортувати список цілих чисел швидше, ніж . Існує детермінований алгоритм Хана, який працює в час. Для рандомізованих алгоритмів відомі ще кращі результати, наприклад, Han і Thorup знайшли алгоритм очікуваного часу . Однак я думаю, що ваша проблема не повинна вимагати сортування. O ( журнал журналу n ) OO(nlogn)O(loglogn)O(nloglogn)
А.Шульц

Відповіді:


2

Ось ідея для простого алгоритму; просто порахуйте всі події!

  1. Θ ( n )m=maxAΘ(n)
  2. "Виділити" масив . - час ¹O ( 1 )C[0..m]O(1)
  3. Ітерації над і збільшення на один раз, коли ви знайдете . Якщо було , додати до лінійного списку . - часC [ x ] A [ _ ] = x C [ x ] 0 x L Θ ( n )AC[x]A[_]=xC[x]0xLΘ(n)
  4. Повторіть і знайдіть елемент з . - час .x e C [ x e ] O (LxeC[xe]O(n)
  5. Повернення .xe

Загалом, це дає алгоритм лінійного часу, який може використовувати (у сенсі розподілу) багато пам'яті. Зауважимо, що можливість довільного доступу до у постійний час незалежно від має вирішальне значення.Cm

Додатковий пов'язаний з простором, складніше при такому підході; Я не знаю жодної структури даних словника, яка пропонує пошук часу . Ви можете використовувати хеш-таблиці, для яких тут є реалізації з очікуваного часу пошуку ( розмір таблиці, кількість збережених елементів), щоб ви могли отримати довільно хороший з лінійним простором - в очікуванні. Якщо всі значення відображаються на однакове хеш-значення, ви вкручуєте.O ( 1 ) O ( 1 + k / n ) n k AO(n)O(1)O(1+k/n) nkA


  1. На оперативній пам'яті це неявно робиться; все, що нам потрібно, це стартове положення, а може бути, кінцеве.

0

Майже тривіальним рішенням, яке використовує простір є використання хеш-карти. Нагадаємо, що хеш-карта амортизувала час виконання для додавання та пошуку елементів.O ( 1 )Θ(n)O(1)

Отже, ми можемо використовувати наступний алгоритм:

  1. Виділяють хеш - карту . Ітерація над . Для кожного елемента збільшуйте кількість виявлених випадків, тобто .A i A H ( i ) + +HAiAH(i)++

  2. Перегляньте через набір ключів хеш-карту і перевірте, який із клавіш має рівну кількість випадків.

Тепер це простий алгоритм, який насправді не використовує жодного великого трюку, але іноді навіть цього достатньо. Якщо ні, то, можливо, ви захочете вказати, які обмеження щодо простору ви накладаєте.


Я все одно хотів би знати, чи існує не рандомізований алгоритм часу використанням поліноміального простору. Зокрема, чи є якісь теоретичні докази того, що знайти єдиний рівномірний предмет важче, ніж знайти єдиний предмет, що має місце? O(n)
А.Шульц

@ A.Schulz Я думаю, що це алгоритм очікуваного часу за допомогою хеш-таблиці. Я пам’ятаю, що хтось сказав мені O ( n ) -алгоритм (або для якогось особливого випадку, скажімо, непарний = 1 і навіть = 2), можливо, з стеком, але я не можу його згадати. O(n)O(n)
Yai0Phah

Не кожна реалізація хештелю має цю властивість; Зазвичай пошук не є , навіть не амортизований (afaik). Насправді попереднє обговорення не дало жодної реалізації, яка б мала постійний пошук часу. Чи можете ви бути більш конкретними? O(1)
Рафаель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.