Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Andrew Doroshev                      2:5020/400     07 Mar 2002  13:52:08
 To : Sashka Yackubtchick
 Subject : Re: Binary search with duplicate values
 -------------------------------------------------------------------------------- 
 
 
 Dear Sashka Yackubtchick!
 
 >  AD> Последовательный поиск при 25*10Е6 элементах в массиве вещь небыстрая.
 > Это для какой платформы?
 
 Это для любой платформы.
 Среднее количество проверок при бинарном поиске =
 -- старт --
 1 проверка что число >= a[0]
 1 проверка что число <= a[N-1]
 -- пока нет равенства --
 (Log 25000000/Log 2 = 25)
 k проверок что число < a[middle], 1<=к<=25
 k проверок что число != a[middle], 
 -- успешный поиск --
 l проверок что число < a[middle], l<=25-k, для поиска нижней границы
 m проверок что число < a[middle], m<=25-k, для поиска верхней границы
 -- а здесь гаденькая концовка, которая мне не нравится --
 2-4 проверки что число == a[middle]
 Итого: в самом плохом случае сделаем 56 проверок, в среднем - 31
 
 > Я бы рассуждал так:
 > (Мне приходится многое предпологать в плане оценок вероятности,
 > если что-то существееное есть в этом плане сказать, напиши пожалуйста)
 > 
 > 1. Hижним индексом может быть любой элемент от 0 до 108149 (если ты говоришь
 
   от 0 до 25000000
 
 > о 25*10E6 (или 25 это 25h?)
 
   25*10E6 это 25000000 десятичное число
 
 > 2. Тем не менее, само колличество одинаковых элементов значительно меньше.
 > (сколько их может быть одинаковых максимум? в среднем? также непонятно
 >  а может ли быть такое, что элемента, верхний и нижний индекс которого ищутся
 > вообще нет в массиве?)
 > Тогда напрашивается сначала такая логика.
 >  - Hайти как можно быстрее первый элемент. Его индекс будет нижним
 >  - верхний индекс = нижний ;
 >     проверять по цепочке пока значение элемента совпадает с очередным,
 > инкриминируя значение верхнего индекса,
 >     при первом же несовпадении возврат.
 > 
 > Мне бы казалось исходя из вышесказанного, что скорость стала бы определяться
 > процедурой поиска первого значения. Есть варианты резкого ускорения подобного
 > поиска но они платформо зависимы.
 
 Example, please. Я вполне серьёзно. Я не знаю примеров более быстрого поиска,
 чем деление пополам. И тем более не знаю ничего платформо-зависимого. Кстати,
 зависимость меня сильно не пугает. Мне надо решить задачу, здесь и сейчас, не
 более того
 
 > Там какой тип данных у элемента?
 
 int, 32 бита
 
 > 
 > Видишь ли можно конечно проверять делением пополам или сходными по логике
 > методами, но деление пополам длины массива напрямую можно использовать лишь
 > если массив растёт плавно и каждый элемент уникален либо существует некая
 > чёткая зависимость.
 
 никакой информации о вероятности тех или иных значений нет. от 1,1,1,...1 до
 1,2,3,4...25000000
 
 > Если зависимость между ростом индексов элементов и ростом их значения
 > неопределена то как можно использовать подобные методы.
 > Они могут наоборот замедлить.
 > Другое дело например ускорить нахождение группы значения которой например
 > превышают данное значение.
 > 1. Способ примитивный.
 > Проверяем каждый надцатый элемент пока он не больше заданного.
 > Как только мы его найдём нужно лишь просканировать от найденного обратно
 > пока не наткнёмся на наш элемент.
 > Тогда максимальное колличество проверок длина массива\надцать (или цать как
 > хочешь) + надцать-1.
 
 пусть надцать=z
 тогда макс количество проверок=const*Log(длина массива)/Log(z)*(z-1)
 z  Количество проверок
 2  25
 3  32
 5  43
 10 67
 15 89
 20 109
 30 146
 40 181
 50 214
 100   367
 
 > 2. Способ примитивный делаем тоже самое что и в первом но с двух концов
 > в одном проверяя не больше ли равно во втором не меньше ли равно.
 > Преимущество - за одну итерацию проверить сразу две группы.
 > Как на HLL такое рисуется понятия неимею, но на машином языке очень просто.
 > 3,4,5 - можно увеличить колличество секторов синхронной проверки.
 > 
 > Деление на 2 конечно напрашивается.
 > Hо ничего не сказано о равномерности распределения и усреднённости размера
 > групп элементов с одинаковыми значениями.
 > Могут быть случаи когда ты будешь делать sqrt(колличество элемментов) шагов а
 > сам элемент будет лежать под носом.
 
 Сейчас пытаюсь преобразовать алгоритм обработки, с тем, чтобы не искать
 произвольный элемент в массиве, а вместо этого искать элемент соседний с данным.
 Это быстрее всего.
 
 Andrew Doroshev
 --- ifmail v.2.15dev5
  * Origin: Demos online service (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Поиск диапазона в массиве   Andrew Doroshev   22 Feb 2002 07:00:22 
 Re: Поиск диапазона в массиве   Oleg I. Khovayko   23 Feb 2002 00:48:32 
 Поиск диапазона в массиве   Dmitry Koren   27 Feb 2002 20:02:42 
 Re: Binary search with duplicate values   Andrew Doroshev   28 Feb 2002 20:28:03 
 Binary search with duplicate values   Sashka Yackubtchick   03 Mar 2002 06:23:50 
 Re: Binary search with duplicate values   Andrew Doroshev   07 Mar 2002 13:52:08 
 Re: Binary search with duplicate values   zugr   26 Mar 2002 16:10:37 
Архивное /ru.algorithms/7923446543ab.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional