Gravity Sort: возможно ли это программно?

Недавно я подумал об использовании объектно-ориентированного дизайна в алгоритме сортировки. Однако мне не удалось найти подходящий способ даже приблизиться к созданию этого алгоритма сортировки, который выполняет сортировку за время O (n).

Хорошо, вот о чем я думал неделю. У меня есть набор исходных данных. Я назначу массу каждому из входных данных (предположим, что входные данные имеют тип Mass и тип Sphere. Если мы предположим, что все объекты будут идеально сферическими объектами с формой, пропорциональной их массе, самый тяжелый из них коснется земли первым. ). Я буду размещать все свои входные данные в космосе на одинаковом расстоянии от земли. И я заставлю их свободно падать. Согласно закону тяготения, самый тяжелый из них первым ударяется о землю. И порядок их попадания даст мне отсортированные данные. Это в некотором роде забавно, но внутри я чувствую, что это должно быть возможно с использованием объектно-ориентированного подхода, который я изучил до настоящего времени.

Действительно ли возможно создать метод сортировки, который использует сценарий гравитационного притяжения, или я глуп / сумасшедший?

Изменить: Оказывается, все объекты падают на землю одновременно, поэтому я ввел концепцию сферических объектов.


person bragboy    schedule 21.03.2010    source источник
comment
Я не физик, но в последний раз, когда я проверял, два объекта, падающие в свободном падении с одной и той же высоты в одно и то же время, одновременно ударяются о землю (при условии отсутствия сопротивления атмосферы и т. Д.).   -  person James McNellis    schedule 22.03.2010
comment
Во-первых, самый тяжелый не ударяется о землю первым. Если нет других эффектов (главным является сопротивление воздуха), все объекты будут падать с одинаковой скоростью. Но это не значит, что суть вашей идеи совершенно невыполнима.   -  person MatrixFrog    schedule 22.03.2010
comment
Автор может использовать ветер (сопротивление воздуха) и размер объекта.   -  person osgx    schedule 22.03.2010
comment
Ой, моя проблема. Если мы предположим, что все объекты являются идеально сферическими объектами, форма которых пропорциональна их массе, то самый тяжелый из них первым коснется земли.   -  person bragboy    schedule 22.03.2010
comment
@Bragadeesh: Нет. Найдите время, чтобы попробовать это: большой камень и маленький камень. Они упали на землю одновременно. Это закон (гравитации). Это не значит, что у вас не может быть программы, которая работает таким образом, но это будет немного ложью. ;)   -  person MPelletier    schedule 22.03.2010
comment
@Bragaadeesh: предметы падают с разной скоростью только при сопротивлении воздуха. Если объекты находятся в свободном падении (как вы утверждаете, что хотите моделировать), они будут падать с одинаковой скоростью, сферической или нет.   -  person Michael Petrotta    schedule 22.03.2010
comment
@Mpelletier @ Майкл. Причина, по которой я сказал, что сферические объекты находятся в космосе с центром тяжести в центре, будет иметь огромное пространство в нижней полусфере, поэтому сначала он коснется земли.   -  person bragboy    schedule 22.03.2010
comment
Кроме того, сортировка OO не позволит вам достичь времени O (n). Нет ничего лучше лучших алгоритмов сортировки, просто выполняя объектно-ориентированную сортировку.   -  person MPelletier    schedule 22.03.2010
comment
@Bragaadeesh: Интересно. Я предполагаю, что большинство экспериментаторов / учителей физики в старших классах начнут падение с основания обоих объектов в одной и той же точке над землей, но это необходимо определить.   -  person Michael Petrotta    schedule 22.03.2010
comment
@Michael Да, я думал, это подразумевалось, моя плохая   -  person bragboy    schedule 22.03.2010
comment
@Bragaadeesh: Другими словами, они не начинаются на одной высоте. Их центры выровнены, но не снизу. Выровняйте основания, и они одновременно коснутся земли. Таким образом, ваше утверждение верно только в том случае, если размер пропорционален массе, а центры выровнены. Я понимаю.   -  person MPelletier    schedule 22.03.2010
comment
С философской точки зрения теперь сортировка осуществляется не по массе, а по тому, насколько высоко дно удерживается от земли, что не совсем одно и то же. Обратите внимание, что если вы учитываете сопротивление воздуха, вы занимаетесь внешней баллистикой. Большая часть исследований компьютеров в США была проведена военно-морскими силами США, которые хотели рассчитать таблицы дальности для своих больших орудий.   -  person David Thornley    schedule 22.03.2010
comment
@MPelletier: Все еще не так. Если при отпускании их центры масс находятся на одинаковой высоте, их центры масс будут оставаться на одном уровне, пока один из них не упадет на землю. Более крупный объект первым ударится о землю.   -  person Jive Dadson    schedule 23.03.2010
comment
Я бы посоветовал не использовать сферы: я думаю, это просто сбивает с толку. Используйте вертикальные стержни. Гораздо менее сложно определить размер по массе (можно просто сказать, что они равны). К сожалению, я не думаю, что это в конечном итоге окажется полезным, но очень интересно изучить почему. Отличный вопрос.   -  person Beska    schedule 23.03.2010
comment
это выглядит как сортировка с подсчетом, которая для чисел известного (и разумного) диапазона равна O (n). Но у него не так много практических приложений.   -  person Michael Haren    schedule 23.03.2010
comment
Почему бы не рассматривать их как твердые сферы одного радиуса, но разной плотности?   -  person Drew Hall    schedule 23.03.2010
comment
Потому что, если у них одинаковый радиус, они одновременно упадут на землю :)   -  person Matthieu M.    schedule 23.03.2010
comment
вздох, пожалуйста, Google Галилео. Это не имеет ничего общего с концепцией сферического объекта, это имеет отношение ко всем концепциям гравитации и массы. Буквально каждый на земле должен выучить это в средней школе.   -  person RBarryYoung    schedule 27.03.2010
comment
@ Джеймс Макнилс (и вообще все остальные): Если их масса не является ничтожной по сравнению с массой Земли, самый массивный из них сначала ударится о землю: поскольку его собственная гравитационная сила будет больше, чем у других, Земля будет тянуться к нему больше всего.   -  person intuited    schedule 27.03.2010
comment
@intuited: за исключением того, что они отбрасываются в одно и то же время!   -  person RBarryYoung    schedule 27.03.2010
comment
@RBarry Young: Ага, так? На самом деле это зависит от того, как объекты распределены по Земле; если они находятся в двухмерной плоскости и с одной стороны много более тяжелых, самый тяжелый из них может ударить первым, даже если это не самый тяжелый из объектов.   -  person intuited    schedule 27.03.2010
comment
@intuited: Это жалкие придирки, основанные на условном ревизионизме. Если вы действительно думаете, что смешали Галилея, Ньютона и т. Д. С классической теорией гравитации, то я предлагаю вам написать об этом и попытаться опубликовать. Сообщите нам, как это работает. До тех пор почти 500-летний эксперимент Галилея, который многие считают началом науки, все еще считается установленным научным фактом. Несмотря на сварливые попытки придраться-приготовить.   -  person RBarryYoung    schedule 27.03.2010
comment
@RBarryYoung: Я просто надеялся вести дебаты в творческом направлении, не хотел вас обидеть. Но в любом случае я тоже не физик, поэтому я провел небольшое «исследование» и обнаружил, что программа planets со мной согласуется. Я использовал его, чтобы создать симуляцию с большой сферой посередине, а также средними и меньшими сферами с обеих сторон, а затем нажал кнопку «Вперед». Один среднего размера засветился на большом среднем раньше, чем тот, что поменьше. Таким образом, если предположить, что он точно закодирован, может показаться, что более крупные объекты действительно «падают быстрее», если они проявляют значительную гравитационную силу.   -  person intuited    schedule 27.03.2010
comment
Опять же, если вы думаете, что это имеет какое-либо отношение к чему-то важному, я рекомендую вам опубликовать это. Нет, я считаю это бессмысленным придирками, похожими на те, которые распространены в математических головоломках, которые не являются наукой. Итак, идем дальше ...   -  person RBarryYoung    schedule 28.03.2010
comment
Это не по теме, но посмотрите это видео: youtube.com/watch?v= GcDshWmhF4A   -  person Mike Dunlavey    schedule 05.04.2010
comment
@RBarryYoung Позор твоему отношению. интуитивно правильно. Более тяжелые объекты падают быстрее, что можно понять, если вы поймете, что падение - это не скорость, сообщаемая меньшему объекту более крупным (что вы правы, то же самое, что и Земля), а скорость приближения двух объектов, учитывая также скорость, сообщаемую более крупному объекту меньшим. Если вы хотите быть точным, вы должны сказать, что для всех практических целей объекты, падающие на Землю, падают с одинаковой скоростью.   -  person ErikE    schedule 21.01.2011
comment
@intuit Я с тобой согласен. Еще кое-что для RBarryYoung: думать, что вы можете определить с помощью глазных яблок или даже высокоскоростной камеры, разницу в скорости падения двух объектов, которые поднимает человек, - это немного глупо. Представьте себе две идеально гладкие сферы диаметром 5 дюймов, одна из которых весит 5 фунтов, а другая имеет массу Луны внутри. Как вы думаете, они будут падать с такой же скоростью к Земле? Даже если вы уроните два объекта одновременно, они не столкнутся с Землей одновременно, потому что они падают в разных направлениях, поэтому действуют разные гравитационные и приливные силы.   -  person ErikE    schedule 21.01.2011
comment
Опять же: неуместные, бессмысленные придирки. Заданный вопрос имел отношение к закону тяготения, он не имел ничего общего с сопротивлением воздуха, которое в значительной степени является единственным способом, которым вы можете вращать это, чтобы получить разницу. Что касается притяжения, создаваемого сферами на Земле, вы все еще упускаете из виду тот факт, что две сферы падают на то же < i> время! Земля не может расколоться надвое и двигаться к одному быстрее, чем к другому. Опять же, если вы не согласны, то я приглашаю вас опубликовать ваше блестящее опровержение Галилея. В противном случае, пора двигаться дальше ...   -  person RBarryYoung    schedule 21.01.2011
comment
@RBarryYoung: Я не уверен насчет того, кто и что сказал в анналах физики, но я не опровергаю теорию, в которой учитывалась взаимная гравитационная сила, действующая двумя (или тремя) телами друг на друга . Конечно, песчинка не оказывает на Землю значительного количества гравитационной силы; но если бы одним из объектов была, например, Луна, и оба были бы сброшены на противоположные стороны Земли с большой высоты, Земля одновременно сместилась бы на небольшое расстояние в сторону Луны, и Луна, следовательно, столкнулась бы с это перед песком.   -  person intuited    schedule 01.02.2011
comment
Даже если Луна каким-то образом уменьшилась до размера песчинки, сохранив при этом свою массу.   -  person intuited    schedule 01.02.2011
comment
F = G * ((m_1 * m_2) / r²). Когда m_2 (ваш объект) ‹< m_1 (земля) и r ‹< r_earth (то есть в большинстве практических случаев), ускорение для всех объектов по направлению к Земле одинаково. Только когда вы работаете с объектами размером с луну (и больше) и / или очень далекими объектами, есть какая-то разница.   -  person Gx1sptDTDa    schedule 15.04.2014


