Сортування в галузі комп’ютерних наук проти сортування у „реальному” світі


87

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

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

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

Чи можна було б із накладними витратами на кожному вузлі (якесь значення або метод, прикріплений до кожного з вузлів) "примусити" порядок списку? Щось на зразок центрифуги, де лише кожен елемент дбає про своє взаємне розташування в просторі (по відношенню до інших вузлів). Або це порушує якесь правило обчислень?

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

Можливо, класичні комп'ютери за своєю суттю обмежують сортування в області O(nlogn), де як квантові комп'ютери можуть переходити цей поріг в O(logn)алгоритми, які діють паралельно.

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

Я думаю, наступна думка полягає в тому, що якщо природа може сортувати O(n), чому не можуть комп’ютери?


44
Центрифуга - це просто паралельно реалізація сортування бульбашок, нічого хитрого.
el.pescado

3
Маючи nпроцесори (ядра) для сортування масиву лише nелементів, ви можете легко досягти O(n)складності. Гірка правда полягає в тому, що нам зазвичай доводиться сортувати довгі масиви (тисячі і мільйони елементів) на центральному процесорі лише з 2..10 ядрами.
Дмитро Биченко

24
Зверніть увагу, що n log n - це кількість порівнянь, які необхідно зробити у сортуванні, яке порівнює пари елементів . Немає вимоги, щоб алгоритм сортування порівнював пари предметів ; якщо ви можете придумати сортування, яке не виконує попарне порівняння, ви можете зробити це швидше, ніж n log n.
Ерік Ліпперт,

7
Те, чого вам не вистачає, це те, що кожна з цих молекул у розчині є процесорними одиницями. Немає емулятора, який підраховує молекули - молекули вважають себе. Аналогічний комп’ютер має стільки ядер процесора та незалежних пам’яті, скільки у вас елементів для сортування. O(n)сам по собі нічого не говорить - це корисно лише для порівняння алгоритмів з подібними обмеженнями та запуску на подібних архітектурах; на вступних курсах щодо алгоритмічної складності ми використовуємо дуже спрощену модель "комп'ютера", яка має мало спільного з центрифугами чи реальними комп'ютерами :)
Луаан,

4
Я голосую за те, щоб закрити це питання як нетематичне, оскільки воно належить cs.stackexchange.com
Роберт Фрейзер,

Відповіді:


71

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

Центрифуга застосовує механізм сортування, який насправді не працює за допомогою порівнянь між елементами, а насправді завдяки властивості (`` відцентрова сила '') для кожного окремого елемента ізольовано. Деякі алгоритми сортування потрапляють у цю тему, особливо Radix Sort . Коли цей алгоритм сортування паралелізований, він повинен підходити до прикладу центрифуги.

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

Іншим так званим `` алгоритмом сортування '', де кожен елемент розглядається окремо, є сортовий режим сну . Тут величина, яка використовується для сортування, діє не відцентрова сила, а час.


Це насправді правильна відповідь - сортування бункерів / сортування за радіусом має складність O (n) за умови, що до бункерів та вхідних даних можна отримати доступ за час O (1).
pjc50,

5
Я збирався запитати: "Хтось ще думає про сортування уві сні?".
Очевидно

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

Хіба складність SleepSort насправді не покладається на складність планувальника?
Морвенн,

@ Morwenn старий планувальник Linux був O (1), а новий O (log n). Обидва вони переважають постійні фактори сну
user1952500

35

Складність обчислень завжди визначається щодо якоїсь обчислювальної моделі. Наприклад, алгоритм, який має O ( n ) на типовому комп’ютері, може бути O (2 n ), якщо він реалізований у Brainfuck .

Розрахункова модель центрифуги має кілька цікавих властивостей; наприклад:

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

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


