Как quicksort связан с кешем?

Я видел, что многие места говорят, что quicksort хорош, потому что он подходит для связанных с кешем вещей, например, в wiki

Кроме того, быстрые последовательные и локализованные ссылки на память хорошо работают с кешем

http://en.wikipedia.org/wiki/Quicksort

Может ли кто-нибудь дать мне некоторое представление об этом утверждении? Как quicksort связан с кешем? Как правило, что означает этот кеш в заявлении? Почему quicksort лучше для кеша?

Спасибо

Ответ 1

quicksort изменяет массив inplace - в массиве, на котором он работает [в отличие от сортировки слияния, например, который создает для него другой массив]. Таким образом, он применяет принцип локальность ссылки.

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

Объединить сортировку, например, - требуется гораздо больше доступа к памяти [RAM] - поскольку каждый созданный вами аксессуар - снова обращается к ОЗУ.

Деревья еще хуже - поскольку 2 последовательных доступа к дереву вряд ли будут близки друг к другу. [Кэш заполняется блоками, поэтому для последовательного доступа - только первый байт в блоке является "пропуском", а остальные - "ударом" ].

Ответ 2

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

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

Ответ 3

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