Злиття списків крихких предметів


19

Передумови: Чао Сю кілька разів тому опублікував таке запитання: " Чи існують відомі алгоритми сортування порівняння, які не зводяться до сортування мереж, таким чином, щоб кожен елемент порівнювався з разів?О(журналн) ". Здається, ми трохи застрягли в проблемі; Я обговорював ту саму проблему з Валентином Поліщуком у 2009 році, і ми нікуди не дійшли.

Щоб отримати кілька свіжих ідей, я спробував підійти до найпростішого можливого питання, яке має схожий аромат і не зовсім банальне. Звідси наступне питання.


Питання: Вам надано два відсортовані списки, у кожному з яких є елементів. Чи можете ви об'єднати списки так, щоб кожен елемент порівнювався лише O ( 1 ) разів?нО(1)

Природно, вихід повинен бути відсортованим списком, який містить усі елементів.2н

[Це виявилося тривіально, відповідь - "ні".]


Запитання 2: Вам надано два відсортовані списки, у кожному з яких є елементів. Чи можете ви об'єднати списки так, щоб кожен елемент порівнювався лише O ( 1 ) разів, якщо вам дозволяється відкинути невелику частину елементів ?нО(1)

Точніше, вихід повинен бути відсортованим списком, який містить елементів, і "смітником", який містить T ( n ) елементів. Наскільки мало ви можете скласти значення T ( n ) ? Отримання T ( n ) = n тривіально. Щось на зразок T ( n ) = n / 100 повинно бути виконано прямо. Але чи можна отримати T ( n ) = o ( n2н-Т(н)Т(н)Т(н)Т(н)=нТ(н)=н/100 ?Т(н)=о(н)


Примітки:

  • Тут ми використовуємо модель порівняння. Тільки з детермінованими алгоритмами нас цікавлять найгірші гарантії.

  • Зауважте, що обидва списки мають рівно елементів. Якщо у нас був один список з n елементами та інший з 1 елементом, відповідь явно «ні»; однак, якщо обидва списки довгі, здається, що можна було б зробити «балансування навантаження».нн1

  • Цього разу будь-який алгоритм дійсний. Якщо ваш алгоритм використовує сортування мереж як складовий блок, це цілком добре.

  • Для початку, ось простий алгоритм, який порівнює кожен елемент щонайменше у 200 разів: Просто використовуйте стандартний алгоритм злиття, але підтримуйте лічильники для заголовків списків. Як тільки ви досягнете 200, відкиньте елемент. Тепер для кожного викинутого елемента ви успішно розмістили 200 елементів у вихідному масиві. Отже, ви досягли .Т(н)=н/100


8
Ви сказали, що "Якби у нас був один список з n елементами та інший з 1 елементом, відповідь явно ні". Чи не так з n елементами в кожному списку є загальнішою проблемою? Наприклад, якщо нам обіцяють, що всі елементи у другому списку, окрім першого, значно більші, ніж усі елементи першого списку, чи не зводиться це до першої проблеми?
Робін Котарі

@Robin: Правильно, тому мені не вдалося придумати нетривіальне питання, дякую. Наче ваше спостереження дає нижню межу якщо ми наполягаємо на сортуванні всіх елементів. Дозвольте мені трохи доповнити питання ...Ω(журналн)
Jukka Suomela

І якщо хтось замислюється, у чому сенс здається дивним визначенням у питанні 2: якщо ми можемо зробити дуже малим, можливо, ми могли б використати щось на зразок злиття, щоб майже вирішити первісну проблему, і хвилюватися з приводу крихітної частки елементів у кошику пізніше. Т(н)
Jukka Suomela

Відповіді:


5

Ні, такий алгоритм не може існувати.

Припустимо, порівнювати один елемент.т

2т2т+1т+1

нн/2тн/2т

to(n)

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

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