Ответы (19)


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

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

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

Дальнейшее рассмотрение проблемы вносит дополнительные сложности. Спросите себя: как высоко вам нужно расположить эти объекты, чтобы начать? Очевидно, достаточно высоко, чтобы на самом деле упал самый большой из них; т.е. дальше от Земли, чем радиус самого большого объекта. Но как узнать, как далеко это? Вам нужно сначала определить самый большой объект в коллекции; это опять же (вероятно) потребует повторения. Кроме того, можно представить, что это моделирование может быть многопоточным, чтобы попытаться смоделировать в реальном времени поведение объекта, фактически падающего; но тогда вы обнаружите, что пытаетесь добавить элементы в коллекцию (операция, которая, очевидно, занимает ненулевое количество времени) потенциально одновременно с обнаружением новых конфликтов. Так что это также создаст проблемы с потоками.

Короче говоря, мне сложно представить, как эту идею можно было бы должным образом реализовать, просто используя ООП, без специального оборудования. Тем не менее, это действительно хорошая идея. Фактически это напоминает мне Bead Sort - алгоритм, который, хотя и не такой, как Ваша идея - это также решение для сортировки, которое использует преимущества самой физической концепции гравитации и, что неудивительно, требует специального оборудования.

person Dan Tao    schedule 22.03.2010
comment
Большое спасибо за Ваш ответ. Это очень проницательно. Причина, по которой я задал этот вопрос, - это то, как люди учатся на примерах. Например, стек, очередь имеют аналоги в реальном мире. Даже такие методы сортировки, как быстрая сортировка / сортировка слияниями, имеющая концепцию разделения и правила, я могу в определенной степени представить, насколько легко / быстрее все становится при программном применении. Однако в этом конкретном случае я все время ошибался. Ну а как еще узнать? :) - person bragboy; 22.03.2010
comment
@Bragaadeesh: Определенно не неправильно! Как я уже сказал, это на самом деле очень умная концепция. Проблема в том, что нужно будет проделать большую работу, чтобы настроить модель для запуска симуляции, которая дала бы ваши результаты. - person Dan Tao; 22.03.2010
comment
Черт возьми, многие из моих более инновационных идей не работают. Я просто пытаюсь придумать больше. - person David Thornley; 22.03.2010
comment
+1 Я собирался упомянуть о сортировке бус, но вы упомянули об этом первым. - person Brian; 23.03.2010

