Передумови: Чао Сю кілька разів тому опублікував таке запитання: " Чи існують відомі алгоритми сортування порівняння, які не зводяться до сортування мереж, таким чином, щоб кожен елемент порівнювався з разів? ". Здається, ми трохи застрягли в проблемі; Я обговорював ту саму проблему з Валентином Поліщуком у 2009 році, і ми нікуди не дійшли.
Щоб отримати кілька свіжих ідей, я спробував підійти до найпростішого можливого питання, яке має схожий аромат і не зовсім банальне. Звідси наступне питання.
Питання: Вам надано два відсортовані списки, у кожному з яких є елементів. Чи можете ви об'єднати списки так, щоб кожен елемент порівнювався лише O ( 1 ) разів?
Природно, вихід повинен бути відсортованим списком, який містить усі елементів.
[Це виявилося тривіально, відповідь - "ні".]
Запитання 2: Вам надано два відсортовані списки, у кожному з яких є елементів. Чи можете ви об'єднати списки так, щоб кожен елемент порівнювався лише O ( 1 ) разів, якщо вам дозволяється відкинути невелику частину елементів ?
Точніше, вихід повинен бути відсортованим списком, який містить елементів, і "смітником", який містить T ( n ) елементів. Наскільки мало ви можете скласти значення T ( n ) ? Отримання T ( n ) = n тривіально. Щось на зразок T ( n ) = n / 100 повинно бути виконано прямо. Але чи можна отримати T ( n ) = o ( n ?
Примітки:
Тут ми використовуємо модель порівняння. Тільки з детермінованими алгоритмами нас цікавлять найгірші гарантії.
Зауважте, що обидва списки мають рівно елементів. Якщо у нас був один список з n елементами та інший з 1 елементом, відповідь явно «ні»; однак, якщо обидва списки довгі, здається, що можна було б зробити «балансування навантаження».
Цього разу будь-який алгоритм дійсний. Якщо ваш алгоритм використовує сортування мереж як складовий блок, це цілком добре.
Для початку, ось простий алгоритм, який порівнює кожен елемент щонайменше у 200 разів: Просто використовуйте стандартний алгоритм злиття, але підтримуйте лічильники для заголовків списків. Як тільки ви досягнете 200, відкиньте елемент. Тепер для кожного викинутого елемента ви успішно розмістили 200 елементів у вихідному масиві. Отже, ви досягли .