
- •Цель работы.
- •Изучение и программирование стандартного алгоритма «поиска моды».
- •Задание.
- •Задан вектор исходных данных S(N) отсортированный по возрастанию значений его элементов, и алгоритм поиска моды, наиболее часто встречающегося (повторяющегося)
- •значения S(im) элементов в векторе.
- •1. Реализовать в Matlab алгоритм поиска моды для вектора исходных данных S(8) в Программе 1;
- •2. Вставить комментарии к операторам Программы 1;
- •4. Составить Таблицу 1 из трех столбиков для отдельных листингов трех версий вектора S(8), включающих: значение моды S(im), индекс начала последовательности значений моды im и количество значений mc в последовательности моды;
- •5. Составить в Matlab Программу 2, добавив в Программу 1 формирование исходного вектора S(N). Для этого использовать функции rand и fix: s=fix(50*rand ([1 N)) так же, как в программе к лабораторной работе 4.1 «Быстрая сортировка»;
- •6. Вставить в Программу 2 ранее разработанный модуль Quick Sort из лабораторной работе 4.1 «Быстрая сортировка» для сортировки исходного вектора S(N);
- •7. Вставить Программу 2 стандартные функции tic, toc для оценки времени поиска моды;
- •8. Определить зависимость времени поиска моды (наибольшее из 20 прогонов программы) для векторов S(10^4), S(10^5), S(10^6), S(10^7);
- •3. Составим в Matlab Программу 2, добавив в Программу 1 формирование исходного вектора S(N):
- •Модифицированная программа:
- •Листинг результатов:
- •Elapsed time is 0.095406 seconds.
- •Индекс начала последовательности значений моды:
- •Количество значений mc в последовательности моды:
- •Elapsed time is 0.164252 seconds.
- •Elapsed time is 0.659111 seconds.
- •Elapsed time is 3.962321 seconds.
- •4. Составим таблицы. Вычислим коэффициенты KN=Nj/Ni, Kt=tj/ti:

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Санкт-Петербургский государственный электротехнический университет "ЛЭТИ"
Факультет электроники Кафедра радиотехнической электроники
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к лабораторной работе №5.1 по дисциплине "Информационные
технологии"
Доцент, к.т.н. |
И.А. Рябцев |
Студент гр.0207 |
Б.И. Маликов |
Санкт-Петербург
2021

Цель работы.
Изучение и программирование стандартного алгоритма «поиска моды».
Задание.
Задан вектор исходных данных S(N) отсортированный по возрастанию значений его элементов, и алгоритм поиска моды, наиболее часто встречающегося (повторяющегося)
значения S(im) элементов в векторе.
1.Реализовать в Matlab алгоритм поиска моды для вектора исходных данных S(8) в Программе 1;
2.Вставить комментарии к операторам Программы 1;
3.Проверить программу Matlab на трех версиях (A-C) вектора исходных
2
данных S(8);
4.Составить Таблицу 1 из трех столбиков для отдельных листингов трех версий вектора S(8), включающих: значение моды S(im), индекс начала последовательности значений моды im и количество значений mc в последовательности моды;
5.Составить в Matlab Программу 2, добавив в Программу 1 формирование исходного вектора S(N). Для этого использовать функции rand и fix: s=fix(50*rand ([1 N)) так же, как в программе к лабораторной работе 4.1 «Быстрая сортировка»;
6.Вставить в Программу 2 ранее разработанный модуль Quick Sort из лабораторной работе 4.1 «Быстрая сортировка» для сортировки исходного вектора S(N);
7.Вставить Программу 2 стандартные функции tic, toc для оценки времени поиска моды;
8.Определить зависимость времени поиска моды (наибольшее из 20 прогонов программы) для векторов S(10^4), S(10^5), S(10^6), S(10^7);
9.Составить Таблицу 2 из четырех строк (i=1-4), включив три столбика: с номером вектора, его размерностью и временем поиска моды t;
10.Составить Таблицу 3 из трех строк и трех столбиков. В первом столбике разместить комбинации (i-j: 1-2, 1-3, 1-4). Рассчитать
коэффициенты: KN=Nj/Ni, Kt=tj/ti и разместить полученные значения во втором и третьем столбиках;
11.Оформить отчет, включив в него тексты Программ 1, 2 и Таблицы 1, 2. В выводы включить закономерность изменения времени поиска моды от изменения размерности вектора (Kt ~ KN);
Выполнение заданий.
1. Реализуем в Matlab алгоритм поиска моды для вектора исходных данных S(8):
clear all; %удалим все переменные из текущей рабочей области clc;
N=8; %указываем начальные условия mt=1;
mc=1;
im=1;
i=1;
s=[4 4 4 7 7 7 7 7]; %задаем массив; два других массива для проверки: s=[4 4 4 4 4 7 7 7]
и s=[1 2 3 4 5 6 7 8];
while i<N-1 %пробег по всему массиву j=i; %j принимает значение i
while (j<N) && (s(j)==s(j+1)) %накладываем условие: пока элемент повторяется mt=mt+1;
j=j+1;
3
end i=i+mt;
if mt>mc %условие: если mt>1 mc=mt; %mc принимает значение mt im=i-mt;
end mt=1; end
if mc>1 %накладываем условие: если номер<1 disp('Мода:'); %вывод результата
disp(s(im));
disp('Индекс начала последовательности значений моды:'); disp(im);
disp('Количество значений mc в последовательности моды:'); disp(mc);
else disp('No mode'); %если не совпадает ни одно из условий end
2. Проверим программу Matlab на трех версиях (A-C) вектора исходных данных S(8). Составим Таблицу 1 из трех столбиков для отдельных листингов трех версий вектора S(8), включающих: значение моды S(im), индекс начала последовательности значений моды im и количество значений mc в последовательности моды:
|
s=[4 4 4 7 7 7 7 7] |
s=[4 4 4 4 4 7 7 7] |
s=[1 2 3 4 5 6 7 8] |
|
|
|
|
|
|
S(im) |
Мода: |
Мода: |
No mode |
|
7 |
4 |
|||
|
|
|||
|
|
|
|
|
|
Индекс начала |
Индекс начала |
|
|
im |
последовательности |
последовательности |
|
|
значений моды: |
значений моды: |
|
||
|
|
|||
|
4 |
1 |
|
|
|
Количество |
Количество |
|
|
|
значений mc в |
значений mc в |
|
|
mc |
последовательности |
последовательности |
|
|
|
моды: |
моды: |
|
|
|
5 |
5 |
|
3. Составим в Matlab Программу 2, добавив в Программу 1 формирование исходного вектора S(N):
Алгоритм быстрой сортировки: function[vector]=quicksort(vector)
if ~isempty(vector) global cm; cm=cm+1;
4
pivot=vector(1);
A1=quicksort(vector(vector<pivot));
A2=vector(vector==pivot);
A3=quicksort(vector(vector>pivot)); vector=[A1 A2 A3];
end end
Модифицированная программа: clear all;
clc;
N=10^4; %также рассмотрим значения N=10^5; N=10^6; N=10^7; mt=1;
mc=1;
im=1;
i=1;
s=fix(50*rand ([1 N])); tic;
y=quicksort(s); while i<N-1 j=i;
while (j<N) && (s(j)==s(j+1)) mt=mt+1;
j=j+1; end i=i+mt; if mt>mc mc=mt; im=i-mt; end mt=1; end
toc;
if mc>1 disp('Мода :'); disp(s(im));
disp('Индекс начала последовательности значений моды:'); disp(im);
disp('Количество значений mc в последовательности моды:'); disp(mc);
else disp('No mode'); end
5