Чи можна вирішити унікальність елемента в детермінований лінійний час?


9

Розглянемо наступну проблему:

Введення : списки цілих чиселX,Y

Мета : визначити, чи існує ціле число яке є в обох списках.x

Припустимо, обидва списки мають розмір . Чи існує детермінований алгоритм лінійного часу для цієї проблеми? Іншими словами, чи можете ви вирішити цю проблему за час детерміновано, не використовуючи випадковості?X,YnO(n)

На жаль, ви не можете припустити, що всі елементи списку невеликі.


Я бачу, як вирішити це в очікуваний час використовуючи рандомізований алгоритм: випадковим чином вибирати 2-універсальну хеш-функцію , зберігати елементи у хешблет (використовуючи як хеш-функцію), а потім шукати вгору кожен елемент щоб побачити, чи є він у хештилі. Очікуваний час роботи буде . Однак я не можу зрозуміти, як знайти детермінований алгоритм із часом виконання . Якщо ви спробуєте дерандомізовувати це та виправити одну конкретну хеш-функцію, існуватиме найгірший вхід, який спричиняє запуск цієї процедури вO(n)hXhYO(n)O(n)Θ(n2)час. Найкращий детермінований алгоритм, який я можу знайти, включає сортування значень, але це не буде лінійним часом. Чи можемо ми досягти лінійного часу роботи?

Крім того, я бачу, як вирішити це в лінійний час, якщо припустити, що всі елементи списку є цілими числами в діапазоні (в основному, підрахунок сортування) - але мене цікавить, що відбувається в цілому випадок, коли ми цього не можемо припустити.[1,n]

Якщо відповідь залежить від моделі обчислення, модель оперативної пам’яті стрибає на розум, але мені будуть цікаві результати для будь-якої розумної моделі обчислення. Мені відомі нижчі межі для алгоритмів дерева рішень для унікальності елементів , але це не є остаточним, оскільки іноді ми можемо знайти алгоритми лінійного часу, навіть коли є пов'язані в моделі дерева рішень.Ω(nlogn) Ω(nlogn)


Хешшюти - це O (n log n), оскільки вам потрібно впоратися зіткненнями.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen, я не бачу, звідки ти це отримуєш. Використання 2-універсальних хеш-функцій та хеш-таблиці відповідного розміру гарантує, що кількість зіткнень хешу є мінімальним (з високою ймовірністю), тому я вважаю, що час роботи досягається. Я не впевнений, звідки у вас ; якщо ви не зробите щось особливе (наприклад, використання 2-універсального хешування), найгірший випадок - через зіткнення. O(n)O(nlgn)O(n2)
DW

Чорт у деталях, тут "хеш-таблиця відповідного розміру". Це може виявитися досить великим, якщо ви не хочете зіткнень. Типовий n-log-n - це (якщо я пам'ятаю правильно) для обробки зіткнень хеш-функції зі списком.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen Очікувана кількість відображень ключів на одну і ту ж адресу є постійною (для таблиць, які не перевантажені), тому вид розв'язання зіткнення не має значення. Дивіться також тут . відповідає найгіршому випадку, якщо ви використовуєте (зовнішні) врівноважені BST замість списків. O(nlogn)
Рафаель

Відповіді:


1

Ви можете вирішити проблему в лінійний час, якщо у вас достатньо пам'яті, щоб мати трохи для кожного можливого значення в X та Y. Це не накладає жодних обмежень на впорядкування X і Y.

  1. Спочатку всі біти не встановлені.
  2. Ітерація через X, встановивши відповідний біт.
  3. Ітерація над Y перевіряє, чи відповідний біт встановлений вище.

2
На жаль, ви не можете припустити, що всі цілі числа малі (ви не можете припустити, що вони досить малі, щоб цей алгоритм працював). У загальному випадку час роботи цього алгоритму буде експоненціальним у бітовій довжині елементів списку. Дякую, хоча!
DW

Давайте тоді назвемо це "бітовий масив відповідного розміру". Також лінійна в бітовій довжині еквівалентна log-n. Ви серйозно ставитесь до отримання продуктивності реєстрації без будь-яких обмежень чи передумов щодо вхідних даних?
Thorbjørn Ravn Andersen

2
@ ThorbjørnRavnAndersen Простір експоненціальний у бітовій довжині (потрібно зіставити зі всіх можливих значень), а час є лінійним у загальному розмірі списку (потрібно переглянути всі значення в обох списках). Ніщо не є лінійним в бітовій довжині.
wchargin

0

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


4
Це працює лише в тому випадку, якщо є обмежена величина чисел.
Люк Матхісон

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

Що робити, якщо одне з чисел дорівнює 2 ^ (2 ^ 128)?
miniBill

@anirudh, але тоді у вас є інший алгоритм для різних розмірів вводу - вам потрібно щоразу збільшувати алфавіт, коли ви збільшуєте радіус, ви просто експортуєте складність збільшення масштабу для збільшення розміру алфавіту. Звичайно, це можливо також і в теорії, я не думаю, що багато обладнання дозволяє вам змінювати, в якій базі він представляє числа (ми можемо робити вигляд на кінці входу та виводу, але це зводиться до (переважно) двійкових ).
Люк Матхісон

0

Чому б не вставити цілі числа кожного списку в просту побітну трійку? Чи це не було б оптимальним, у тому сенсі, що це , де - середній розмір бітів цілих чисел; конкретно, я не бачу, як можна зробити краще, так як просто * читання * двох списків зайняло б цю кількість часу.O(nm¯)m¯


Дякуємо за вашу замітку. Дивіться останній абзац питання, який стосується цієї точки. У моделі ОЗУ ви можете прочитати два списки за час - це не потребує часу . Ось тут і входить модель обчислення - ця відповідь насправді не доводить, що детермінований лінійний час неможливий. O(n)O(n\overbarm)
DW

@DW У моделі оперативної пам’яті є розмір слова який є постійною, і він обмежує і, таким чином, також , що призводить до виконання , або am Я помилився? wmm¯O(n)
Realz Slaw

Хм, можливо, враховуючи, що константа є помилкою. w
Realz Slaw

( не вважається постійним, але залежить від : ви можете мати його будь-яку константу, кратну від того, що необхідно представляти (достатньо широке, щоб представляти ), просто не довільно велике.)wnmnnm
сіра борода

-1

Це схоже на проблему унікальності Elemet, де у вас є набір n чисел і ви хочете визначити, чи всі елементи відрізняються. Проблема має алгебраїчне дерево обчислень нижньої межі .O(nlogn)


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

1
Ви маєте на увазі ? Якщо це так, це може означати, що проблему в питанні не можна вирішити за лінійний час. Але саме те, що відповідна проблема може бути вирішена в лінійному часовому режимі, насправді не відповідає на питання. (cc @EvilJS)Ω(nlogn)
Девід Річербі

1
Дякуємо за вашу замітку. Цікаво, чи ви пропустили останнє речення питання. Я повторю це тут: «Я знаю про цеΩ(nlogn) нижні межі алгоритмів дерева рішень для унікальності елементів , але це не є остаточним, оскільки іноді ми можемо знайти алгоритми лінійного часу, навіть коли єΩ(nlogn)"Іншими словами, ця відповідь не відповідає на запитання; вона просто повторює щось, про що я вже говорила у відомому мені питанні, але яке не вирішує питання.
DW

Це можна зробити в O(nloglogn) час, який краще, ніж дано O(nlogn), тож я впевнений, що цього не було Ω(nlogn), але це не вирішує питання DW. Тож просто коментуйте тут.
Зло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.