Вы находитесь на странице: 1из 7

МИНОБРНАУКИ РОССИИ

––––––––––––––––––––––––––––––––––––––––––––––––––––
Санкт-Петербургский государственный электротехнический
университет «ЛЭТИ» им. В. И. Ульянова (Ленина)

Курсовое проектирование по курсу


«Алгоритмы и структуры данных»

Тема: «Алгоритмы повышенной сложности»

Задания и методические указания

Санкт-Петербург
СПбГЭТУ «ЛЭТИ»
2022

1
Цель работы (проекта):

Закрепление теоретических знаний и приобретение практических навыков в


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

Содержание работы (проекта):

 анализ поставленной задачи, выбор алгоритма решения (при необходимости);


 программная реализация алгоритма решения задачи;
 анализ программного алгоритма;
 проведение и анализ экспериментального исследования алгоритма;
 документирование курсовой работы в соответствии требованиями.

2
Общие требования к выполнению работы

Курсовая работа выполняется индивидуально, согласно выбранному варианту (перечень


вариантов приведен в Приложении 1).

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


согласования:
 С
 С++
 С#
 Java
 Kotlin
 Pascal
 BASIC
 Python
 JavaScript
 Assembler
Иные языки программирования требуют предварительного согласования.

По результату выполнения работы выполняется отчет, который содержит только ключевые


элементы кода программы (например, процедуры реализующие основную логику
алгоритма). Весь программный проект прикладывается в отдельном ZIP или 7Z архиве.

Требования к отчёту

Отчёт по курсовому проекту должен содержать:

1) титульный лист (внимание! тема курсового проектирования указана на титульном


листе данного файла; вариант – это не тема проекта)
2) задание на курсовой проект (вариант)
3) описание реализуемого алгоритма (1-3 страницы)
4) результаты теоретического исследования (если требуется согласно варианту)
5) ключевые элементы исходного кода программы (не более 5-8 страниц, ориентация
страницы – ландшафтная, шрифт – моноширинный 8-10pt)
6) инструкции по компиляции (для компилируемых языков) и/или исполнению (для
интерпретируемых языков) программного проекта (сам программный проект должен
прилагаться отдельным архивом)
7) результаты работы программы (в зависимости от варианта):
1. промежуточные отладочные сообщения (при большом объеме – частично)
2. исходные и преобразованные файлы/сообщения (при большом объеме –
частично)
3. графические изображения (если подразумеваются согласно варианту)
4. любые иные материалы, демонстрирующие корректность работы
реализованного алгоритма (при необходимости демонстрации динамического
поведения, возможно записать видео работы программы и приложить к отчету
в виде отдельного файла)
8) выводы по проекту

3
Приложение 1. Варианты заданий

В скобках указана примерный уровень сложность задания (L1, L2, L3)

B. Небинарное (несбалансированное) дерево поиска (L1)


Реализовать небинарное (максимальное кол-во записей в узле задается константой M) дерево
поиска. Требование сбалансированности не предъявляется (разделение текущего узла
затрагивает только его). В качестве входных данных можно воспользоваться файлом из
лабораторного практикума.

C. Сравнение быстродействия алгоритмов с разным способом исполнения (L1)


Провести сравнение быстродействия одинаковых алгоритмов при реализации на языках с
разным способом исполнения. Должен быть проведен анализ двух типов алгоритмов:
 преимущественно требующих вычислительные ресурсы (например, многократное
вычисление хеша от пароля, для данного КП можно некриптостойкого)
 преимущественно требующих доступ к памяти (например, сортировка массива).
