|
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
|
||||||
Декомпозиционный алгоритм для поиска наибольшего элемента12.07.2015, 08:42. Показов 3161. Ответов 23
Метки нет (Все метки)
Добрый день. Помогите пожалуйста разобраться с одной задачкой. Задачка из книги А.Левитина "Алгоритмы: Введение в разработку и анализ". Задачка 4.1.1.
4.1.1. а) напишите псевдокод декомпозиционного алгоритма для поиска наибольшего элемента в массиве из n чисел. б) Какими будут выходные данные алгоритма, если наибольшее значение имеют несколько элементов? в) Напишите рекуррентное соотношение для количества сравнения ключей, выполняемых алгоритмом. г) Сравните созданный вами алгоритм с алгоритмом для решения указанной задачи, основанным на грубой силе. Решение: a) Псевдокод декомпозиционного алгоритма (Возможно я неправильно выделил псевдокод. Просто я не нашел как правильно его выделять).
Поскольку г) Алгоритм на основе грубой силы имеет класс эффективности n, поэтому он будет эффективнее чем данный алгоритм.
0
|
||||||
| 12.07.2015, 08:42 | |
|
Ответы с готовыми решениями:
23
Декомпозиционный алгоритм для вычисления a^n Подскажите алгоритм поиска различного элемента двух последовательностей
|
|
Модератор
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.
Я вычислял эффективность согласно формуле, которая представлена на рисунке ниже. Согласно данной формуле Разве нет? f(n) это же есть сравнение решений двух подзадач. И общее количество сравнений равно n - 1. Или может я что-то не так понимаю.
0
|
|
|
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
|
|
| 12.07.2015, 15:41 [ТС] | |
|
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 [ТС] | |
|
Ну да, Вы скорее всего правы.
Тогда получается Пусть Исходя из начальных условий Значит Таким образом: Посмотрите пожалуйста, вроде должно быть правильно.
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 [ТС] | ||
|
По идее же можно решать подобные рекуррентные только для
Я так понимаю получение точное решение никого не интересует и главное всегда правильно оценивать порядок роста. Ведь так? Т.е. постоянные множители в решении особого значения не играют. А играет лишь класс эффективности. Но как я понял можно получить точное решение для четных и нечетных n методом математической индукции. Правильно? А почему у Вас для четных и нечетных значений получилось одно и тоже значение C(n) = 2n - 1. Ведь так в принципе не должно быть. Для нечетных значений должно же получаться другой значение в любом случае. Можете пояснить что Вы этим доказываете? Я что-то понять не могу.
0
|
||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
|
|||
| 13.07.2015, 19:00 | |||
|
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 [ТС] | ||
|
Я так понимаю, вы сначала делаете предположение, что 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 | |
|
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 | |||
|
В данном конкретном случае различие между чётными и нечётными появляется из-за того, что мы по-разному разбиваем массивы на две части для чётных и нечётных n. (для чётных части одинаковые, а для нечётных - разные).
0
|
|||
|
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 29
|
|||
| 15.07.2015, 08:04 [ТС] | |||
|
И вот еще один вопрос. Должно же быть так C(m+(m+1)) = 2C(m+(m+1)/2) + 1. Кстати, Спасибо что помогаете мне разобраться)
0
|
|||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
|
||
| 15.07.2015, 16:46 | ||
|
Стоимость нашей функции складывается из стоимости двух рекурсивных вызовов для этих частей и стоимости сравнения в строке 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 для каких сравнений? Для
сравнений 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
|
|
| 19.07.2015, 22:48 | |
|
Помогаю со студенческими работами здесь
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
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|