Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29

Декомпозиционный алгоритм для поиска наибольшего элемента

12.07.2015, 08:42. Показов 3161. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Помогите пожалуйста разобраться с одной задачкой. Задачка из книги А.Левитина "Алгоритмы: Введение в разработку и анализ". Задачка 4.1.1.

4.1.1. а) напишите псевдокод декомпозиционного алгоритма для поиска наибольшего элемента в массиве из n чисел.

б) Какими будут выходные данные алгоритма, если наибольшее значение имеют несколько элементов?

в) Напишите рекуррентное соотношение для количества сравнения ключей, выполняемых алгоритмом.

г) Сравните созданный вами алгоритм с алгоритмом для решения указанной задачи, основанным на грубой силе.


Решение:

a) Псевдокод декомпозиционного алгоритма (Возможно я неправильно выделил псевдокод. Просто я не нашел как правильно его выделять).

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Алгоритм Max2 (A[l...r])
 
if l=r 
   return A[l]
 
else 
   temp1 <- Max2(A[l...(l+r)/2])
   temp2 <- Max2 (A[(l+r)/2...r])
   
   if temp1 >= temp2 
      return temp1
 
   else 
      return temp2
в)

https://www.cyberforum.ru/cgi-bin/latex.cgi?C(n)=2C(n/2) + n - 1<br />

Поскольку https://www.cyberforum.ru/cgi-bin/latex.cgi?a=2, b=2, d=1, то согласно основной теореме

https://www.cyberforum.ru/cgi-bin/latex.cgi?C(n) \in \Theta (nlogn)

г) Алгоритм на основе грубой силы имеет класс эффективности n, поэтому он будет эффективнее чем данный алгоритм.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.07.2015, 08:42
Ответы с готовыми решениями:

Декомпозиционный алгоритм для вычисления a^n
Добрый вечер, помогите пожалуйста разобраться с одной задачкой. Задачка из книги А.Левитина &quot;Алгоритмы:Введение в разработку&quot;. ...

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

Функция для поиска наибольшего и второго наибольшего элемента вектора
Есть вектор который заполняется рандомно. И нужно найти два элемента - самое большое значение и второе по величине. И главным условием...

23
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
12.07.2015, 13:11
а) Иначе Ваш код зацикливается (бесконечный цикл)
В строке 8 надо (l+r)/2+1

в) Для чётных n:
C(n) = 2 * C(n/2) + 1
C(1) = 1 // сравнение верхней и нижней границ, а не самих элементов
C(n) = 2n - 1 // строго не доказывал, могу ошибиться

г) Алгоритм на основе грубой силы имеет тот же класс эффективности n, но требует примерно в 2 раза меньше сравнений // из-за того, что в декомпозиционном алгоритме мы постоянно сравниваем границы (l==r)
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
12.07.2015, 15:41  [ТС]
Я вот только не могу понять почему в данной формуле вы написали + 1.

https://www.cyberforum.ru/cgi-bin/latex.cgi?C(n) = 2 * C(n/2) + 1


Я вычислял эффективность согласно формуле, которая представлена на рисунке ниже. Согласно данной формуле

https://www.cyberforum.ru/cgi-bin/latex.cgi?f(n) = n - 1

Разве нет? f(n) это же есть сравнение решений двух подзадач. И общее количество сравнений равно n - 1. Или может я что-то не так понимаю.
Миниатюры
Декомпозиционный алгоритм для поиска наибольшего элемента  
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
12.07.2015, 15:41  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
В строке 8 надо (l+r)/2+1
- Да точно.
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
12.07.2015, 15:55
Разделение задач у нас бесплатное (без сравнений), а для композиции требуется одно сравнение (temp1 >= temp2), независимо от размеров подмассивов. Поэтому f(n) = 1
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
12.07.2015, 17:56  [ТС]
Ну да, Вы скорее всего правы.

Тогда получается

https://www.cyberforum.ru/cgi-bin/latex.cgi?C(n) = 2*C(n/2) + 1<br />
C(1)=1<br />

https://www.cyberforum.ru/cgi-bin/latex.cgi?C(n) = 2*C(n/2) + 1 = 2*(2*C(n/4)+1)+1 = 4*C(n/4)+2+1 = 4*(2*C(n/8)+1)+2+1=8*C(n/8)+4+2+1 =<br />
<br />
= 2^i C(n/2^i) + {2}^{i-1} + {2}^{i-2} + ... + 2 + 1 = 2^i C(n/2^i) + 2^i - 1

Пусть https://www.cyberforum.ru/cgi-bin/latex.cgi?n=2^k. Тогда

https://www.cyberforum.ru/cgi-bin/latex.cgi?C(2^k)=2^i C({2}^{k-i}) + 2^i - 1

Исходя из начальных условий

https://www.cyberforum.ru/cgi-bin/latex.cgi?{2}^{k-i} = 2^0

Значит https://www.cyberforum.ru/cgi-bin/latex.cgi?k=i

Таким образом:

