Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Алгоритмы поиска в фиксированной группе данных




(4 часа)

 

 

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

 

Домашнее задание:

1. Изучить алгоритмы поиска по ключу в статических массивах: линейный поиск, бинарный поиск.

2. Изучить поиск в таблице, как разновидность поиска в массиве, когда ключ является составным объектом – строкой. Освоить алгоритмы поиска подстроки в строке: прямой, использующий метод деления пополам, алгоритм Кнута, Морриса и Пратта (КМП).

 

Теоретические сведения.

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

1. Следует заметить, что если массив не отсортирован, то поиск линейный: последовательный просмотр элементов массива и сравнение каждого ,в процессе просмотра ,с ключом поиска до тех пор, пока либо не будет найдено совпадение с ключом, либо массив просмотрен до конца, а совпадений нет.

2. второй простейший алгоритм поиска -- для отсортированного массива (для определенности пусть элементы массива расположены по возрастанию).

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

Пусть в отсортированном массиве требуется найти элемент со значением x, или указать, что такого элемента там нет. Выберем средний элемент. Для этого элемента относительно значения x возможны три случая:

1. элемент равен x (поиск завершен);

2. элемент больше x (поиск необходимо продолжить в левой части массива);

3. элемент меньше x (поиск необходимо продолжить в правой части массива).

В случаях 2-3 поиск (если это ещё возможно) продолжается. Для этого в выделенной части массива вновь выбирается средний элемент и проводятся аналогичные рассуждения. И т.д., до тех пор, пока поиск не будет завершен.

Поиск завершается в одном из двух случаев:

1. элемент найден;

2. элемент не найден (это констатируется в том случае, когда длина области поиска уменьшилась до нуля, т.е. левая и правая границы области поиска сомкнулись).

Рассмотрим программную реализацию алгоритма.

 L := 1; R := n; {изначально область поиска - весь массив}

repeat

c := (L + R) div 2; {индекс среднего элемента}

if a[c] > x then R := c - 1; {случай 2}

if a[c] < x then L := c + 1; {случай 3}

until (a[c]=x) or (L > R);

if a[c]=x then find:=c else find := 0; {возвращем индекс элемента или нуль, если элемент не найден}

 

Порядок выполнения работы.

 

1. Открыть проект Delphi Structures.

2. Добавить в управляющее главное меню пункт «Лабораторная работа №2», при выборе которого должно появляться окно модуля «Poisk» (модуль «Poisk» с формой добавить в проект).

3. Установить на форму модуля Poisk компоненты, обеспечивающие ввод исходных данных, управляющую кнопку (класса TButton или TBitBtn) и компоненты для вывода результатов на экране в соответствии с вариантом задания таблицы №2.1.

4. В обработчике события onClick управляющей кнопки на языке

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

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

5. произвести анализ запрограммированного алгоритма (по количеству сравнений).

6. Составить отчет и защитить работу преподавателю. В отчете обязательно представить блок-схему алгоритма решения задачи.

 


Таблица 2.1

