Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации 2часть / Лекция_21_Поиск и сортировка.ppt
Скачиваний:
26
Добавлен:
11.05.2015
Размер:
115.71 Кб
Скачать

Тема 3a. Поиск и сортировка

Зачем нужны сортировка и поискПоиск в массиве записейСортировка массивовПрямые методы сортировки

07/02/19

1

Зачем нужны сортировка и поиск

Вся человеческая деятельность связана с поиском и упорядочиванием.

Утром встаешь, ищешь тапочки, нужно позвонить – ищешь номер телефона, идешь в библиотеку – ищешь нужную книгу и т.д.

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

Почему так устроена человеческая натура?

07/02/19

2

Зачем нужны сортировка и поиск

Оказывается потому, что поиск в упорядоченном массиве значительно эффективнее!

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

Перед программистом возникает ряд вопросов:

По каким алгоритмам осуществляются поиск и сортировка?

Насколько эффективнее поиск в упорядоченном массиве?

Третий том книги Дональда Кнута «Искусство программирования» в целом считается последним словом в области методик поиска и сортировки.

07/02/19

3

Организация работы с базами данных

Используя структурированный тип Record, создаются массивы записей всевозможных баз данных (информация о студентах Вуза, информация о товарах в магазине,….).

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

Работа с базой может быть организована двумя способами:

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

2) В начале работы вся база (или ее необходимая часть) считывается в массивы записей и вся обработка производится в оперативной памяти, что значительно сокращает время обработки,

однако требует затрат оперативной памяти.

07/02/19

4

Для определенности в дальнейшем тип массива записей введем следующим образом

type

 

 

 

Tinf=<описать

свой

тип

информации>;

Tk= <описать

свой

тип

ключа>;

Tzp=record

zp:Tinf;//поле информации

k:Tk;//поле ключа

end;

Mas=array[1..1] of Tzp;//Массив записей

Tmas=^mas;

Begin

n:=. . .;

getmem(a,n*sizeof(Tzp));

07/02/19

5

Ключ записи, требования к нему

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

В зависимости от решаемой задачи ключом может, например, служить фамилия или учетный номер или адрес.

Основное требование к ключу в задачах поиска и сортировки состоит в том, чтобы операция проверки на равенство была корректной.

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

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

Желательно, чтобы в массиве записей не было повторяющихся

ключей.

6

07/02/19

Наиболее частыми операциями при работе с базами данных являются «поиск» и «сортировка» записей по ключу.

Алгоритмы решения этих задач существенно зависят от того, организованы записи в массивы или размещены на диске.

07/02/19

7

Поиск в массиве записей

постановка задачи

Задача поиска требуемого элемента в массиве записей a[i], i=1..n заключается в нахождении индекса i удовлетворяющего условию

a[i].k=x.

Здесь ключ k выделен в отдельное поле, x - аргумент поиска того же типа что и k.

После нахождения i обеспечивается доступ ко всем другим полям найденной записи a[i].

07/02/19

8

Линейный поиск

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

Он представляет собой последовательный перебор массива до обнаружения требуемого ключа или до конца, если ключ не обнаружен:

 

i:=1; n1:=n+1;

While (a[i].k<>x) and (i<n1) do i:=i+1;

if i=n1 then ’элемент не найден

 

else элемент I’;

 

Видно, что на каждом шаге требуется увеличивать индекс и

 

вычислять логическое выражение с двумя проверками.

07/02/19

9

Эффективность Линейного поиска

Так как элемент х с равной вероятностью может быть

как вначале, так и в конце массива, то среднее количество повторений в цикле равно n/2.

Ввиду того, что в приведенном алгоритме в каждом цикле две проверки, его эффективность (по к-ву

проверок) пропорциональна количеству элементов n, что обозначается О(n).

А можно ли уменьшить здесь затраты на поиск?

07/02/19

10