#algorithm
#алгоритм
Вопрос:
Проблема здесь заключается в том, чтобы уменьшить среднее количество сравнений, необходимых при сортировке выбора.
Я читаю статью об этом, и вот фрагмент текста:
В более общем случае выборка S’ из s элементов выбирается из n элементов. Пусть «дельта» будет некоторым числом, которое мы выберем позже, чтобы минимизировать среднее число сравнений, используемых процедурой. Мы находим (v1 = (k * s) / (n — дельта))-й и (v2 = (k * * s) / (n дельта))-й наименьшие элементы в S’. Почти наверняка k-й наименьший элемент в S будет находиться между v1 и v2, поэтому мы остаемся с проблемой выбора (2 * дельта) элементов. С низкой вероятностью k-й наименьший элемент не попадает в этот диапазон, и нам предстоит проделать значительную работу. Однако при хорошем выборе s и дельты мы можем гарантировать по законам вероятности, что второй случай не окажет отрицательного влияния на общую работу.
Я не следую приведенному выше тексту. Может кто-нибудь, пожалуйста, объясните мне с примерами. Как автор сократил до 2 * дельта-элементов? И откуда он знает, что существует низкая вероятность того, что элемент не попадает в эту категорию.
Спасибо!
Комментарии:
1. Не могли бы вы дать ссылку на статью, пожалуйста?
2. -1 за то, что все еще нет ссылки на статью. У нас нет контекста для вашего фрагмента. Это что-то о сравнении элементов, это может быть сортировка, но невозможно быть уверенным без значительных знаний об этом конкретном предмете, и, возможно, даже тогда слишком мало, чтобы пройти.
Ответ №1:
Основой идеи является то, что обычный алгоритм выбора имеет линейную сложность во время выполнения, но на практике работает медленно. Нам нужно отсортировать все элементы в группы по пять и рекурсивно выполнить еще больше работы. O(n)
но со слишком большой константой. Таким образом, идея состоит в том, чтобы уменьшить количество сравнений в алгоритме выбора (не обязательно сортировка выбора). Интуитивно это то же самое, что и в базовой статистике; если я беру выборочное подпространство достаточно большой пропорции, вполне вероятно, что распределение данных в подпространстве адекватно отражает данные во всем пространстве.
Итак, если я ищу k-е число в наборе размером один миллион, я мог бы вместо этого взять, скажем, 10 000 (уже одну сотую размера), который все еще достаточно велик, чтобы быть хорошим представлением глобального распределения, и искать k / 100-е число. Это простое масштабирование. Итак, если пространство было 10, и я искал 3-е, это все равно, что искать 30-е из 100 или 300-е из 1000 и т. Д. По сути k/S = k'/S'
(где мы ищем k-е число в S, и мы переводим его в k-е число в S’ нашем подпространстве) и, следовательно k' = k*S'/S
, которое должно выглядеть знакомо, поскольку в процитированном вами тексте S’ обозначается через s, а S через n, и это та же самая дробь, которая указана в кавычках.
Теперь, чтобы учесть статистические колебания, мы не предполагаем, что подпространство будет идеальным представлением распределения данных, поэтому мы допускаем некоторые колебания, а именно дельта. Скажем, давайте найдем k-й-дельта и k-й дельта элементы в S ‘, и тогда мы можем с большой уверенностью (т. Е. С высокой математической вероятностью) сказать, что k-е значение из S находится в интервале (k-я дельта, k-я дельта).
Чтобы завершить все это, мы выполняем эти два выбора для S ‘, затем разделяем S соответственно, и теперь делаем [обычный] выбор на гораздо меньшем интервале в разделе. В итоге это оказывается почти оптимальным для элементов за пределами интервала, потому что мы не делаем для них выбор, а только разделяем их. Таким образом, процесс выбора происходит быстрее, потому что мы уменьшили размер проблемы с S до S ‘.
Комментарии:
1. Привет, Дэвин, в последнем абзаце, как вы упомянули, два выбора означают k’th-delta и k’th delta, что вы подразумеваете под разделом S соответственно?
2. @venkysmarty, после того, как вы сделали эти два выбора для S ‘, вам нужно разделить S так, чтобы у вас были все элементы, меньшие, чем
k'-delta
, все междуk'-delta
иk' delta'
, а затем остальные. Затем, основываясь на этом разделе, вы можете найти k-й элемент.3. итак, по сути, мы снова выполняем n сравнений всех элементов в S при разделении, итак, как мы уменьшаем приведенные выше сравнения, спасибо, что терпеливо отвечаете на мои вопросы, я новичок в алгоритмах и пытаюсь понять это, и еще один вопрос заключается в том, что после разделения мы делаем выбор в элементах 2delta
4. @venkysmarty, разделение — это одно сравнение, выделение — больше. Таким образом, выбор на S выполняет более одного сравнения для всех элементов, в то время как эта версия выполняет одно сравнение для большинства элементов, а затем больше (выбор) только для небольшого подмножества.