Сортировка в информатике против сортировки в «реальном» мире

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

РЕДАКТИРОВАТЬ: Я неправильно понял механизм центрифуги, и, похоже, он выполняет сравнение, причем массово-параллельное. Однако существуют физические процессы, которые работают со свойством сортируемой сущности, а не сравнивают два свойства. Этот ответ касается алгоритмов такого рода.

Центрифуга применяет механизм сортировки, который на самом деле работает не путем сравнения элементов, а на основе свойства («центробежная сила») каждого отдельного элемента в отдельности. Некоторые алгоритмы сортировки относятся к этой теме, особенно Radix Sort . При распараллеливании этого алгоритма сортировки он должен приближаться к примеру центрифуги.

Некоторые другие алгоритмы несравнительной сортировки - это сортировка по сегментам и сортировка с подсчетом . Вы можете обнаружить, что сортировка Bucket также вписывается в общую идею центрифуги (радиус может соответствовать бункеру).

Еще один так называемый «алгоритм сортировки», в котором каждый элемент рассматривается изолированно, - это спящая сортировка . Здесь время, а не центробежная сила, действует как величина, используемая для сортировки.

user1952500
источник
На самом деле это правильный ответ - сортировка по ячейкам / сортировка по основанию имеет сложность O (n) при условии, что к ячейкам и входным данным можно получить доступ за время O (1).
pjc50
5
Я собирался спросить: «Кто-нибудь еще сразу подумает о сортировке по сну?».
Вроде
Центрифуги работают, сравнивая элементы; хеш-функция - это (в первую очередь) плотность. Например, если вы центрифугируете смесь пропана и воздуха, вы получите пропан, отсортированный до границ; но если вы центрифугируете пропан и воду, вы получите пропан, отсортированный по центру (вода более плотная). Этот процесс почти полностью совпадает с физическим процессом, в честь которого была названа «пузырьковая сортировка».
Nat
Разве сложность SleepSort не зависит от планировщика?
Morwenn
@Morwenn старый планировщик Linux был O (1), а новый - O (log n). Оба эти фактора перевешиваются постоянными факторами сна
user1952500
35

Вычислительная сложность всегда определяется относительно некоторой вычислительной модели. Например, алгоритм, который O ( n ) на типичном компьютере, может быть O (2 n ), если он реализован в Brainfuck .

Вычислительная модель центрифуги обладает некоторыми интересными свойствами; например:

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

Учитывая, что у нас нет возможности реализовать что-то подобное в вычислительном оборудовании общего назначения, модель может не иметь практического значения; но его все же стоит изучить, чтобы увидеть, можно ли из него чему-нибудь научиться. Например, недетерминированные алгоритмы и квантовые алгоритмы были активными областями исследований, хотя ни один из них фактически не реализуем сегодня.

руах
источник
Природа / физика в целом параллельны (поэтому моделирование на наших последовательных компьютерах так дорого с вычислительной точки зрения), так что да, аналогия с OP имеет серьезный недостаток. Тем не менее, частицам / молекулам требуется время, чтобы двигаться по длине пробирки или чего-то еще, поэтому более длинная пробирка означает больше работы на нить, а более широкая пробирка - больше параллельности. (И обратите внимание, что центрифуга не выполняет сортировку по площади пробирки, поэтому существует множество параллельных сортировок без слияния, но, возможно, с некоторым взаимодействием по пути. В отличие от реальной сортировки на параллельном компьютере с окончательным слиянием)
Питер Кордес
29

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

Обдумайте вопрос: «Как долго вы должны эксплуатировать центрифугу?»
Если вы запускали его только в течение пикосекунды, ваша выборка может быть менее отсортирована, чем исходное состояние ... или если вы запускали ее в течение нескольких дней, она может быть полностью отсортирована. Однако вы бы не узнали, не проверив содержимое.

