Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
S-TEZISY.DOC
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.42 Mб
Скачать

Поиск в массивах. Поиск в строке. Поиск в массивах

Поиск в массивах очень часто встречается в приложениях

Массивы представляют собой следующие структуры

a: array [0 .. N – 1 ] of item;

Тип item – это запись, содержащая некоторый ключ. Обычно выполняется поиск записи с ключом, равным некоторому значению. Поиск сводится к нахождению такого индекса i, что a[i].key = x

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

i:= 0;

while (i<N) and (a[i] <> x) do i:= i + 1;

Поиск с барьером

// Инициализация массива а, содержащего целые числа

initarray(PoiskMemo.Text);

x:= StrToInt(poiskEdit.Text); // значение для поиска

a[N]:= x; // барьер

// пример поиска с барьером для целых чисел

i:= 0;

while (a[i]<>x) do i:= i+1;

if i=N then rezLabel.Caption:= 'Не найден !!!'

else rezLabel.Caption:= 'Найден !!! ' + IntToStr(x);

Поиск делением пополам (двоичный поиск)

Мы предполагаем, что массив упорядочен в порядке возрастания ключей:

Ak: 1<= k < N : ak-1 <= ak

В этом случае можно ускорить поиск. Пусть требуется найти первый элемент массива равный x.

Алгоритм поиска:

  1. Выбираем некоторый элемент (лучше ближе к середине) am и сравниваем его с искомым значением x.

  2. Если am равен x, то поиск заканчивается.

  3. Если am < x, то все элементы с индексами <= m можно исключить из дальнейшего поиска.

  4. Если am > x, то все элементы с индексами >= m можно исключить из дальнейшего поиска.

Пусть L и R – соответственно левый и правый концы секции массива, где еще можно обнаружить требуемый элемент.

L:= 0; R:= N-1; found:= false;

while ( (L<=R) and (not found) )do begin

m:= любое значение между L и R

if a[m] = x then found:= true

elseif a[m] < x then L := m + 1

else R:= m – 1;

end;

Вирт пытается описать весь этот процесс математически.

Инвариант цикла - это условие, выполняющееся перед каждым шагом цикла.

(L <= R) & (Ak: 0 <= k < L: ak < x ) & (Ak: R < k < N: ak > x )

Здесь ожидаемое число сравнений будет LogN (для линейного поиска N/2)

Отказываемся от желания закончить поиск при обнаружении совпадения. Это ускоряет работу алгоритма. Условие окончания поиска L >= R

// Поиск делением пополам (двоичный)

m:= 0;

L:= 0; R:= N; x:= StrToInt(poiskEdit.Text);

while L<R do begin

m := (L+R) div 2; // ...L....m....R....

if a[m] < x then L:= m+1 else R := m;

end;

if L=R then m:= R;

if x<>a[m] then rezLabel.Caption:= 'Не найден !!!'

else rezLabel.Caption:= 'Найден !!! ' + IntToStr(a[R]);

Достижимо ли “Условие окончания поиска L >= R”.

Для доказательства достаточно доказать, что R – L убывает.

Но в начале каждого шага цикла L < R. Поэтому среднее L <= m < R. Далее либо L увеличивается, либо R уменьшается.

Лекция 5.

. Сортировка массивов. Общие сведения о Сортировке. Сортировка с помощью прямого включения.

Сортировка – это процесс упорядочивания (перегруппировки) данного множества объектов в некотором определенном порядке. Обычно в качестве множества выступает массив. Существует несколько различных методов сортировки. Некоторые объекты в современных языках располагают средствами задать сортировку, входящих в их состав элементов. Например, в Delphi TlistBox имеет свойство Sorted. При установке Sorted в true элементы списка сортируются в алфавитном порядке. При этом слова с большими и маленькими буквами не различаются.

Основные методы сортировки:

  • Сортировка с помощью прямого включения.

  • Сортировка с помощью прямого выбора.

  • Сортировка с помощью прямого обмена (пузырьковая сортировка).

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