Поиск.ppt
- Количество слайдов: 34
Поиск Основная терминология и понятия • Будем ориентироваться на понятие записи, таблицы, файла. • С каждой записью ассоциируется некоторый ключ, который используется для того, чтобы отличить одну запись от другой. Соответствие между записью и ключом может быть простым или сложным 1
• В простейшем случае ключ является некоторым полем внутри записи, располагающимся с некоторым конкретным сдвигом от начала записи. Такой ключ называется внутренним ключом или встроенным ключом. • В других случаях ключом является относительная позиция записи внутри файла или имеется некоторая отдельная таблица ключей, которая содержит указатели на записи. Такие ключи называются внешними ключами. 2
• Для каждого файла имеется по крайней мере один набор ключей (возможно и несколько таких наборов), которые являются уникальными (т. е. никакие две записи в файле не имеют одинакового значения ключа). Такой ключ называется первичным ключом. Например, если файл хранится как некоторый массив, то индекс некоторого элемента в этом массиве является уникальным внешним ключом для этого элемента. • Однако поскольку любое поле записи может служить в качестве ключа в каком - либо конкретном приложении, то ключи не всегда должны быть уникальными. – Например, если в некотором файле с фамилиями и адресами название города используется как ключ для некоторого поиска, то он, возможно, не будет уникальным, так как в файле могут содержатся две записи с названием одного и того же города. Такой ключ называется вторичным ключом. • Некоторые из алгоритмов поиска предполагают наличие уникальных ключей, а другие позволяют использовать повторяющиеся ключи. При программировании это надо учитывать. 3
• В общем случае полагается, что в каждой записи содержится несколько атрибутов, и необходимо найти все записи с некоторыми значениями этих атрибутов. • Определение требуемых записей называется запросом (query). Обычно запросы подразделяются на следующие три типа: 4
• Простой запрос, определяющий конкретное значение некоторого атрибута, – например "СПЕЦИАЛИЗАЦИЯ=МАТЕМАТИКА" или "МЕСТОЖИТЕЛЬСТВО. ГОРОД=БРЯНСК” • Запрос диапазона, запрашивающий определенный диапазон значений некоторого атрибута, – • например "ЦЕНА < $18. 00" или "21 < ВОЗРАСТ < 23". Логический запрос, состоящий из запросов предыдущих типов, скомбинированных при помощи логических операций AND, OR, NOT, – например "(КУРС = ВТОРОКУРСНИК) AND (МЕСТОЖИТЕЛЬСТВО. ГОРОД=БРЯНСК)AND NOT ((СПЕЦИАЛИЗАЦИЯ=МАТЕМАТИКА) OR (СПЕЦИАЛИЗАЦИЯ = СТАТИСТИКА)) ". 5
• Алгоритм поиска является некоторым алгоритмом, который воспринимает некоторый ключ “а” и пытается идентифицировать некоторую запись, ключ которой равен “а”. • Часто бывает желательно добавить некоторую новую запись с некоторым аргументом в качестве ключа. Алгоритм, который выполняет эту функцию, называется алгоритмом поиска и вставки. • Иногда бывает необходимо вставить некоторую запись с первичным ключом key в некоторый файл без первоначального поиска другой записи с этим же самым ключом. В этом случае необходим алгоритм вставки. • В дальнейшем будим исследовать и обсуждать относительную эффективность различных алгоритмов поиска, поиска со вставкой и вставки. 6
• В качестве объекта поиска может быть массив записей, связанный список, дерево или даже граф. • Различные методы поиска могут соответствовать различным организациям таблиц. Поэтому таблицы часто строятся исходя из соображений конкретного метода поиска. • Такая таблица может полностью располагаться в оперативной памяти, или во вспомогательной памяти, или и там. • Методы поиска, при которых вся таблица постоянно находится в оперативной памяти, называются методами внутреннего поиска, а те методы для которых большая часть таблицы хранится во вспомогательной памяти, называются методами внешнего поиска. 7
Классификация методов поиска • Поиск по ключу - Поиск осуществляется путём сравнения заданного ключа с ключом в записи таблиц • Контекстный поиск осуществляется поиск строк и подстрок • Полнотекстовый поиск осуществляет поиск документов по их содержанию • Ассоциативный (нечёткий) поиск используется в автоматических переводчиках, при распознавании текста, в различных интеллектуальных системах • Исчерпывающий поиск осуществляется перебор всех вариантов стратегии решения задачи • Геометрический поиск осуществляется поиск геометрических объектов • Многомерный поиск 8
Поиск по ключу • Последовательный поиск (ПП) ПП в массиве ПП в связной структуре Splay trees • Индексно-последовательный поиск (ИПП) ИПП с помощью индексов первого и второго уровней Интерполяционный поиск • Логарифмический поиск в статических таблица (поразрядный поиск) Бинарный поиск Цифровой поиск Trie-деревья Patricia-деревья Многопутевые Trie-деревья • Логарифмический поиск в динамических таблицах Случайные деревья бинарного поиска AVL-деревья ВВ-деревья RB-деревья В-деревья • Хеширование • Поиск во внешней памяти • Поиск по вторичным ключам 9
Контекстный поиск использует следующие алгоритмы • Простейший алгоритм точного поиска строк • Алгоритм Боуера – Мура • Алгоритм Кнута –Мориса – Пратта • Сравнение частей строк • Получисленное сравнение строк • Суффиксные деревья • SR – деревья • алгоритм СДВИГ-И 10
Полнотекстовый поиск • Использование синонимов и антонимов (морфология) • Использование тезаураса • Нейросетевые модели • Тематический анализ • Статистические алгоритмы 11
Ассоциативный (нечёткий) поиск • Нечеткий поиск на основе сетей Хэмминга • Триангуляционные деревья • VP-tree (Vantage Point-деревья) • FQ-деревья • Метрические деревья • N-gram • Trie-деревья 12
Исчерпывающий поиск • • Перебор с возвратом Метод ветвей и границ Динамическое программирование Метод решета 13
Геометрический поиск • • • Поиск по точному совпадению (Exact Match Query) Поиск объекта, содержащего точку (Point Query). Поиск по области (Range Query). Поиск покрывающих объектов (Overlap Query). Поиск вмещающего объекта (Enclosure Query). Поиск вхождений (Containment Query) Поиск соседей (Adjacency Query). Поиск ближайшего соседа (Nearest Neighbor Query). Запрос всех пар элементов, удовлетворяющих условию (Spatial Join). 14
Многомерный поиск Многомерные деревья – k-d-деревья – Многомерные B-деревья – R-деревья Многомерное хеширование – Схемы хеширования с каталогом – функция хеширования использует дополнительные данные, сохраненные на диске (Файл-решетка, EXCELL). – Схемы хеширования без каталога – функция хеширования основана только на математических вычислениях, без использования дополнительных данных (MOLHPE, PLOP). 15
Последовательный поиск • Простейшей формой поиска является последовательный поиск. • Этот поиск применяется к структурам типа массива, связанного списка или расширяющихся деревьев (splay trees). • Как правило, последовательный поиск используется для неупорядоченных структур данных. 16
• Алгоритм поиска сводится к последовательному перебору ключей и сравнению их с заданным, зависит от вида структуры • Алгоритм поиска со вставкой также зависит от вида структуры данных. • В случае использования вставки в массиве необходимо выделить достаточно памяти для него. 17
Существуют и другие приемы, повышающие эффективность вставки в массив. Например, нахождение удалённой записи и вставка на её место новой записи В случае связанного списка не надо выделять дополнительную память, более эффективно удаляются и вставляются записи Если часто используемые записи поместить в начало файла (расширяющиеся деревья –splay trees) среднее число сравнений сильно уменьшится. Применяется для связных структур Другой метод, метод транспозиции, улучшает последовательный поиск заменой найденной 18 записью предыдущей
• В общем случае метод транспозиции дает более эффективный поиск, чем метод перемещения в начало списка для тех списков, в которых вероятность поиска заданного ключа остается постоянной во времени. • Однако метод транспозиции требует большего времени для достижения максимальной эффективности, чем метод перемещения в начало. Другое преимущество метода транспозиции - одинаковая эффективность применения к массивам и спискам. • Поэтому рекомендуется смешанная стратегия. Вначале используется метод перемещения в начало для быстрого переупорядочивания, а затем используется метод транспозиции для поддержания списка. 19
Особенности поиска в упорядоченной структуре. • Если запись с заданным ключом отсутствует, то для обнаружения этой ситуации в не отсортированном списке надо n сравнений, а в отсортированном (n+1)/2 сравнений. • Если структура данных упорядочена, то существуют несколько методов, используемых для увеличения эффективности поиска. • Например, если и структура данных и список запросов отсортированы, то может быть выполнен последовательный поиск с одновременным продвижением и по структуре, и по списку запросов. Причем каждый последующий поиск начинается с конца предыдущего поиска. 20
Индексно - последовательный поиск • Суть метода - в дополнение к отсортированному файлу формируется некоторая вспомогательная таблица, называемая индексом. • Каждый элемент индекса состоит из ключа k index и указателя на запись в файле pindex, соответствующего этому ключу. Элементы в индексе также как и элементы файла должны быть отсортированы по этому ключу. • Если индекс имеет размер составляющий одну десятую от размера файла, то каждая десятая запись представлена первоначально в индексе. 21
• Последовательный поиск выполняется по меньшему индексу, а не по большей таблице. Когда найден правильный индекс, второй последовательный поиск выполняется по небольшой части записей. • Индекс применяется как для списка, так и для массива. • Использование связанного списка приводит к нескольким большим накладным расходам по пространству для указателей, хотя вставки и удаления могут быть выполнены проще. • Если структура данных является такой большой, что даже использование индекса не дает достаточной эффективности, то может быть использован индекс 2 го уровня. 22
• Индекс второго уровня действует как индекс для первичного индекса, который указывает на элементы в последовательной структуре данных. • Удаления из индексно - последовательной структуры могут быть сделаны наиболее простым способом - при помощи отметки удаленных записей флагом. Индекс изменять не надо. • Вставка в индексно - последовательную структуру является более трудной, поскольку между двумя уже существующими элементами структуры может не быть свободного места, что приводит к необходимости сдвигать большое число элементов структуры. • В общем случае, когда формируется структура данных, в ней расставляются пустые записи, чтобы оставить место для вставок 23
Интерполяционный поиск • В определенном смысле алгоритм имитирует поиск фамилии в телефонном справочнике. • Если нужное слово начинается с буквы 'А', вы наверное начнете поиск где-то в начале справочника. • Если Вы заметите, что искомое слово должно находиться гораздо дальше открытой страницы, вы пропустите порядочное их количество, прежде чем сделать новую попытку. Это в корне отличается от других алгоритмов, не делающих разницы между 'много больше' и 'чуть больше'. 24
при выполнении итерации поиска между элементами А [l] (крайним слева) и А [r] (крайним справа), алгоритм предполагает, что значения в массиве растут линейно (отличие от линейности может влиять на эффективность, но не на корректность данного алгоритма). В соответствии с этим предположением, значение v ключа поиска сравнивается с элементом, индекс которого вычисляется (с округлением) как координата х точки на прямой, проходящей через (l, А [l]) и (r, А [r]), координата у которой равна значению v (см. рис. 5. 15). 25
• Записав стандартное уравнение для прямой, проходящей через две точки (l, А [l]) и (r, А [r]), заменив в нем у на v и решая его относительно х, получим формулу. Логика, лежащая в основе этого метода, проста. Мы знаем, что значения массива возрастают (точнее говоря, не убывают) от А [l] до А [r], но не знаем, как именно. Пусть это возрастание — линейное (простейшая из возможных функциональных зависимостей); в таком случае вычисленное по формуле значение индекса — ожидаемая позиция элемента со значением, равным v. Конечно, если v не находится между А[l] и А[r], формулу применять не следует 26 (почему? ).
• После сравнения v с А[x] алгоритм либо прекращает работу (если они равны), либо продолжает поиск тем же способом среди элементов с индексами либо от l до x — 1, либо от х + 1 до r, в зависимости от того, меньше ли v значения А [х] или больше. • Если взять последовательность с линейным возрастанием • 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, • то для поиска заданного ключа методом бинарного поиска необходимо четыре сравнения, а методом интерполяционного поиска одно сравнение. • Если взять случайно возрастающую последовательность • 9, 17, 25, 33, 34, 35, 49, 67, 69, 85, 86, 94, 96, 105, 106, 108, • то для поиска заданного ключа (например Х=33) методом бинарного поиска требуется 4 сравнения, а методом интерполяционного поиска 3 сравнения. 27
• Анализ эффективности данного алгоритма показывает, что интерполяционный поиск в среднем требует менее log 2 n+1 сравнений ключей при поиске в списке из n случайных значений. Эта функция растет настолько медленно, что для всех реальных практических значений n ее можно считать константой. Однако в наихудшем случае интерполяционный поиск вырождается в последовательный, который рассматривается как наихудший из возможных (почему? ). • В качестве последнего замечания по поводу сравнения интерполяционного поиска с бинарным приведем мнение Седжвика, считающего, что бинарный поиск, вероятно, более выгоден для небольших входных данных, но для файлов большого размера и для приложений, в которых сравнение или обращение к данным — дорогостоящая операция, лучше использовать интерполяционный поиск. 28
• Логарифмический поиск в статических таблица (поразрядный поиск) Бинарный поиск Цифровой поиск Trie-деревья Patricia-деревья Многопутевые Trie-деревья Поиск осуществляется по части ключа по алгоритмам применительно к соответствующим деревьям, рассмотренным ранее 29
Бинарный поиск • Наиболее эффективным методом поиска в упорядоченном массиве без использования вспомогательных индексов или таблиц является бинарный поиск. • При поиске в таблице суть метода состоит в том, что аргумент сравнивается с ключом среднего элемента. Если они равны, то поиск успешно закончился. В противном случае поиск должен быть осуществлен в верхней или нижней части таблицы аналогично. • Бинарный поиск наилучшим образом может быть определен рекурсивно. • Однако, большие накладные расходы, связанные с рекурсией, делают ее неподходящей для использования в практических ситуациях, в которых эффективность является главным фактором 30
• При поиске в связной структуре вначале аргумент поиска сравнивается с ключом, находящимся в корне. Если аргумент совпадает с ключом, поиск закончен, если же не совпадает, то в случае, когда аргумент поиска оказывается меньше ключа, поиск продолжается в левом поддереве, а в случае, когда аргумент оказывается больше ключа, —в правом поддереве. Поиск считается неудачным, если при достижении листьев совпадение не обнаруживается. В противном случае к этому моменту поиск должен закончиться успехом. • Каждое сравнение в бинарном поиске уменьшает число возможных кандидатов в два раза. Следовательно максимальное число сравнений ключа равно log 2 n. • Бинарный поиск может быть использован совместно с индексно- последовательной структурой данных. • К сожалению, алгоритм бинарного поиска может быть использован только для упорядоченного массива. 31
• Затраты времени на поиск по бинарному дереву поиска оказываются такими же, как и затраты времени на поиск в упорядоченной таблице с использованием метода деления пополам. • Если множество ключей фиксировано, как в вышеприведенном случае, то нет особого преимущества в программе, опирающейся на использование бинарного дерева поиска. Более выгодным, скорее, можно считать метод поиска делением таблицы пополам, поскольку программа при этом оказывается сравнительно простой; в представлении такой структуры данных также особой сложности нет. 32
• В случае, когда множество ключей заранее неизвестно или когда это множество ключей меняется, вставки и удаления ключей в таблице оказываются довольно трудоемкими. Более рационально использовать в таком случае бинарное дерево поиска, которое позволяет значительно проще вставлять и удалять элементы. Например, если необходимо построить таблицу частоты использования отдельных слов в некотором тексте на естественном языке, то для представления таблицы в памяти лучше использовать бинарное дерево поиска. • С другой стороны, если сравнивать поиск по дереву с методом хеширования, который будет рассмотрен ниже, то оказывается, что поиск по бинарному дереву хотя и уступает методу хеширования в части затрат времени на сам поиск, но имеет и свои преимущества: сравнительно высокий коэффициент использования памяти для размещения данных, возможность получать упорядоченный в алфавитном порядке список ключей. 33
• Логарифмический поиск в динамических таблицах Случайные деревья бинарного поиска AVL-деревья ВВ-деревья RB-деревья В-деревья • Поиск осуществляется по алгоритмам применительно к соответствующим деревьям, рассмотренным ранее 34
Поиск.ppt