ti7
источник
Это очень хороший аргумент. Откуда вы знаете? С другой стороны, если существующие правила достаточно хороши, вы бы хотели знать? (например, если вы сделаете вероятность настолько низкой, что она станет незначительной).
Крис
Вы всегда можете рассчитать, сколько времени потребуется, чтобы частица достигла конца центрифуги. Вы знаете ускорение (w ^ 2 * r, где w - угловая скорость) и можете рассчитать время.
user1952500
1
Верно, но поскольку это противоречит броуновскому движению , другим атомным силам и квантовой физике (спасибо, мелочи!), Вы все равно не можете быть полностью уверены, что отсортировали свой список, пока не проверите состояние.
ti7
1
Если у вас нет очень маленьких частиц, вы можете игнорировать квантовые эффекты. Если у вас очень маленькие частицы, алгоритм сортировки не обязательно должен работать, и на самом деле вы не можете полагаться на его работу из-за квантовых эффектов. И вы не можете надежно проверить состояние из-за принципа неопределенности (проверка одной частицы приведет к перемещению других частиц).
user1952500
1
@Kris Ну, мы знаем, что центрифуга плохо сортирует. Мы просто продолжаем делать это до тех пор, пока разница не перестанет иметь значение для практических целей - например, для предотвращения свертывания крови в вашей центрифуге для крови. Но посмотрите на урановые центрифуги - они должны сортировать предметы, которые намного «ближе» (их труднее отделить), и требуют огромного оборудования, которое продолжает сортировку снова и снова с огромными затратами для получения крошечных количеств желаемого материала. И центрифуга имеет определенный размер, и время разделения пропорционально ширине пробирок, и ... Вы не можете просто сказать O (n), ура!
Luaan
5

Реальным примером компьютерного «упорядочивания» могут быть автономные дроны, которые совместно работают друг с другом, известные как «рой дронов». Дроны действуют и общаются как по отдельности, так и в группе, и могут отслеживать несколько целей. Дроны коллективно решают, какие дроны будут следовать за какими целями, и очевидную необходимость избегать столкновений между дронами. Ранними версиями этого были дроны, которые двигались через точки пути, оставаясь в строю, но построение могло меняться.

Для «сортировки» дроны можно запрограммировать так, чтобы они формировали линию или узор в определенном порядке, первоначально выпускались в любой перестановке или форме, а вместе и параллельно они быстро формировали упорядоченную линию или узор.

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

знать положение каждого элемента

В случае сортировки на ленте положение каждого элемента (записи) «известно» только «ленте», но не компьютеру. Сортировка на основе ленты должна работать только с двумя элементами одновременно и иметь способ обозначения границ прогона на ленте (метка файла или запись другого размера).

rcgldr
источник
4

