Алгоритмы поиска в линейных структурах
Лабораторная работа 37. Алгоритмы поиска в линейных структурах
Цель работы: изучить основные алгоритмы поиска в линейных структурах и научиться решать задачи поиска в линейных структурах на основе алгоритмов последовательного и бинарного поиска.
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на данные из входного файла, выполняет их обработку в соответствии с требованиями задания и выводит результат в выходной файл. Для обработки данных необходимо реализовать функции алгоритмов последовательного и бинарного поиска в линейных структурах. Ограничениями на входные данные является допустимый диапазон значений используемых числовых типов в языке С++.
Теоретические сведения.
Ознакомьтесь с материалом лекции 37.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
- На основании приведенных в лекции 37 функций реализуйте алгоритмы последовательного и бинарного поиска.
- В связи с визитом Императора Палпатина было решено обновить состав дроидов в ангаре 32. Из-за кризиса было решено новых дроидов не закупать, но выкинуть пару старых. Как известно, Палпатин не переносит дроидов с маленькими серийными номерами, так что все, что требуется – найти среди них двух, у которых серийные номера наименьшие.
Формат входного файла
Первая строка входного файла содержит целое число N – количество дроидов. (2 <= N <= 1000), вторая строка – N целых чисел, по модулю не превышающих 2x109 – номера дроидов.
Формат выходного файла
Выведите два числа: первым – последний по величине из номеров дроидов (такого следует утилизировать в первую очередь), а вторым – предпоследний.
Пример входного файла
5 49 100 23 -100 157
Пример выходного файла
-100 23
Пример входного файла
4 99 1 5 1
Пример выходного файла
1 1
- Некто загадал число от 1 до N. За какое наименьшее количество вопросов (на которые он отвечает "да" или "нет") можно угадать задуманное число?
Формат входных данных
Вводится одно число N (1 < N < 10001).
Формат выходных данных
Выведите наименьшее количество вопросов, которого гарантированно хватит, чтобы угадать задуманное число.
Пример входного файла
6
Пример выходного файла
3
- Задана матрица K, содержащая n строк и m столбцов. Седловой точкой этой матрицы назовем элемент, который одновременно является минимумом в своей строке и максимумом в своем столбце. Найдите количество седловых точек заданной матрицы.
Формат входного файла
Первая строка входного файла содержит целые числа n и m (1 <= n, m <= 750). Далее следуют n строк по m чисел в каждой. j -ое число i -ой строки равно kij. Все kij по модулю не превосходят 1000.
Формат выходного файла
В выходной файл выведите ответ на задачу.
Пример входного файла
2 2 0 0 0 0
Пример выходного файла
4
Пример входного файла
2 2 1 2 3 4
Пример выходного файла
1
- Спортсмен Василий участвовал в соревнованиях по хоккейболу и получил в личном зачете серебряную медаль. Известно, что участники, получившие одинаковое количество очков, награждаются одинаковыми наградами. Известно, что были разыграны золотые серебряные и бронзовые медали. В задаче не спрашиваются правила хоккейбола. Необходимо только определить сколько очков набрал Василий. Для решения данной задачи массив лучше не использовать.
Формат входного файла
На первой строке дано число N (2 <= N <= 1000) количество спортсменов, участвовавших в соревнованиях, на второй N целых чисел – результаты через пробел.
Формат выходного файла
Требуется вывести одно число – результат Василия.
Пример входного файла
5 4 3 3 1 2
Пример выходного файла
3
Пример входного файла
8 1 2 5 3 5 1 1 6
Пример выходного файла
5
Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученным алгоритмами последовательного и бинарного поиска в линейных структурах, реализовав программный код на языке С++. Рекомендуется воспользоваться материалами лекции 37, где подробно рассматриваются описание используемых в работе алгоритмов, примеры их реализации на языке С++. Программу для решения каждого задания необходимо разработать методом процедурной абстракции, используя рекурсивные функции. Этапы сопроводить комментариями в коде. В отчете следует отразить разработку и обоснование математической модели решения задачи. Результаты тестирования программ необходимо провести в соответствии приведенными примерами входных и выходных файлов к задачам (как дополнение допустимы и собственные примеры тестовых данных).
Следует реализовать каждое задание в соответствии с приведенными этапами:
- изучить словесную постановку задачи, выделив при этом все виды данных;
- сформулировать математическую постановку задачи;
- выбрать метод решения задачи, если это необходимо;
- разработать графическую схему алгоритма;
- записать разработанный алгоритм на языке С++;
- разработать контрольный тест к программе;
- отладить программу;
- представить отчет по работе.
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
- Титульный лист.
- Словесная постановка задачи. В этом подразделе проводится полное описание задачи. Описывается суть задачи, анализ входящих в нее физических величин, область их допустимых значений, единицы их измерения, возможные ограничения, анализ условий при которых задача имеет решение (не имеет решения), анализ ожидаемых результатов.
- Математическая модель. В этом подразделе вводятся математические описания физических величин и математическое описание их взаимодействий. Цель подраздела – представить решаемую задачу в математической формулировке.
- Алгоритм решения задачи. В подразделе описывается разработка структуры алгоритма, обосновывается абстракция данных, задача разбивается на подзадачи. Схема алгоритма выполняется по ЕСПД (ГОСТ 19.003-80 и ГОСТ 19.002-80).
- Листинг программы. Подраздел должен содержать текст программы на языке программирования С++, реализованный в среде MS Visual Studio 2010.
- Контрольный тест. Подраздел содержит наборы исходных данных и полученные в ходе выполнения программы результаты.
- Выводы по лабораторной работе.
- Ответы на контрольные вопросы.
Контрольные вопросы
- Чем можно объяснить многообразие алгоритмов поиска в линейных структурах?
- В чем преимущества поиска с барьером по сравнению с последовательным поиском?
- Нахождение какого по порядку элемента в линейном множестве (первого, последнего) гарантирует алгоритм прямого поиска? Как в этом случае должен быть выполнен просмотр?
- Нахождение какого по порядку элемента в линейном множестве (первого, последнего) гарантирует алгоритм бинарного поиска? Ответ обоснуйте.
- Как трудоемкость алгоритма бинарного поиска на дискретном множестве зависит от мощности множества?
- Почему время выполнения алгоритма бинарного поиска на вещественном множестве не зависит от количества элементов?