Вы только что повторили проблему. Вычисление порядка гравитационных эффектов будет иметь в лучшем случае O алгоритмов сортировки, которые вы пытаетесь превзойти.

person bmargulies    schedule 21.03.2010
comment
Я согласен с вами и считаю, что вы правы, но заявление об этом без какой-либо поддержки не очень поможет. - person Beska; 23.03.2010

Расчет гравитации осуществляется бесплатно только в реальном мире. В программе его нужно смоделировать. Это будет еще n по сложности минимум

person osgx    schedule 21.03.2010

Сортировка общего назначения доказуема в лучшем случае за O (n log n). Чтобы улучшить это, вы должны знать что-то о данных, кроме того, как сравнивать значения.

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

К сожалению, обработка переменных размеров данных означает выполнение переменного числа проходов через сортировку по основанию. В итоге вы получите O (n log m), где m - наибольшее значение (поскольку k бит дает вам значение до (2 ^ k) -1 для беззнакового, половинное значение для подписанного). Например, если вы сортируете целые числа от 0 до m-1, хорошо - у вас снова снова O (n log n).

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

person Steve314    schedule 21.03.2010
comment
Когда-то, когда я был профессором в колледже, я давал своим лучшим студентам задачу доказать, что процедуры сортировки, которые сравнивают и меняют местами элементы, в лучшем случае являются O (n log n). Чтобы доказать это для универсальной сортировки, потребуется определение того, что это означает. - person Jive Dadson; 23.03.2010

