Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
otvety_SAOD_5_shrift_1.doc
Скачиваний:
8
Добавлен:
23.09.2019
Размер:
2.1 Mб
Скачать

55. Похожа на многофазную сортировку. Отличие заключается в самом процессе слияния:

сначала проводится (f-1) — путевое слияние в f-ый файл до тех пор, пока файл с номером f-1 не опустеет; затем (f-ый файл уже не затрагивается) проводится (f-2) — путевое слияние в (f-1)-ый файл;

затем (f-3) — путевое в (f-2)-ый файл; ...; потом двухпутевое слияние в третий файл, а в конце копирование из файла номером 2 в первый файл.

Следующий проход работает по аналогичной схеме, только в обратном направлении.

Количество серий в каждом из вспомогательных файлов определяется в соответствии с формулами:

a1° =1 ai° =0, i = 2,3,. , f

a1N = ai+1L +af-iL-1 , i = f-1, f-2,..., 1

Каскадное слияние эффективно при количестве файлов >6.

56. В простейшем случае ключ является некоторым полем внутри записи, располагающимся с некоторым конкретным сдвигом от начала записи. Такой ключ - внутренний или встроенный. В других случаях ключом является относительная позиция записи внутри файла или имеется некоторая отдельная таблица ключей, которая содержит указатели на записи. Такие ключи - внешние.

Различают два типа ключей:

Для каждого файла имеется по крайней мере один набор ключей (возможно и несколько таких наборов), которые являются уникальными (т. е. никакие две записи в файле не имеют одинакового значения ключа). Такой ключ называется первичным ключом. Например, если в некотором файле с фамилиями и адресами название города используется как ключ для некоторого поиска, то он, возможно, не будет уникальным, так как в файле могут содержатся две записи с названием одного и того же города. Такой ключ называется вторичным ключом.

3 типа запросов:

1. Определяет конкретное значение ключа.

2. Запрос диапазонов значения ключа.

3. Логический запрос. Комбинация предыдущих запросов при помощи логических операций.

Классификация поиска:

Поиск по ключу; контекстный поиск; исчерпывающий поиск; полнотекстовый поиск; нечеткий поиск; геометрический; многомерный.

57. Этот поиск применяется к структурам типа

массива или связанного списка (для неупорядоченных структур). В худшем случае сложность алгоритма O(n)

Для того, чтобы использовать последовательный поиск со вставкой для некоторого массива, необходимо выделить достаточно памяти для него. Имеется другой метод, при котором нет необходимости периодически уплотнять массив, но который дает меньшую эффективность при отдельных вставках. Суть метода состоит в последовательном просмотре массива в поисках некой удаленной записи и вставки

поверх ее новой записи. Другой метод состоит в связывании всех удаленных записей, и использование этого пространства для

стека с дальнейшим использованием его для вставки. Однако эти методы не приемлемы, если записи должны располагаться в том порядке, в котором они вставлялись.

Если часто используемые записи поместить в начало файла, среднее число сравнений сильно уменьшится. Число обращений к этой записи.

Индексно - последовательный поиск.

В дополнение к отсортированному файлу заводится некоторая вспомогательная таблица, называемая индексом. Каждый элемент индекса состоит из ключа k index и указателя на запись в файле pindex, соответствующего этому ключу. Элементы в индексе также как и элементы файла должны быть отсортированы по этому ключу. Если индекс имеет размер составляющий одну восьмую от размера файла, то каждая восьмая запись представлена первоначально в индексе.

Последовательный поиск выполняется по меньшему индексу, а не по большей таблице. Когда найден правильный индекс, второй последовательный поиск выполняется по небольшой части записей. Индекс применяется как для списка так и для массива. Использование связанного списка приводит к нескольким большим накладным расходам по

пространству для указателей, хотя вставки и удаления могут быть выполнены проще.

Если структура данных является такой большой, что даже использование индекса не дает достаточной эффективности, то может быть использован индекс 2 го уровня.

Индекс второго уровня действует как индекс для первичного индекса, который указывает на элементы в последовательной структуре данных. Удаления из индексно - последовательной структуры могут быть сделаны наиболее простым способом - при помощи отметки удаленных записей флагом. Индекс изменять не надо. Вставка в индексно - последовательную структуру является более трудной, поскольку между двумя уже существующими элементами структуры может не быть свободного места, что приводит к необходимости сдвигать большое число элементов структуры.

58. При поиске в таблице суть метода состоит в том, что аргумент сравнивается с ключом среднего элемента. Если они равны, то поиск успешно закончился. В противном случае поиск должен быть осуществлен в верхней или нижней части таблицы аналогично.