IMHO, люди задумываются log (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
@ Крис Не совсем так. Если у физического процессора есть k элементов, он может достичь параллельности не более O (k). Если вы обрабатываете n чисел произвольно, он все равно будет обрабатывать их со скоростью, связанной с k. Также вы можете сформулировать эту задачу физически. Вы можете создать n стальных шариков с весом, пропорциональным числу, которое вы хотите закодировать, что теоретически можно решить с помощью центрифуги. Но здесь количество используемых атомов пропорционально n. Тогда как в стандартном случае у вас ограниченное количество атомов в процессоре.
ElKamina
Применяется ли это ограничение также к объектам QM? Просто из любопытства
Крис
1
@Kris Я не понимаю QM достаточно глубоко, чтобы ответить на него.
ElKamina
Без проблем! Мне просто очень любопытно, и я не могу уснуть, ха-ха. Спасибо за интересные ответы.
Крис
4

Я работал в офисе летом после школы, когда поступил в колледж. Я изучал AP Computer Science, среди прочего, сортировку и поиск .

Я применил эти знания в нескольких физических системах, которые могу вспомнить:

Начало естественной сортировки слиянием…

Система печатала многоэкземплярные формы, включая отрывок размером с карточку, который нужно было хранить в ящиках.

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

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

… Сортировка вставкой до завершения

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

Radix sort

Этого никто не понимал, как я сделал это так быстро, несмотря на неоднократные попытки научить его.

Большой ящик корешков чеков (размер перфокарт) необходимо отсортировать. Это похоже на раскладывание пасьянса на большом столе - раздайте, складывайте, повторяйте.

В общем

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

Выход за рамки понятных эквивалентов

Я вспоминаю эссе на вашу тему, и в нем говорилось о спагетти . Вы обрезаете кусок сушеной лапши, чтобы указать значение ключа, и маркируете его идентификатором записи. Это O (n), простая обработка каждого элемента один раз.

Затем вы берете сверток и ударяете одним концом о стол. Они выровнены по нижним краям, и теперь они отсортированы. Можно банально снять самый длинный и повторить. Считывание также O (n).

Здесь, в «реальном мире», происходят две вещи, не соответствующие алгоритмам. Во-первых, выравнивание краев - это параллельная операция. Каждый элемент данных также является процессором (к нему применяются законы физики). Итак, как правило, вы масштабируете доступную обработку с помощью n, по существу разделяя классическую сложность на коэффициент n.

Во-вторых, как выравнивание краев выполняет сортировку? Реальная сортировка в считанного , который позволяет найти самый длинный в один шаг, даже если вы ничего сравнить все из них , чтобы найти самый длинный. Снова разделите на множитель n, чтобы найти наибольшее значение теперь O (1).

Другой пример - использование аналоговых вычислений: физическая модель решает проблему «мгновенно», а подготовительная работа - O (n). В принципе, вычисление масштабируется с учетом количества взаимодействующих компонентов, а не количества подготовленных элементов. Таким образом, вычисление масштабируется с n². Пример, о котором я думаю, - это взвешенное многофакторное вычисление, которое было выполнено путем просверливания отверстий на карте, подвешивания гирь на струнах, проходящих через отверстия, и сбора всех струн на кольце.

JDługosz
источник
Сорт спагетти было забавным чтением. Мне понравилось думать об этом, но я критикую сканирование самой длинной лапши. На самом деле это не операция O (1), поскольку вы сканируете лапшу. Представьте себе десять тысяч макаронных изделий и несколько одинаковых по длине ... это не операция O (1) "на глазок". На самом деле нужно сканировать всю несортированную лапшу, чтобы найти самую длинную.
ThisClark
Вы можете «просканировать» всю лапшу, положив ладонь на весь пучок и оторвав одну самую высокую лапшу, которая соприкасается с вашей рукой. Если лапша очень близка по длине, возьмите самую высокую лапшу более точной «рукой». Лапша не выбирается последовательно, как при сортировке по выбору, они выбираются все сразу, поэтому имеется O (n) «вычислительная» мощность.
Брэд Сонье
1
@ThisClark, вам нужно более точное приспособление: плоская плоскость, параллельная упору на дне, которая выравнивает лапшу. Осторожно опустите его, пока одна лапша (самая высокая) не коснется и не подвергнется сжатию. Сравнение высоты плоскости относительно каждой лапши выполняется параллельно с помощью этой лапши. Вы предполагаете, что необходим более высокий коэффициент, но этот аргумент не меняет большого значения.
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) в длине самой длинной пряди. Так что ничего не дается бесплатно.

eac2222
источник
То же самое я сказал 11 часами ранее. И я продолжил объяснять, как физические системы позволяют вам делить на n или на n² и сохранять модель алгоритмов и вычислений.
JDługosz
0

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

  • Пробирки должны становиться все длиннее и длиннее.
  • Тяжелые вещи должны продвигаться все дальше и дальше, чтобы добраться до дна.
  • Момент инерции увеличивается, требуется больше мощности и больше времени для разгона до скорости сортировки.

Стоит учесть и другие проблемы с сортировкой центрифуг. Например, вы можете работать только с узкой шкалой размеров. Алгоритм компьютерной сортировки может обрабатывать целые числа от 1 до 2 ^ 1024 и более, без проблем. Поместите что-то, что весит 2 ^ 1024 раз больше, чем атом водорода, в центрифугу, и, ну, это черная дыра, и галактика была разрушена. Алгоритм не удался.

Конечно, настоящий ответ здесь заключается в том, что вычислительная сложность связана с некоторой вычислительной моделью, как упоминалось в другом ответе. И «центрифужная сортировка» не имеет смысла в контексте обычных вычислительных моделей, таких как модель RAM, модель ввода-вывода или многолентые машины Тьюринга.

Крэйг Гидни
источник