Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Метод оптимизации поиска путем перестановки в начало списка.
Суть этого метода заключается в том, что элемент списка с ключом, равным аргументу поиска, передвигается на первое место в списке, исходя из предположения, что к этому элементу будут обращаться чаще всего. Алгоритм перестановки в начало q= nil p = table while (p <> nil) do if key = k(p) then search = p if q = nil then 'перестановка не нужна' return endif nxt(q) = nxt(p) nxt(p) = table table = p return endif q = p p = nxt(p) endwhile search = 0 return Этот алгоритм применим как для списков, так и для массивов. Однако, его не рекомендуется применять для массивов, так как на перестановку элементов массива затрачивается гораздо больше времени, чем на перестановку указателей.
Метод транспозиции при оптимизации поиска. В данном методе найденный элемент переставляется на один элемент к голове списка. И если к этому элементу обращаются часто, то, перемещаясь к голове списка, он скоро окажется на первом месте.
Для реализации данного метода понадобиться уже 3 рабочих указателя р - рабочий указатель
q - вспомогательный указатель, отстает на один шаг от р
s - вспомогательный указатель, отстает на два шага от р
Алгоритм метода транспозиции s = nil q = nil p = table while (p <> nil) do if key = k(p) then ‘ нашли, транспонируем if q = nil then ‘ переставлять не надо return endif nxt(q) = nxt(p) nxt(p) = q if s = nil then table = p else nxt(s) = p search = p endif return endif s =q q = p p = nxt(p) endwhile search = nil return
Этот метод удобен при поиске не только в списках, но и в массивах (так как меняются только два стоящих рядом элемента).
Бинарный поиск
Бинарный поиск (метод деления пополам)
Метод используется только для отсортированных массивов.
Основная идея - выбрать случайно некоторый элемент AM и сравнить его с аргументом поиска Х. Если AM=Х, то поиск закончен; если AM <X, то мы заключаем, что все элементы с индексами, меньшими или равными М, можно исключить из дальнейшего поиска.
Аналогично, если AM >X. Выбор М совершенно произволен в том смысле, что корректность алгоритма от него не зависит. Однако на его эффективность выбор влияет. Ясно, что наша задача - исключить как можно больше элементов из дальнейшего поиска. Оптимальным решением будет выбор среднего элемента, т.е. середины массива. Рассмотрим пример, представленный на рисунке ниже
Допустим необходимо найти элемент с ключом key = 52. Обозначим: low - индекс нижней границы интервала поиска hi - индекс верхней границы интервала поиска mid - индекс середины интервала поиска Алгоритм бинарного поиска low = 1 hi = n while (low <= hi) do mid = (low + hi) div 2 if key = k(mid) then search = mid return endif if key < k(mid) then hi = mid - 1 else low = mid + 1 endif endwhile search = 0 return Согласно алгоритму, в нашем примере первым сравниваемым элементом будет 49. Так как 49<52, то ищем следующую середину среди элементов, расположенных выше 49. Это число 86. 86>52, поэтому теперь ищем 52 среди элементов, расположенных ниже 86, но выше 49. На следующем шаге обнаруживаем, что очередное значение середины равно 52. Мы нашли элемент в массиве с заданным ключом. Количество сравнений при бинарном поиске (эффективность) имеет порядок
О(log2n) Например, n = 1024. При последовательном поиске С = 512, а при бинарном Можно совместить бинарный и индексно-последовательный поиск (при больших объемах данных), учитывая, что последний также используется при отсортированном массиве.
|
|||||
Последнее изменение этой страницы: 2017-02-05; просмотров: 949; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.126.74 (0.008 с.) |