Бинарный поиск наилучшим образом может быть определен рекурсивно. Однако, большие накладные расходы, связанные с рекурсией, делают ее неподходящей для использования в практических ситуациях, в которых эффективность является главным фактором. При поиске в связной структуре вначале аргумент поиска сравнивается с ключом, находящимся в корне. Если аргумент совпадает с ключом, поиск закончен, если же не совпадает, то в случае, когда аргумент поиска оказывается меньше ключа, поиск продолжается в левом поддереве, а в случае, когда аргумент оказывается больше ключа,—в правом поддереве. Поиск считается неудачным, если при достижении листьев совпадение не обнаруживается. В противном случае к этому моменту поиск должен закончиться успехом. Каждое сравнение в бинарном поиске уменьшает число возможных кандидатов в два раза. Следовательно максимальное число сравнений ключа равно log2n. Бинарный поиск может быть использован совместно с индексно- последовательной структурой данных. алгоритм бинарного поиска может быть использован только для упорядоченного массива. Затраты времени на поиск по бинарному дереву поиска оказываются такими же, как и затраты времени на поиск в упорядоченной таблице с использованием метода деления пополам. В случае, когда множество ключей заранее неизвестно или когда это множество ключей меняется, вставки и удаления ключей в таблице оказываются довольно трудоемкими. Более рационально использовать в таком случае бинарное дерево поиска, которое позволяет значительно проще вставлять и удалять элементы.

59. В определенном смысле алгоритм имитирует поиск фамилии в телефонном справочнике. Если нужное слово начинается с буквы 'А', вы наверное начнете поиск где-то в начале справочника. Если Вы заметите, что искомое слово должно находиться гораздо дальше открытой страницы, вы пропустите порядочное их количество, прежде чем сделать новую попытку.

при выполнении итерации поиска между элементами А [l] (крайним слева) и А [r]

(крайним справа), алгоритм предполагает, что значения в массиве растут линейно (отличие от линейности может влиять на эффективность, но не на корректность данного алгоритма).

В соответствии с этим предположением, значение v ключа поиска сравнивается с элементом, индекс которого вычисляется (с округлением) как координата х точки на прямой, проходящей через (l, А [l]) и (r, А [r]), координата у которой равна значению v.

Записав стандартное уравнение для прямой, проходящей через две точки (l, А [l]) и (r, А[r]), заменив в нем у на v и решая его относительно х, получим формулу.

Логика, лежащая в основе этого метода, проста. Мы знаем, что значения массива возрастают (точнее говоря, не убывают) от А [l] до А [r], но не знаем, как именно. Пусть это возрастание — линейное (простейшая из возможных функциональных зависимостей); в таком случае вычисленное по формуле значение индекса — ожидаемая позиция элемента со значением, равным v. После сравнения 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 сравнения.

Интерполяционный поиск в среднем требует менее log2 log2 n+1 сравнений ключей при поиске в списке из n случайных значений. Бинарный поиск, более выгоден для небольших входных данных, но для файлов большого размера и для приложений, в которых сравнение или обращение к данным — дорогостоящая операция, лучше использовать интерполяционный поиск.

60. Если ключи цифровые, то их можно представить с помощью леса.

180,195,1867

В каждой вершине такого дерева хранится полный ключ, но переход по левой или правой ветви происходит не путем сравнения ключа-аргумента со значением ключа, хранящегося в вершине, а на основе значения очередного бита аргумента. Поиск начинается от корня дерева. Если содержащийся в корневой вершине ключ не совпадает с аргументом поиска, то анализируется самый левый бит аргумента. Если он равен 0, происходит переход по левой ветви, если 1 - по правой. Если не обнаруживается совпадение ключа с аргументом поиска, то анализируется

следующий бит аргумента и т.д., пока либо не будут проверены все биты аргумента, или мы не наткнемся на вершину с отсутствующей левой или правой ссылкой. Длина поиска не превышает количество разряда ключа. Для большого количества ключей, большое дерево почти идеально сбалансировано. Если ключи располагаются достаточно плотно, то процесс поиска по цифровому дереву неэффективен. У дерева представленного как некоторый двумерный массив БОР, каждая строка массива представляет 1 из возможных символов, а каждый столбец представляет узел в цифровом дереве. Каждый элемент такого массива является либо указателем на другой столбец, либо ключ и его запись.

61. Mожно произвести над ключом K некоторое арифметическое вычисление и получить функцию f(K), указывающую адрес в таблице, где хранится ключ K и ассоциированная с ним информация. Основная идея ассоциативной адресации состоит в том, чтобы рассматривать адрес как функцию от ключа. Требуется, чтобы этот адрес вычислялся как можно проще и как можно быстрее. Идея хеширования состоит в том, чтобы взять некоторые характеристики ключа и использовать полученную частичную информацию в качестве основы поиска. Вычисляемая функция f(K) будет называться хеш-функцией и это значение будет браться в качестве адреса начала поиска. Хеш-таблица – это обычный массив с адресацией, задаваемой хеш-функцией. Размер хеш-таблицы m должен быть достаточно большим, чтобы в ней оставалось разумно большое число пустых мест. Если число записей n невелико и заранее известно, то можно построить идеальную хеш-функцию. Если же число записей велико, то найти такую функцию очень сложно.

В случае, когда в результате хеширования ключи претендуют на один и тот же адрес приходится отказываться от идеи однозначности.. Отказ от требования взаимно однозначного соответствия между ключом и адресом означает, что для двух различных ключей k1 k2 значение хеш-функции может совпадать: h(k1) = h(k2). Такая ситуация называется коллизией.

Для метода хеширования главными задачами являются: – выбор хеш-функции h так, чтобы уменьшить число коллизий;

– нахождение способа разрешения возникающих коллизий, т.е. где разместить конфликтные записи - внутри самого массива или вне его.

Мерой использования памяти в таблицах с прямым доступом служит коэффициент заполненности, отношение числа записей к числу мест в таблице α = n/m.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]