
- •Тезисы лекций
- •Тип данных
- •Лекция 2. Списки, стеки, очереди.
- •Поиск в массивах. Поиск в строке. Поиск в массивах
- •Сортировка с помощью прямого включения.
- •Сортировка с помощью двоичного включения.
- •Сортировка двумерных массивов
- •Лекция 8. Основные понятия рекурсии. Простейшие примеры реализации.
- •Когда не надо применять рекурсию.
- •Лекция 9. Рекурсия и кривые. Рекурсивная реализация
- •Лекция 10. Алгоритмы с возвратом.
- •Тема 3.3. Алгоритмы с возвратом.
- •Лекция 11. Данные с динамической структурой. Рекурсивная структура данных.
- •Лекция 11a. Классы
- •Лекция 12. Графы
- •Лекция 13. Частично упорядоченные множества. Топологическая сортировка.
- •Лекция 14. Определение дерева. Поддеревья, элементы дерева. Основные понятия и определения
- •Лекция 15. Поиск и включение для бинарных деревьев.
- •Рекомендуемая литература
Поиск в массивах. Поиск в строке. Поиск в массивах
Поиск в массивах очень часто встречается в приложениях
Массивы представляют собой следующие структуры
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.
Алгоритм поиска:
Выбираем некоторый элемент (лучше ближе к середине) am и сравниваем его с искомым значением x.
Если am равен x, то поиск заканчивается.
Если am < x, то все элементы с индексами <= m можно исключить из дальнейшего поиска.
Если 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 элементы списка сортируются в алфавитном порядке. При этом слова с большими и маленькими буквами не различаются.
Основные методы сортировки:
Сортировка с помощью прямого включения.
Сортировка с помощью прямого выбора.
Сортировка с помощью прямого обмена (пузырьковая сортировка).