Алгоритм Флойда – Ривеста - Floyd–Rivest algorithm
Учебный класс | Алгоритм выбора |
---|---|
Структура данных | Множество |
Средний спектакль | п + мин (k, п − k) + О(п1/2) |
В Информатика, то Алгоритм Флойда-Ривеста это алгоритм выбора разработан Роберт В. Флойд и Рональд Л. Ривест который имеет оптимальное ожидаемое количество сравнений в пределах условия более низкого порядка. Функционально эквивалентен быстрый выбор, но на практике в среднем работает быстрее.[1] Ожидаемое время работы О(п) и ожидаемое количество сравнений п + мин (k, п − k) + О(п1/2).
Первоначально алгоритм был представлен в техническом отчете Стэнфордского университета, содержащем две статьи, где он упоминался как ВЫБРАТЬ и в паре с PICK, или медиана медиан.[2] Впоследствии он был опубликован в Коммуникации ACM, Том 18: Выпуск 3.
Алгоритм
Алгоритм Флойда-Ривеста - это разделяй и властвуй алгоритм, имеющий много общего с быстрый выбор. Оно использует отбор проб чтобы помочь разделить список на три набора. Затем он рекурсивно выбирает k-й наименьший элемент из соответствующего набора.
Общие шаги:
- Выберите небольшую случайную выборку S из списка L.
- Из S, рекурсивно выберите два элемента, ты и v, так что ты < v. Эти два элемента будут повороты для раздела и, как ожидается, будут содержать k-й наименьший элемент всего списка между ними (в отсортированном списке).
- С помощью ты и v, раздел S на три набора: А, B, и C. А будет содержать элементы со значениями меньше, чем ты, B будет содержать элементы со значениями между ты и v, и C будет содержать элементы со значениями больше, чем v.
- Разделите оставшиеся элементы на L (то есть элементы в L - S), сравнивая их с ты или же v и поместив их в соответствующий набор. Если k меньше половины числа элементов в L округлить в большую сторону, то остальные элементы нужно сравнить с v сначала и только потом ты если они меньше чем v. В противном случае остальные элементы следует сравнить с ты первый и только v если они больше чем ты.
- Исходя из стоимости k, рекурсивно примените алгоритм к соответствующему набору, чтобы выбрать k-й наименьший элемент в L.
Версия псевдокода
Следующее псевдокод сортирует элементы между оставили
и верно
в порядке возрастания, так что для некоторого значения k, куда оставили
≤ k ≤ верно
, то k-й элемент в списке будет содержать (k − оставили
+ 1) -е наименьшее значение:
// left - левый индекс интервала// right - правый индекс для интервала// k - желаемое значение индекса, где array [k] - (k + 1) -й наименьший элемент, когда left = 0функция выберите (массив, слева, справа, k) является пока верно > оставили делать // Используйте рекурсивное выделение для выборки меньшего набора размера s // произвольные постоянные 600 и 0,5 используются в исходном // версия для минимизации времени выполнения. если вправо - влево> 600 тогда n: = вправо - влево + 1 i: = k - влево + 1 z: = пер(n) s: = 0,5 × exp(2 × z / 3) sd: = 0,5 × sqrt(z × s × (n - s) / n) × знак(i - n / 2) newLeft: = Максимум(слева, k - i × s / n + sd) newRight: = мин(справа, k + (n - i) × s / n + sd) Выбрать(массив, newLeft, newRight, k) // разделите элементы между левым и правым вокруг t t: = array [k] i: = left j: = right замена array [left] и array [k] если массив [справа]> т тогда замена массив [справа] и массив [слева] пока яделать замена array [i] и array [j] i: = i + 1 j: = j - 1 пока массив [я] <т делать я: = я + 1 пока массив [j]> t делать j: = j - 1 если array [left] = t тогда замена array [left] и array [j] еще j: = j + 1 замена array [j] и array [right] // Отрегулируйте влево и вправо к границам подмножества // содержащий (k - left + 1) -й наименьший элемент. если j ≤ k тогда слева: = j + 1 если k ≤ j тогда справа: = j - 1
Смотрите также
Рекомендации
- ^ Флойд, Роберт В.; Ривест, Рональд Л. (1975). «Алгоритм 489: Алгоритм SELECT - для поиска i-го наименьшего из n элементов» (PDF). Comm. ACM. 18 (3): 173. CiteSeerX 10.1.1.309.7108. Дои:10.1145/360680.360694.
- ^ Две статьи по проблеме выбора: временные границы для выбора и ожидаемые временные границы для выбора (PDF) (Технический отчет). Стэнфордские технические отчеты и технические примечания по информатике. Апрель 1973 г. CS-TR-73-349.
- Флойд, Роберт В.; Ривест, Рон Л. (Март 1975 г.). «Ожидаемые сроки выбора» (PDF). Коммуникации ACM. 18 (3): 165–172. Дои:10.1145/360680.360691.
- Кивель, Кшиштоф К. (30 ноября 2005 г.). "Об алгоритме SELECT Флойда и Ривеста" (PDF). Теоретическая информатика. 347 (1–2): 214–238. Дои:10.1016 / j.tcs.2005.06.032.
- Gerbessiotis, Alexandros V .; Siniolakis, Constantinos J .; Параскеви, Агия (май 2005 г.). «Вероятностный анализ алгоритма выбора ожидаемого времени Флойда-Ривеста». Международный журнал компьютерной математики. 82 (5): 509–519. CiteSeerX 10.1.1.7.8672.