Идея может показаться простой, но разница между реальным миром и смоделированным в данном случае состоит в том, что в реальном мире все происходит параллельно. Чтобы смоделировать гравитационную сортировку, как вы описываете, вам придется начать с обдумывания каждого объекта в отдельном потоке с поточно-безопасным способом добавить их в список в порядке их завершения. Реально с точки зрения производительности сортировки вы, вероятно, просто использовали бы быструю сортировку по временам, или поскольку они находятся на одном и том же расстоянии, скорость падения. Однако, если ваша формула пропорциональна массе, вы просто пропустите все это и отсортируете массу.

person James Barrass    schedule 21.03.2010

В фиктивном «гравитационном компьютере» такая сортировка потребует O (1) для решения. Но с настоящими компьютерами, какими мы их знаем, ваша боковая мысль не поможет.

person Jader Dias    schedule 21.03.2010
comment
Компьютер должен быть довольно большим, чтобы обрабатывать неограниченное количество элементов одновременно. - person Steve314; 22.03.2010
comment
Вымышленный? Ха! youtube.com/watch?v=vZaRgMOo-Ig - person Jeremy Friesner; 22.03.2010

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

РЕДАКТИРОВАТЬ: Упс. Забыл физику 101. Конечно, все они попадут одновременно. :)

