Подтвердить что ты не робот

QuickSort Dijkstra 3-Way Partitioning: зачем нужна дополнительная замена?

Algorithm

Учитывая алгоритм здесь, посмотрите на сценарий, где я находится в "X" , происходит следующее:

Сценарий: я → "X" , "X" > "P"

1. swap("X", "Z"), gt--;   // the value at i is now "Z", which is still > "P"
2. swap("Z", "Y"), gt--;   // the value at i is now "Y", which is still > "P"
3. swap("Y", "C"), gt--;    // Now we finally get a value at i "C" which is < "P"
// Now we can swap values at i and lt, and increrement them
4. swap("P", "C"), i++, lt++;

Почему мы не просто уменьшаем gt до gt до значения, которое равно < значение в lt ( "P" в этом случае), то мы обмениваем это значение со значением в i. Это сохранит операции свопинга.

Итак, если мы сделаем это для упомянутого выше сценария, мы сделаем следующее:

1. gt--
2. gt--
3. swap("X", "C"), gt--;   
// Now we can swap values at i and lt, and increrement them
4. swap("P", "C"), i++, lt++;

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

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

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

P.S. "Влияние на производительность", как используется выше, означает улучшение/ухудшение производительности.

4b9b3361

Ответ 1

Вы правы, дополнительные операции обмена не нужны, этот алгоритм здесь лучше всего для ясности, но не для производительности. См. Обсуждение Быстрая сортировка (3-х полосный раздел).

В "Оптимизатор Quicksort" является оптимальным самого Роберта Седжуича, у него есть другой подход, который использует гораздо меньшую операцию свопинга, но вы можете себе это представить требуется больше кода и менее понятен, чем алгоритм в демонстрации.

enter image description here

Ответ 2

Алгоритм основан на решении Дейкстры "Проблема голландского национального флага", который появился (стр .111) в его книге "Дисциплина программирования", опубликованной в 1976 году. Целью Дейкстры с книгой было вывести доказуемые правильные решения многих проблем. Не просто представить окончательный результат, а фактически пройти процесс проектирования.

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

Преобразованный в проблему сортировки, эквивалент будет иметь не более N сравнений. Это на самом деле довольно часто. В стандарте С++ сложность различных алгоритмов сортировки и операций кучи заключается в количестве сравнений. Не количество свопов. Мысль заключается в том, что замена дешевая, если не использовать косвенные (указатели), чтобы сделать ее дешевой. Однако сравнения могут быть дорогими. Таким образом, имеет смысл указать сложность с точки зрения количества сравнений.

Да, вы могли бы сократить количество свопов, но не если вы хотите иметь не более N сравнений.