https://www.cyberforum.ru/cgi-bin/latex.cgi?C(2^k) = 2^k + 2^k - 1 = 2*2^k - 1 <br />
<br />
C(n) = 2*{2}^{log_2 n}  - 1 = 2n -1

Посмотрите пожалуйста, вроде должно быть правильно.
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
12.07.2015, 18:43
Вы доказываете только для степеней двойки...

Используя метод математической индукции:

1. Проверяем для n = 1:
C(1) = 1 = 2n - 1

2. Предположим, что для всех k < n выполняется C(k) = 2k - 1
Для чётных n = 2m:
С(2m) = 2C(m) + 1 = 2(2m - 1) + 1 = 2*2m - 1 = 2n - 1
Для нечётных n = m(m+1):
C(m(m+1)) = C(m) + C(m+1) + 1 = 2m - 1 + 2(m+1) - 1 + 1 = 2m(m+1) - 1 = 2n - 1
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
13.07.2015, 07:09  [ТС]
По идее же можно решать подобные рекуррентные только для https://www.cyberforum.ru/cgi-bin/latex.cgi?{n}^{2k} и сделанную оценку порядка роста функции для https://www.cyberforum.ru/cgi-bin/latex.cgi?{n}^{2k} можно с очень высокой степени приближенности считать правильно для всех значений n (2-ой рисунок).

Я так понимаю получение точное решение никого не интересует и главное всегда правильно оценивать порядок роста. Ведь так? Т.е. постоянные множители в решении особого значения не играют. А играет лишь класс эффективности.


Но как я понял можно получить точное решение для четных и нечетных n методом математической индукции. Правильно?
А почему у Вас для четных и нечетных значений получилось одно и тоже значение C(n) = 2n - 1. Ведь так в принципе не должно быть. Для нечетных значений должно же получаться другой значение в любом случае.


Можете пояснить что Вы этим доказываете? Я что-то понять не могу.

Для чётных n = 2m:
С(2m) = 2C(m) + 1 = 2(2m - 1) + 1 = 2*2m - 1 = 2n - 1
И если для четных n = 2m, то для нечетных должно быть n=2m + 1 , а не n = m(m+1)
Миниатюры
Декомпозиционный алгоритм для поиска наибольшего элемента   Декомпозиционный алгоритм для поиска наибольшего элемента  
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
13.07.2015, 19:00
Цитата Сообщение от Andreyphisicist Посмотреть сообщение
А почему у Вас для четных и нечетных значений получилось одно и тоже значение C(n) = 2n - 1. Ведь так в принципе не должно быть. Для нечетных значений должно же получаться другой значение в любом случае.
Почему для нечётных должно получаться другое значение?

Цитата Сообщение от Andreyphisicist Посмотреть сообщение
И если для четных n = 2m, то для нечетных должно быть n=2m + 1 , а не n = m(m+1)
Да, кончено. У меня там знак "+" пропущен (опечатка).
C(m+(m+1)) = C(m) + C(m+1) + 1 = 2m - 1 + 2(m+1) - 1 + 1 = 2(m+(m+1)) - 1 = 2n - 1
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
14.07.2015, 09:06  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Для чётных n = 2m:
С(2m) = 2C(m) + 1 = 2(2m - 1) + 1 = 2*2m - 1 = 2n - 1
Объясните пожалуйста, что Вы этим доказываете?

Я так понимаю, вы сначала делаете предположение, что C(n) = 2n -1 . Далее для четных n=2m, получаете, что
C(2m) = 4m - 1; C(m) = 2m - 1;

И далее подставляя в выражение, получаете:

С(2m) = 2C(m) + 1 = 2(2m - 1) + 1 = 2*2m - 1 = 2n - 1

Я просто не могу понять, что Вы этим доказываете?

Я также могу предположить, что C(n) = 4n - 1 и для четных n = 2m, получу следующее:

С(2m) = 2C(m) + 1 = 2(4m - 1) + 1 = 4*2m - 1 = 4n - 1

Для нечетных n = m + (m + 1)

C(m+(m+1)) = C(m) + C(m+1) + 1 = 4m - 1 + 4(m+1) - 1 + 1 = 4(m+(m+1)) - 1 = 4n - 1

Это же не означает, что C(n) = 4n -1. Правильно? Или нет?

Если мы хотим доказать, что C(n) = 2n -1, то нельзя же использовать это значение для рассчитывания правой части.
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
14.07.2015, 15:08
https://ru.wikipedia.org/wiki/... я_индукция
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
14.07.2015, 16:43  [ТС]
Ну я вроде понял. Т.е. по идее решение, которое я выше написал C(n) = 4n - 1 не подходит, т.к. оно не удовлетворяет
начальному условию С(1) = 1. Правильно я понимаю?

