Що таке хороший алгоритм сортування спеціального випадку?


13

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

  • 1 2 3
  • 4 6 7
  • 5 8 9

Чи можу я вдосконалитись на наївному сортуванні для сортування всього набору даних лінійно (як виміряно порівняннями)?

Що з наборами даних? Відомі довільні кінцеві набори даних із набором порівнянь?


1
Чи можете ви задати більш точне запитання? Ваш перший абзац можна прочитати, щоб зрозуміти, що ваші дані вже відсортовані! Який саме ваш внесок і який результат ви бажаєте?
Жак Карет

1
Так, мова трохи заплутана. Мені знадобилось певний час, щоб зрозуміти, що набір даних складається з n чисел, які потрібно сортувати, але ці числа розташовані в сітці sqrt (n) x sqrt (n), так що кожен рядок і кожен стовпець вже відсортовані. Це ви мали на увазі?

Так, це я мав на увазі. Я відредагую для наочності.
Захарій Ванс

Відповіді:


19

Доказати нижню межу Ω (n 2 log n) на цій проблемі (у моделі порівняння порівняння) легко : якщо елемент у положенні (i, j) завжди знаходиться на відстані 1/2 від i + j, то сітка діагоналі не залежать одна від одної, і відсортований порядок у межах кожної діагоналі сітки є довільним. Отже, за цим обмеженням можлива загальна кількість впорядкованих добутків (по всіх діагоналях сітки) факторіалів довжин діагоналей, яка є експоненціальною в n 2 log n.

Що означає, що стандартні алгоритми сортування порівняння є асимптотично оптимальними для сіток, упорядкованих, як ви описуєте.


Інша відповідь дає чіткий алгоритм з такою складністю, тому я вважаю цю проблему вирішеною для 2-D сіток і, не перевіряючи насправді, ймовірно для сіток довільних розмірів.
Захарій Ванс

4

Якщо я правильно розумію проблему (а я цього не можу, не соромтеся сказати мені, якщо я цього не робите), ви хочете перетворити 2D сітку в відсортований 1D масив, тоді як кожен рядок і стовпець вже відсортовані в 2D сітці?

Першим елементом у списку в цьому випадку повинен бути верхній лівий кут ((0,0) за визначенням проблеми). Після цього він повинен бути або (1,0), або (0,1), оскільки всі інші будуть більшими за них за визначенням.

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

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

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

EDIT: Для таких сіток, як я вважаю, застосовується той самий основний принцип, але кожна ітерація складає до n нових кандидатів, і ці кандидати повинні бути найменшими невикористаними елементами у кожному з n вимірів у цей момент.


Коротше кажучи, ви можете зробити sqrt (N) -way злиття, як у mergesort? Це був мій найкращий метод запуску, але виявляється, що це O (N log N) - у мене немає точної константи там, але є 0,5 принаймні для журналу (sqrt (N)).
Захарій Ванс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.