Природа / фізика в цілому паралельні (тому їх обчислювально дорого моделювати на наших послідовних комп'ютерах), так що так, аналогія OP має великий недолік. Однак для переміщення частинок / молекул по довжині пробірки чи будь-якого іншого процесу потрібен час, тому довша пробірка - це більше роботи на нитку, але ширша пробірка - це більший паралелізм. (І зауважте, що центрифуга не сортує по всій ділянці пробірки, тому це багато паралельних сортів без злиття, але, можливо, якась взаємодія на цьому шляху. На відміну від фактичного сортування на паралельному комп’ютері, з остаточним злиттям)
Пітер Кордес

29

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

Розгляньте питання: "Скільки часу слід запускати центрифугу?"
Якщо ви запускали його лише протягом пікосекунди, ваш зразок може бути відсортований менше, ніж початковий стан .. або якщо ви працювали протягом декількох днів, він може бути повністю відсортований. Однак ви б не знали, не перевіривши фактично вміст.


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

Ви завжди можете підрахувати, скільки часу потрібно, щоб частинка дійшла до кінця центрифуги. Ви знаєте прискорення (w ^ 2 * r, де w - кутова швидкість) і можете обчислити час.
user1952500

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

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

1
@Kris Ну, ми знаємо, що центрифуга не сортується ідеально. Ми просто продовжуємо це робити, поки різниця більше не має значення для практичних цілей - наприклад, запобігання згортанню крові у вашій центрифузі крові. Але подивіться на уранові центрифуги - їм потрібно сортувати предмети, які знаходяться набагато "ближче" (важче відокремлювати), і вимагають величезного обладнання, яке постійно сортує знову і знову і знову за величезних витрат, щоб отримати крихітні кількості потрібного матеріалу. І центрифуга має певний розмір, і час поділу пропорційний ширині пробірок, і ... Не можна просто сказати O (n), так!
Луан

5

Прикладом реального світу комп’ютерного «замовлення» можуть бути автономні безпілотники, які співпрацюють між собою, відомі як «рої дронів». Безпілотники діють і спілкуються як окремі особи, так і як група, і можуть відстежувати кілька цілей. Безпілотники колективно вирішують, які безпілотники будуть слідувати за якими цілями, і очевидна необхідність уникати зіткнень між безпілотниками. Ранні версії цього були безпілотні літальні апарати, які рухались через точки шляху, залишаючись у формуванні, але формація могла змінюватися.

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

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

знати положення кожного елемента

У разі сортування стрічки положення кожного елемента (запису) лише "відомо" "стрічці", а не комп'ютеру. Стрічкове сортування має працювати лише з двома елементами одночасно, а також спосіб позначення меж запуску на стрічці (позначка файлу або запис різного розміру).


4

ІМХО, люди переосмислюють журнал (n). O (nlog (n)) Є практично O (n). І вам потрібно O (n) просто для зчитування даних.

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

По суті всі фізичні системи нескінченно паралельні. У вас може бути скупчення атомів у піщинці, природа має достатньо обчислювальної потужності, щоб зрозуміти, де повинен знаходитися кожен електрон у кожному атомі. Отже, якщо у вас було достатньо обчислювальних ресурсів (O (n) процесорів), ви можете відсортувати n чисел за час log (n).

З коментарів:

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

  2. Інший спосіб подумати про це - скажімо, у вас до кожного номера приєднаний невеликий процесор, і кожен процесор може спілкуватися зі своїми сусідами. Ви можете сортувати всі ці числа за час O (log (n)).


Але хіба обчислення не лише це - використання фізичних властивостей природи для виконання якоїсь роботи? Я, можливо, тут переходжу до квантових обчислень, але якщо це можна зробити фізично, це повинно бути можливо і обчислювально? Можливо, класичним обчисленням є перешкода між O (nlogn) та O (logn).
Кріс,

2
@Kris Не зовсім так. Враховуючи фізичний процесор, який має k кількість елементів, він може досягти паралельності не більше O (k). Якщо ви обробляєте n чисел довільно, це все одно буде обробляти їх із швидкістю, пов'язаною з k. Крім того, ви можете сформулювати цю проблему фізично. Ви можете створити n сталевих кульок з вагами, пропорційними числу, який ви хочете закодувати, що можна теоретично вирішити центрифугою. Але тут кількість використовуваних вами атомів пропорційна n. Тоді як у стандартному випадку у вас обмежена кількість атомів у процесорі.
ElKamina

Чи застосовується це обмеження також до об'єктів управління якістю? Просто з цікавості
Кріс

1
@Kris Я не розумію ЯК настільки глибоко, щоб відповісти на нього.
ElKamina

Не хвилюйся! Мені просто дуже цікаво і здається, я не можу спати ха-ха. Дякую за цікаві відповіді.
Кріс,

4

Я працював в офісі влітку після середньої школи, коли вступив до коледжу. Я навчався в AP Computer Science, серед іншого, сортування та пошук .

Я застосував ці знання в декількох фізичних системах, які я можу згадати:

Природне злиття для початку…

Система надрукувала багаточастинні бланки, включаючи відрив розміром із картотеку, який потрібно було подати у банк комод.

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

Потім об’єднайте кожну пару стеків, створюючи більший стек. Повторюйте, поки не буде лише одного стопки.

... Сортування вставки завершено

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

Сорт Radix

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

Потрібно відсортувати велику коробку чекових заглушок (розмір перфокарт). Це схоже на гру в пасьянс на великому столі - роздавайся, складайся, повторюй.

Загалом

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

Виходячи за межі добре зрозумілих еквівалентів

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

Потім ви берете пачку і торкаєтесь одним кінцем по столу. Вони вирівнюються по нижніх краях, і тепер вони відсортовані. Можна тривіально зняти найдовший і повторити. Зчитування також становить O (n).

У „реальному світі” тут відбуваються дві речі, які не відповідають алгоритмам. По-перше, вирівнювання країв є паралельною операцією. Кожен елемент даних також є процесором (до нього застосовуються закони фізики). Отже, загалом, ви масштабуєте доступну обробку з n, фактично розділяючи вашу класичну складність на коефіцієнт на n.

По-друге, як вирівнювання країв забезпечує сортування? Реальна сортування в ліченого , який дозволяє знайти найдовший в один крок, навіть якщо ви нічого порівняти всі з них , щоб знайти найдовший. Знову ж, поділимо на коефіцієнт n, тож знаходження найбільшого зараз O (1).

Інший приклад - використання аналогових обчислень: фізична модель вирішує проблему "миттєво", а підготовча робота - O (n). В принципі обчислення масштабуються за кількістю взаємодіючих компонентів, а не за кількістю підготовлених елементів. Отже, обчислення масштабуються з n². Прикладом, про який я думаю, є зважене багатофакторне обчислення, яке було зроблено шляхом свердління отворів на карті, підвішування ваг від струн, що проходять крізь отвори, та збору всіх струн на кільці.


Сорт спагетті було веселим читанням. Мені подобалося думати про це, але я критикую дію сканування найдовшої локшини. Це насправді не є O (1) операцією, оскільки ви скануєте локшину. Уявіть собі десять тисяч локшини і кілька схожих за довжиною ... це не операція O (1) «очне яблуко». Насправді потрібно відсканувати всю сортову локшину, щоб знайти найдовшу.
ThisClark

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

1
@ThisClark вам потрібен більш точний пристрій: плоска площина, паралельна упору на дні, яка вирівнює локшину. Обережно опускайте його, доки одна локшина (найвища) не торкнеться і не буде стиснута. Порівняння висоти площині з кожної локшиною здійснюється паралельно з допомогою цієї локшини. Ви припускаєте, що потрібен вищий коефіцієнт, але цей аргумент не змінює Big-O.
JDługosz

3

Сортування все ще становить O (n) загальний час. Що це швидше, ніж через паралелізацію .

Ви можете розглядати центрифугу як відро з n атомами, розпаралелене по n ядер (кожен атом діє як процесор).

Ви можете зробити сортування швидшим за допомогою розпаралелювання, але лише за постійним коефіцієнтом, оскільки кількість процесорів обмежена, O (n / C) все ще O (n) (процесори зазвичай мають <10 ядер, а графічні процесори <6000)


2

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

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

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


1

Чи можна було б із накладними витратами на кожному вузлі (якесь значення або метод, прикріплений до кожного з вузлів) "примусити" порядок списку?

Коли ми сортуємо за допомогою комп'ютерних програм, ми вибираємо властивість сортуваних значень. Це зазвичай величина числа або алфавітний порядок.

Щось на зразок центрифуги, де лише кожен елемент дбає про своє взаємне розташування в просторі (по відношенню до інших вузлів)

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

Тож, щоб відповісти на це, чи насправді ми не робимо щось подібного у сортуванні на основі програмного забезпечення?


1
Гадаю, ти маєш рацію. Я думаю, де я втратив свою аналогію тут, це те, що я забув, що кожна молекула діє паралельно. Отже, це було б як паралельний сорт бульбашок ...
Кріс,

1

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

По-друге, ми маємо деякі можливості у комп’ютерному (логічному) світі, що майже неможливо у фізиці, наприклад, ми можемо отримати доступ до пам’яті та знаходити точне місцезнаходження кожної сутності в кожен момент часу, але у фізиці це величезна проблема принципу невизначеності Гейзенберга .

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


0

Інша перспектива полягає в тому, що те, що ви описуєте за допомогою центрифуги, є аналогічним тому, що називали "сортом спагетті" ( https://en.wikipedia.org/wiki/Spaghetti_sort ). Скажімо, у вас є коробка сирих стрижнів для спагеті різної довжини. Тримайте їх у кулаці та розпустіть руку, щоб опустити вертикально, щоб кінці лежали на горизонтальному столі. Бум! Вони сортуються за висотою. O (постійний) час. (Або O (n), якщо ви включаєте вибирання стрижнів за висотою та розміщення їх у ... стійці для спагетті, я думаю?)

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


Це те саме, що я сказав 11 годин раніше. І далі я пояснив, як фізичні системи дозволяють ділити на n або n² і зберігати модель алгоритмів та обчислень.
JDługosz

0

Поміркуйте: чи справді "сортування в центрифузі" краще масштабується? Подумайте, що відбувається під час масштабування.

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

Також варто розглянути інші проблеми з сортуванням центрифуги. Наприклад, ви можете працювати лише у вузькій шкалі розмірів. Комп’ютерний алгоритм сортування може обробляти цілі числа від 1 до 2 ^ 1024 і далі, без поту. Помістіть у центрифугу щось, що важить у 2 ^ 1024 рази більше атома водню, і, ну, це чорна діра, і галактика була зруйнована. Помилка алгоритму.

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

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