2012-05-12 3 views
1

Какова самая дорогостоящая операция любого алгоритма сортировки? Это операция обмена или операция сравнения?Самая дорогостоящая операция сортировки

Я думал, что это меняет, но мой друг считает, что это сравнение. Единственным способом, которым я могу оправдать это сравнение, является более дорогостоящая операция, так это то, что каждый элемент нужно сравнивать, но не каждый элемент необходимо поменять местами (т. Е. Если элемент уже находится в правильном положении, его не нужно менять). Поэтому, в целом, в более широкой картине, есть более дешевые сравнения, чем несколько дорогостоящих свопов. Но я не уверен в ответе. Есть предположения?

+0

Это зависит. Для данных на основе дисков доминирующим фактором является ввод-вывод, необходимый для переноса дисковых страниц в память. Когда страницы там, процессор относительно свободен. Для небольших ключей (ints) обмен может быть более дорогим, чем сравнение. При очень малых размерах элементов память (кеш) может стать доминирующей. – wildplasser

+0

(продолжение с wildplasser) ... что означает список, живущий на диске (или виртуальной памяти), обмен более дорогостоящий. Но если список живет в кэш-памяти, тогда замена и сопоставления примерно равны (порядок констант) аналогичных расходов, а затем совокупная стоимость всех свопов или всех сравнений зависит от того, какой алгоритм вы используете. –

ответ

1

Предполагая, что все сделано в ОЗУ, операция подкачки является атомарно быстрее, чем операция сравнения. (это довольно очевидно, 2 читает тогда операцию cpu против 2-х прочитанных, 2 записи и все между ними, включая операции реестра).

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

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

Наконец (среднее число операций подкачки) (время стоимость операции своп)/(среднее число операций оценочного) (время стоимость эксплуатации оценочного) довольно трудно оценить для алгоритма, и это очень много больше, чтобы экстраполировать все алгоритмы.

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

+1

Я не совсем понимаю, что очевидная часть обмена дешевле, когда все в ОЗУ :( – Bugaboo

+0

В очень упрощенном компьютере (не включая понятия pagefiles и т. Д., Потому что он добавляет много случайности), если ваш массив находится в ram, чтобы сравнить два значения, которые вы должны загрузить как в регистры, а затем сравнить их с помощью ALU. Для свопинга вам нужно запомнить два адреса RAM в реестрах, затем поместить оба значения в другие регистры, а затем записать в ram, используя адрес первого значения, чтобы записать второе значение и т. д. Я мог бы объяснить вам, почему это занимает больше времени, но я должен был бы объяснить вам другую концепцию, такую ​​как циклы, микрокод и т. д. – AdrienNK

+0

Считайте это выше с осторожностью, это для упрощенного система, более продвинутая технология конвейеризации, которая добавляет еще один уровень сложности. Если вы действительно хотите знать все об этом предмете, я предлагаю вам прочитать и изучить n о вычислительных структурах/компьютерном дизайне, потому что это действительно имеет значение, когда мы думаем о затратах на операции. Если у вас уже есть сборка, которая будет проще объяснить. – AdrienNK

Смежные вопросы