№ вар. Текст задачи
1. Дан массив целых чисел х: var x: array [1..20] of 1..21; и объявлен элемент y: y:1..21; Пусть все элементы массива х различны и расположены по убыванию. Используя бинарный поиск, найти y-то единственное целое число y є [1..21], которого нет в этом массиве.
2. const n=50; var х: array [1..n] of integer; р: integer; Пусть первые (n-1) элемент массива х упорядочены по неубыванию, а n-я позиция в этом массиве свободна. Требуется вставить новый элемент р в этот массив с сохранением упорядоченности по неубыванию. Для поиска места вставки для элемента р использовать бинарный поиск.
3. const n=31; var x: array[1..n] of integer; p: integer; k:1..n; found: boolean; Дан массив х, элементы которого упорядочены по возрастанию. Для элемента р методом бинарного поиска проверить: если р входит в массив х, то found присвоить TRUE, а переменной к-номер элемента массива х, равного р; если р не входит в массив х, то found присвоить FALSE, а элемент р вставить в массив х, не нарушая порядок возрастания. Замечание: при вводе элементов в массив х последний элемент оставить не заполненным.
4. const n=10; m=20; var x: array[1..n, 1..m] of integer; y: integer; i,j: integer; В каждом столбце заданной целочисленной матрице, используя прямой поиск по ключу, найти элемент аij ,равный заданному ключу у. Составить массив Z из номеров строк для найденных элементов. Затем прямым поиском определить, присутствует ли в массиве Z элемент zi, равный значению у.  
5. Пусть таблица Т и аргумент поиска х определяются следующим образом: Т: array[0..N-1] of string; x: string; Допустим n велико, а таблица упорядочена в алфавитном порядке. Используя алгоритмы: поиск делением пополам и посимвольного сравнения строк (каждая строка заканчивается #0), запрограммировать поиск х в Т. Если хєТ, выдать совпавшую строку, если х¢Т, то – сообщение о несовпадении х с элементом Тi.
6. Пусть заданы массивы: S: array[0..N-1] of item; P: array[0..M-1] of item;    0≤M≤N. Методом прямого поиска строки запрограммировать поиск первого вхождения p в S. Item – это символы. Если поиск успешный, то кроме сообщения об этом, вывести номер символа в строке S, с которого начинается найденное совпадение. Проанализировать алгоритм прямого поиска, сделать вывод о худшем случае работы.
7. С помощью эффективного КМП-алгоритма (Кнута, Морриса и Пратта) запрограммировать поиск образа р в строке S (описание структур р и S в вар. №6).

 

Контрольные вопросы

1. Линейный поиск. Условия окончания поиска.

2. Линейный поиск с барьером.

3. Алгоритм поиска делением пополам (двоичный поиск). Анализ алгоритма.

4. Представление строк переменного размера без динамического распределения памяти.

5. Алгоритм поиска строки в таблице строк.

6. Прямой поиск образа в КМП-алгоритме.

7. предтрансляция образа в КМП-алгоритме.

8. Сравнительный анализ алгоритмов поиска образа в строке (по количеству требуемых сравнений).

9. Особенности работы алгоритмов поиска образа в строке, если строка читается из вторичной памяти.

 

 




Лабораторная работа № 3

Алгоритмы базовых и улучшенных сортировок.

Порядковые статистики

 

 

Цель работы: изучение и практическое применение алгоритмов сортировок:

- основных базовых алгоритмов;

- улучшенных эффективных алгоритмов, построенных на основе базовых.

Домашнее задание:

 

1. Изучить базовые алгоритмы сортировок:

а) с помощью прямого включения и его модификация двоичным включением;

б) сортировка с помощью прямого выбора;

в) сортировка с помощью прямого обмена (пузырьковая) и его модификация – шейкерная сортировка.

2. Освоить эффективные алгоритмы улучшенных методов сортировок:

а) сортировка Шелла (с помощью включений с уменьшением расстояний);

б) сортировка с помощью дерева (пирамидальная HeapSort), базируется на прямом выборе;

в) сортировка с помощью разделения (QuickSort), основанная на прямом обмене; особенности реализаций рекурсивным и итеративным алгоритмами;

3. Освоить применение алгоритмов сортировок для вычисления значения i-той порядковой статистики.

 

Теоретические сведения.

Обычно сортировку подразделяют на два класса: внутреннюю и внешнюю. При внутренней сортировке все элементы хранятся в оперативной памяти, таким образом, как правило, это сортировка массивов. При внешней сортировке — элементы хранятся на внешнем запоминающем устройстве, это сортировка файлов.

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

Удобной мерой эффективности является подсчет числа С — сравнений элементов и М — присваиваний элементов. Достаточно хороший алгоритм затрачивает на сортировку N элементов время порядка N×log2(N). Простейшие алгоритмы сортировки, которые мы рассмотрим в этом разделе, обладают характеристикой порядка N2. Если N достаточно мало, то простые алгоритмы выгодно использовать в силу простоты их реализации.

Сортировка выбором

Сортировка методом простого выбора сводится к следующим шагам:
1. Установить номер наибольшего элемента массива.
2. Поменять местами наибольший и последний элементы массива.
3. Оставив в покое последний элемент, выполнить пункты 1 и 2 над остатком массива (массивом без последнего элемента). Пункт 3 повторять, пока остаток массива не сократится до одного элемента.

Опишем процедуру сортировки на языке проектирования программ (псевдокоде).

For i := n downto 2 do Begin найти максимальный элемент из а[1], ..., a[i];  запомнить его индекс в переменной k; если i<>k поменять местами a[i] и a[k]; End;

Вот как изменяется значение массива из пяти элементов (30,20,10,50,40)

30 20 10 50 4030 20 10 40 50 30 20 10 40 50 10 20 30 40 50 10 20 30 40 50

Подчеркнута область поиска наибольшего элемента










Последнее изменение этой страницы: 2018-05-10; просмотров: 231.

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