Любое подобное моделирование просто превращает одну задачу сортировки в другую. Вы ничего не получите.

person Seth    schedule 21.03.2010
comment
Почему при ударе о землю не удается попасть в приемник, который собирает данные? Таким образом, вам не нужно сортировать время. - person bragboy; 22.03.2010
comment
Вы должны смоделировать (смоделировать) время, чтобы получить порядок совпадений. - person osgx; 22.03.2010
comment
Я не понимаю. Вы думаете, что будете имитировать падающие предметы? На самом деле это не кажется объектно-ориентированным. Несмотря на это: в дополнение к тому факту, что (как указывали другие) гравитация на самом деле так не работает. Но даже если бы вы использовали какой-то другой метод физического моделирования, вы все равно столкнулись бы с той же проблемой сортировки. - person Seth; 22.03.2010
comment
Они не попадают в одно и то же время, но было бы невероятно иметь достаточно чувствительную модель, чтобы обнаружить это. - person ErikE; 21.01.2011

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

person mpen    schedule 21.03.2010

Хмммм. Сортировка по гравитации.

Игнорировать вашу конкретную модель гравитации неправильно, давайте посмотрим, куда нас приведет эта идея.

Физическая реальность имеет 10 ^ 80 процессоров.

Фактические нижние границы сортировки известны как log (N), если у вас есть N / 2 процессоров для сортировки N объектов.

Если у вас есть несколько ядер ЦП, нет причин, по которым вы не можете запустить сортировку слиянием для нескольких потоков.

person Joshua    schedule 22.03.2010

На самом деле существует довольно известный алгоритм сортировки под названием «Сортировка спагетти», который чем-то похож на ваш. Вы можете ознакомиться с некоторыми из многочисленных анализов этого вопроса в Интернете. например на cstheory.

спагетти

person Thomas Ahle    schedule 30.12.2011

Это должно быть определенно, только у вас должно быть соответствующее оборудование для этого. В остальном это звучит очень круто. Надеюсь, кто-нибудь представит документ IEEE, чтобы воплотить эту безумную мечту в жизнь.

person Community    schedule 22.03.2010

Обожаю идею! Это умно. Хотя да, то, что говорят другие, в целом правильно, что граница O (n log n) является доказуемой нижней границей для проблемы сортировки в целом, мы должны иметь в виду, что эта нижняя граница верно только для моделей, основанных на сравнении. То, что вы предлагаете, - это совершенно другая модель, и она заслуживает дальнейшего рассмотрения.

Кроме того, как указали Джеймс и Матрикс, более тяжелый объект не движется быстрее, чем более легкий, вам, очевидно, нужно адаптировать модель к чему-то, где более тяжелый объект (число) действительно будет перемещаться быстрее / дальше (или медленнее / меньше. далее), чтобы можно было как-то различать числа (на ум тоже центрифуга).

Требуется больше обдумывания, но зато твоя идея острая!

(Edit) Теперь, глядя на идею Энрике Phys2D, я думаю, что она имеет гораздо больший смысл.

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

person Amrinder Arora    schedule 22.03.2010

Я думаю, что проблему можно упростить следующим образом: вы хотите расположить нижнюю часть сфер на разной высоте, чтобы при падении с одинаковой силой тяжести самый большой упал на землю первым, второй по величине - вторым и т. Д. Это по сути эквивалентно использованию линии, а не сферы ... в этом случае вы можете просто сказать, что heightOffTheGround = MAX_VALUE - масса.

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

Проблема в том, что мы, по сути, просто переформулировали проблему и решили ее следующим образом (псевдокод):

int[] sortedArray; // empty
int[] unsortedArray; // full of stuff
int iVal = MAX_INT_VALUE;
while (true)
{
    foreach (currentArrayValue in sortedArray)
    {
        if (iVal = current array value
        {
            put it in my sortedArray
            remove the value from my unsortedArray
        }
    }
    if (unsortedArray is empty)
    {
        break;  // from while loop
    } 
    iVal--
}

Проблема в том, что для запуска физического движка вам нужно перебирать каждую единицу времени, и это будет O (1) ... с очень большой константой ... постоянным числом значений дельты, на которых будет работать система. Недостатком является то, что для очень большого количества этих значений дельты вы, по сути, не приблизитесь к ответу: на любой данной итерации очень вероятно, что все сферы / линии / что угодно будет перемещено ... но ни один ударит.

Вы можете просто сказать: ну, давайте пропустим много промежуточных шагов и просто забегаем вперед, пока не удастся один из них! Но это означает, что вам нужно знать, какой из них самый большой ... и вы снова вернулись к проблеме сортировки.

person Beska    schedule 22.03.2010

Немного адаптирую вашу идею. У нас есть объекты, но они отличаются не по весу, а по скорости. Итак, вначале все объекты выровнены по стартовой линии, и при стартовом выстреле все они будут двигаться с соответствующей скоростью к финишу.

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

Хорошо, вы хотите смоделировать это.

Мы принимаем длину вашего поля равной L=1. При размере шага ∆t каждый из ваших N объектов перемещается на vᵢ∙∆t за раз. Это означает, что каждому объекту требуется sᵢ = L / (vᵢ∙∆t) шагов, прежде чем он достигнет финиша.

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

Теперь, в лучшем случае, это означает, что объект 1 завершается за один шаг, объект 2 за два и так далее. Таким образом, общее количество шагов равно S = 1 + 2 + … + N = N∙(N + 1)/2. Это порядок N∙N.

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

person Debilski    schedule 22.03.2010

Если бы нужно было построить компьютер, который сортирует объекты на основе некоторых критериев (о которых не так уж и смешно думать), то я считаю, что порядок сложности не будет иметь ничего общего с количеством объектов, а скорее со скоростью локального ускорения. из-за силы тяжести. Если предположить, что он смоделирован на Земле, сложность будет O (g 0), где g 0:

alt text

Простое объяснение состоит в том, что количество сферических объектов (n) не имеет значения, если их центры выровнены в начале. Более того, ускорение свободного падения будет иметь гораздо большее влияние, чем сама высота, когда она увеличивается. Например, если мы увеличим высоту всех объектов в 10 раз, им потребуется не в 10 раз больше времени, чтобы упасть на землю, а гораздо меньше. Это включает в себя различные пренебрежимо малые приближения, поскольку ускорение фактически зависит от расстояния между двумя объектами, но это можно игнорировать, поскольку нас больше интересует более широкая картина, чем конкретное значение.

Тем не менее, блестящая идея.

Также мне нравится видео о сортировке монет, опубликованное @Jeremy. И, наконец, объектно-ориентированность была бы наименьшей из моих забот при создании такой машины. Если подумать, вот мои глупые два цента на создание такой машины:

O 0 o O o

. . . . .
. . . . .
. . . . .
= = = = =

Все объекты имеют разный размер, пропорциональный критериям, по которым мы хотим сортировать. Изначально они удерживаются вместе по горизонтали тонким стержнем, который проходит через центр каждой сферы. = внизу специально разработаны для записи значения (необязательно их положения) где-нибудь, как только они сталкиваются со сферой. После того, как все сферы столкнутся, у нас будет порядок сортировки на основе записанных значений.

person Anurag    schedule 27.03.2010

из ответа Дебильски:

Немного адаптирую вашу идею. У нас есть объекты, но они отличаются не по весу, а по скорости. Итак, вначале все объекты выровнены по стартовой линии, и при стартовом выстреле все они будут двигаться с соответствующей скоростью к финишу.

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

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

Предполагая, что моделирование происходит с дискретными временными шагами, то есть кадрами, в каждом кадре новое расстояние каждого объекта будет: d = d - v, и объект будет добавлен в список, когда его d ≤ 0. Это одно вычитание и одно условие. Два дискретных шага для каждого объекта, поэтому вычисления кажутся O (n): линейными.

Загвоздка в том, что она линейна только для одного кадра! Он умножается на количество f кадров, необходимых для завершения. Сама симуляция O (nf): квадратичная.

Однако, если мы возьмем продолжительность кадра в качестве аргумента t, мы получим возможность влиять на количество кадров f обратно пропорционально. Мы можем увеличить t, чтобы уменьшить f, но это происходит за счет точности: чем больше мы увеличиваем t, тем больше вероятность того, что два объекта закончатся в один и тот же период времени, поэтому они будут перечислены как эквивалентные, даже если это не так. Таким образом, мы получаем алгоритм с регулируемой точностью (как в большинстве контекстов моделирования методом конечных элементов).

Мы можем дополнительно уточнить это, превратив его в адаптивный + рекурсивный алгоритм. В человеческом коде это будет:

function: FESort: arguments: OriginalList, Tolerance
  define an empty local list: ResultList

  while OriginalList has elements
    define an empty local list: FinishedList
    iterate through OriginalList
      decrement the distance of each object by Tolerance
      if distance is less than or equal to zero, move object from OriginalList to FinishedList

    check the number of elements in FinishedList
      when zero
        set Tolerance to double Tolerance
      when one
        append the only element in FinishedList to ResultList
      when more
        append the result of FESort with FinishedList and half Tolerance to ResultList
  
  return ResultList

Мне интересно, есть ли какая-нибудь похожая реализация, которая работает для кого-то.

Действительно интересная тема :)

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