И вот еще у меня есть вопрос.
Насколько я понял, при доказательстве методом математической индукции, мы должны доказать, что выполняется какое-то равенство при n + 1. Получается мы должны доказать равенство для четных при n=2m + 1, а для нечетных при n = (2m + 1) + 1. Разве нет?
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
14.07.2015, 18:45
Цитата Сообщение от Andreyphisicist Посмотреть сообщение
Т.е. по идее решение, которое я выше написал C(n) = 4n - 1 не подходит, т.к. оно не удовлетворяет
начальному условию С(1) = 1. Правильно я понимаю?
Правильно.

Цитата Сообщение от Andreyphisicist Посмотреть сообщение
мы должны доказать, что выполняется какое-то равенство при n + 1
Мы должны доказать, что если равенство выполняется для всех меньших значений, то оно выполнится и для данного. Можно выводить истинность для n + 1 из истинности для всех k <= n, а можно выводить для n из истинности для всех k < n.

В данном конкретном случае различие между чётными и нечётными появляется из-за того, что мы по-разному разбиваем массивы на две части для чётных и нечётных n. (для чётных части одинаковые, а для нечётных - разные).
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
15.07.2015, 08:04  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Мы должны доказать, что если равенство выполняется для всех меньших значений, то оно выполнится и для данного. Можно выводить истинность для n + 1 из истинности для всех k <= n, а можно выводить для n из истинности для всех k < n.
Понятно. Просто во всех примеры, которые я смотрел по мат. индукции доказывалось равенство для n + 1.

И вот еще один вопрос.

Цитата Сообщение от Shamil1 Посмотреть сообщение
C(m+(m+1)) = C(m) + C(m+1) + 1 = 2m - 1 + 2(m+1) - 1 + 1 = 2(m+(m+1)) - 1 = 2n - 1
В данном равенстве я не могу понять как вы получили данную строчку C(m+(m+1)) = C(m) + C(m+1) + 1. Можете объяснить.

Должно же быть так C(m+(m+1)) = 2C(m+(m+1)/2) + 1.

Кстати, Спасибо что помогаете мне разобраться)
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
15.07.2015, 16:46
Цитата Сообщение от Andreyphisicist Посмотреть сообщение
В данном равенстве я не могу понять как вы получили данную строчку C(m+(m+1)) = C(m) + C(m+1) + 1. Можете объяснить.
Мы разбиваем массив длинной m+(m+1) на две части: длинной m и длинной m+1.
Стоимость нашей функции складывается из стоимости двух рекурсивных вызовов для этих частей и стоимости сравнения в строке 10 (temp1 >= temp2).

Для чётных аналогично:
C(m+m) = C(m) + C(m) + 1
или эквивалентно:
C(2m) = 2C(m) + 1
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
15.07.2015, 17:12  [ТС]
Ну да, вроде все логично) Все понятно теперь.

Я Вам наверно надоел уже с этой задачей) Спасибо большое за помощь)
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
18.07.2015, 09:29  [ТС]
У меня возник один важный вопрос. Помогите пожалуйста разобраться. Вот смотрите, мы получили формулу
C(n) = 2n -1 для каких сравнений?

Для

Code
1
 temp1 >= temp2
или для

Code
1
 l=r
Я просто что-то запутался. Если выполнить обычную проверку и подставить, например, n = 2, то получится что

сравнений temp1 >= temp2 будет один, а сравнений l=r будет 3.

Если подставить n = 4, то получится, что

сравнений temp1 >= temp2 будет 3, а сравнений l=r будет 7.

Таким образом, получается, что мы получили формулу C(n) = 2n -1 именно для сравнений l=r. Я правильно понимаю?


Мы же брали в качестве базовой операции - операцию сравнения temp1 >= temp2. Правильно? Если брать ее в качестве базовой операции, то получится, что начальное условие должно быть равно C(1) = 0 , ведь при n = 1 сравнение temp1 >= temp2 не производится.
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
18.07.2015, 22:32
Посчитайте.
C(1) = 1
C(2m) = 1 + C(m) + C(m) + 1
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
19.07.2015, 15:54  [ТС]
Вот смотрите, что я хочу понять. Раз C(1) = 1, то получается, что мы в качестве базовой операции взяли операцию сравнения l == r, а не temp1 >= temp2.

И по данной формуле C(n) = 2n -1 мы рассчитываем имеено число сравнений l == r . Я правильно понимаю?
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
19.07.2015, 22:48
Вы сами выбираете, что считать. Как решите, так и будет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.07.2015, 22:48
Помогаю со студенческими работами здесь

Алгоритм рекурсивного поиска наибольшего элемента массива.
11. Составьте алгоритм рекурсивного поиска наибольшего элемента массива. Напишите пожалуйста этот алгоритм.

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

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

Составить программу поиска наибольшего по модулю элемента массива, а также индекса этого элемента
Помогите написать программу и составить блок схему. Дано массив А и натуральное число n. Составить программу поиска наибольшего по модулю...

Поиска наибольшего по модулю элемента массива
Дан массив А и натуральное число n. Составить программу поиска наибольшего по модулю элемента массива, а также индекса этого элемента. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru