Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 2012 / Тема 9 - Сортировка и методы поиска.doc
Скачиваний:
36
Добавлен:
16.03.2015
Размер:
99.33 Кб
Скачать

Методы поиска

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

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

Последовательный поиск

Алгоритм последовательного поиска имеет очень простой вид. Ниже представлена функция, которая выполняет поиск в символьном массиве заданной длины элемента с заданным значением ключа:

function Search(A: MyArray; n:integer; key:Integer):integer;      var        t:integer;      begin        t:=1;        while (key<>A[t]) and (t<=n) t:=t+1;        if t>n then Search:=0        else Search:=t;      end; { конец последовательного поиска }

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

Двоичный поиск

Если данные отсортированы, то может использоваться очень хороший метод поиска, названный двоичным поиском. Сначала производится проверка среднего элемента. Если его ключ больше ключа требуемого элемента, то делается проверка для среднего элемента из первой половины. В противном случае делается проверка среднего элемента из второй половины. Этот процесс повторяется до тех пор, пока не будет найден требуемый элемент или не будет больше элементов для проверки. Например, для поиска числа 4 в массиве 1 2 3 4 5 6 7 8 9 указанным методом сначала делается проверка среднего элемента, которым является число 5. Поскольку этот элемент больше 4, поиск будет продолжен в первой половине массива, т.е. среди чисел 1 2 3 4 5. Здесь средним элементом является 3. Это значение меньше 4 и поэтому первая половина не будет больше рассматриваться и поиск продолжается среди чисел 4 и 5. На следующем шаге нужный элемент будет найден. При двоичном поиске число сравнений в худшем случае равно log n. Для среднего случая это значение будет несколько лучше, а в лучшем случае оно равно единице.

function BSearch (A: MyArray; n:integer; key:Integer):integer;      var        low, high, mid: integer;        found:boolean;      begin        low:=1; high:=n;        found:=false;         { не найден }        while (low<=high) and (not found) do        begin          mid:=(low+high) div 2;          if key<A[mid] then high:=mid-1          else if key>A[mid] then low:=mid+1          else found:=true;  { найден }        end;        if found then BSearch:=mid        else BSearch:=0;  { не найден }      end; { конец поиска }