Анализ алгоритма должен быть произведен для любых 2 способов исполнения из списка:
 ассемблер
 языки, компилируемые в машинный код (C, C++, Pascal, др.)
 языки, компилируемые в байт-код (Java, Kotlin, C#)
 интерпретируемые языки (Python, JavaScript, др.)

E. Поиск минимальной построчной разности между двумя текстовыми файлами (L2)


Программе предоставляются 2 текстовых файла (для выполнения работы воспользуйтесь
файлами не более 20 строк в каждом). Для каждой строки вычисляется хеш-функция и
методом динамического программирования вычисляются расстояние Левенштейна и
редакционное предписание (считая строки неделимыми объектами). Программа должна
отобразить в графическом UI оба файла в соседних окнах и каким-либо образом (например,
цветом) разметить редакционное предписание.

F. Алгоритм заливки замкнутой области (L1)


Реализовать (обучающую) программу:
 предлагающую пользователю с помощью мыши начертить кривую или ломаную
линию с самопересечениями и выбрать точку начала заливки
 проверяющую замкнутость нарисованной области относительно выбранной точки
начала заливки
 в случае положительного результата проверки заполняющую область каким-либо
цветом.
Скорость отображения процесса заливки должна позволять понять принцип работы
используемого алгоритма. В случае если выбранный алгоритм заливки подразумевает точки
разного типа, рекомендуется отображать их разным цветом. Одновременно на экране в
текстовом поле должно быть размещено краткое описание алгоритма.

H. Сжатие файлов алгоритмом Хаффмана (L3)

4
Реализовать программу, осуществляющую сжатие файла и его восстановление по алгоритму
Хаффмана. Проверить степень сжатия и идентичность восстановленных файлов для разных
типов файлов: текстовые (в кодировках ASCII Latin, UTF-8, UTF-16), графические (BMP,
JPG), исполнимые (EXE).

L. Генерация лабиринта (L2)


Реализовать программу, формирующую связный лабиринт по следующему алгоритму:
 в квадрате размером NxN (задается константой в программе) по границам клеток
сгенерировать случайным образом стены с вероятностью p (подобрать опытным
путем из диапазона 0.6<p<0.9)
 выделить компоненты связности
 итеративно соединяя граничащие компоненты связности (со сменой идентификатора
одной из двух объединяемых компонент связности аналогично алгоритму Краскала),
добиться полной связности лабиринта
Программа должна демонстировать шаги объединения компонент связности на графическом
UI.

P. Пентамино (L3)
Реализовать программу, осуществляющую поиск заполнения прямоугольника 6х10
фигурками пентамино, при условии, что задано некоторое начальное заполнение (в пределе –
пустое). Программа должна предоставлять графический UI, который позволяет пользователю
выполнить первичное непротиворечивое частичное заполнение прямоугольника фигурками
пентамино (без повторений), а затем по нажатию отдельной кнопки начинать рекурсивный
поиск возможности точного дозаполнения прямоугольника оставшимися фигурками.

R1. Сжатие изображений алгоритмом RLE фиксированным кодом (L1)


Реализовать программу, осуществляющую сжатие черно-белого (глубина цвета – 1 бит)
изображения и его восстановление по алгоритму RLE (поскольку кодируются только черные
и белые пикселы нет необходимости передавать цвет пиксела – они считаются строго
чередующимися, записывается только длина серии). Для сжатия рекомендуется выбрать
отсканированный документ формата A4, изменить его размер до 600-1000 пикселей в
высоту, преобразовать его глубину цвета в 1 бит, хранить в формате BMP. Рекомендуемое
кодирование непрерывной последовательности пикселей: 4 бита (длина – 0..15 пикселей) или
8 бит (длина – 0..255 пикселей) – на усмотрение разработчика.

R2. Сжатие изображений алгоритмом RLE оптимальным фиксированным кодом (L2)


Модифицировать базовый вариант R1 следующим образом:
 на этапе анализа изображения вычислять длину файла результата в зависимости от
длины кода (перебрать длины от 3 до 24 бит)
 выбрать для кодирования длину кода, дающего минимальный размер файла; первым
байтом файла записать выбранную длину кода
 на этапе дкодирования считать первый байт и применить данную длину кода для
декодирования

R3. Сжатие изображений алгоритмом RLE динамическим кодом (L3)


Модифицировать базовый вариант R1 следующим образом:

5
 подобрать две длины кода (первую для часто изменящихся областей, например, из
диапазона 3-5 бит, вторую для однотонных областей, например, из диапазона 12-16
бит), начать кодирование с кода для однотонных областей
 при любой длине кода трактовать значение, состоящее из всех ‘1’ как команду на
смену (инвертацию) длины кода (с короткого на длинный или с длинного на
короткий)
 закодировать изображение, изменяя при необходимости длину кода (задача выбора
оптимальных точек смены кода является вычислительно сложной, необходимо
придумать и реализовать какую-либо эвристику; также следует следить за тем, чтобы
переключение длин кода не происходило слишком часто, т.к. это уничтожит выигрыш
от динамического кода)
 соответствующим образом модифицировать алгоритм восстановления изображения.

S. Крестики-нолики 4х5 (L3)


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

T. Извлечение квадратного корня в длинной арифметике (L2)


Реализовать алгоритмы «длинной арифметики» для операций:
 сравнение
 сложение/вычитание
 умножение
На их основе реализовать любой «наивный» алгоритм извлечения квадратного корня
(например, половинным делением или подбором знаков). С помощью созданного алгоритма
реализовать решение квадратного уравнения (при a0=1) методом дискриминанта, реализовать
проверку найденных корней подстановкой в уравнение.

U. Поиск одинаковых файлов в файловой системе на основе подсчета хеш-сумм (L1)


Программе указывается каталог, для всех файлов которого (включая размещенные в его
подкаталогах) программа должна вычислить любой из современных некриптостойких хеш-
функций разрядности не менее 64 бит. В выводе на экран программа должна сгруппировать
файлы по вычисленному хешу и вывести группы файлов, содержащие не менее 2 записей
(уникальные файлы отображать не требуется), показывая путь от стартового каталога, размер
файла, значение хеша в 16-ричном виде.

Z. Сжатие файлов алгоритмом LZSS (L2)


Реализовать программу, осуществляющую сжатие файла и его восстановление по алгоритму
LZSS. Исходить из предположения, что сжимаемый файл представлен в кодировке ASCII
Latin (в файле могут встречаться только символы из диапазона 0..127, соответственно,
установленный старший бит может быть использован как признак ссылки на предыдущую
подстроку). Рекомендуется использовать следующее кодирование ссылки: 7 бит – длина
повтора (от 0 до 127 символов), 16 бит – относительное смещение повтора от текущей
позиции. Проверить степень сжатия и идентичность восстановленных файлов для
нескольких текстовых файлов разной длины (100кбайт, 1Мбайт, 10Мбайт).

6
7

Вам также может понравиться