person edgerunner    schedule 10.09.2010
comment
Спасибо, я сомневаюсь, что это полезно :) Я бы сказал, что это во многом зависит от определения хорошего значения толерантности. - person edgerunner; 10.09.2010

Несколько недель назад я думал о том же.

Я решил использовать библиотеку Phys2D для его реализации. Это может быть непрактично, но просто для развлечения. Вы также можете присвоить объектам отрицательные веса, чтобы представить отрицательные числа. С помощью библиотеки Phys2d вы можете определить силу тяжести, чтобы объекты с отрицательным весом переходили на крышу, а объекты с положительным весом падали вниз. Затем расположите все объекты посередине между полом и крышей с одинаковым расстоянием между полом и крышей. Предположим, у вас есть результирующий массив r [] длины = количеству объектов. Затем каждый раз, когда объект касается крыши, вы добавляете его в начало массива r [0] и увеличиваете счетчик, в следующий раз, когда объект касается крыши, вы добавляете его в r [1], каждый раз, когда объект достигает этажа, вы добавьте его в конец массива r [r.length-1], в следующий раз, когда вы добавите его в r [r.length-2]. В конце объекты, которые не двигались (оставались плавающими посередине), могут быть добавлены в середину массива (эти объекты имеют нулевое значение).

Это неэффективно, но может помочь вам реализовать вашу идею.

person Enrique    schedule 22.03.2010
comment
Спасибо, Энрике .. Приятно видеть, что для этого есть библиотека !! - person bragboy; 23.03.2010

  1. Я считаю, что неплохо упомянуть / сослаться на: Какая связь между P и NP и способностью природы решать NP-проблемы эффективно? Сортировка O(nlog(n)), почему бы не попытаться решить NP-сложные проблемы?
  2. По законам физики объекты падают пропорционально гравитационной постоянной массой незначительно.
  3. Моделирование физического процесса может повлиять на фактическую временную сложность.
person 0x90    schedule 14.04.2014

Проанализируйте: (1) Все центры сфер выровнены в начале (2) большее число ==> масса выше ==> радиус больше ==> расстояние до земли ниже (3) в «вакууме» такое же ускорение = такое же изменение скорости = => такое же расстояние для центра ==> насколько больше радиус ... как раньше сфера ударится о землю ==> концептуально ОК, хорошая физическая техника, если, когда сфера ударяется о землю, она может послать сигнал идентификации + время попадания ... который даст отсортированный список. Практически ... не очень хорошая числовая техника.

person Jochris    schedule 22.03.2017