Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2009, 15:06   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию сложность алгоритма

задача о размене монет с номиналами 25,10,5,1 вот алгоритм
Код:
coins = [25,10,5,1]
N = 78
k=N
while k > 0
       while i < coins.size
	      if coins[i] <= k
	        max = coins[i]
		    break
		  end
		i+=1		
	   end
	  razmen[i] = max		  				   		  		          		   
	  k-=max   
end
Берется число N которое надо разменять, находится монета с наибольшим номиналом, но не больше N, кладется в массив razmen,
затем из N вычитается номинал этой монеты. Таким образом получается размен монет

Код:
Пример:

a = [25,10,5,1]
n = 78
razmen[i] = max(a) = 25
n=n-25 = 52
razmen[i] = max(a) = 25
n=n-25 = 27
razmen[i] = max(a) = 25
n=n-25 = 2
razmen[i] = max(a) = 1
n=n-25 = 1
razmen[i] = max(a) = 1
n=n-25 = 0
razmen[i] = max(a) = 1
нужно вычислить сложность алгоритма.

кол-во итераций вложенного цикла всегда равно coins.size-1 = 3
как расчитать зависимость от N кол-во итераций первого цикла ?

Последний раз редактировалось NiCola999; 22.11.2009 в 15:09.
NiCola999 вне форума Ответить с цитированием
Старый 22.11.2009, 15:23   #2
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Зачем ерундой голову себе забивать? Сделать одним общим формализатором и все. Тогда сложность равна количеству монет, которые входят в итоговый размен. А если не сохранять сами монеты, а только количество, то алгоритм O(1).
LeBron вне форума Ответить с цитированием
Старый 22.11.2009, 15:26   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

дело в том, что в задании сказано использовать жадный алгоритм, вот я его и написал.

допустим I кол-во итераций первого цикла, тогда получается
a = [25,10,5,1]

I = Sum(k=N, 0 ) k /= max(a[k])

max(a[k]) = максим номинал монеты, который не больше k

как теперь вычислить сложность всего алгоритма ?

Последний раз редактировалось NiCola999; 22.11.2009 в 15:32.
NiCola999 вне форума Ответить с цитированием
Старый 22.11.2009, 15:32   #4
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Так и пишите жадный алгоритм. Только по-человечески, по принципу
Код:
if n>=25 then begin 
for t:=1 to n div 25 do begin inc(i);ar[i]:=25;end;
n:=n mod 25;end;
З.Ы. Для больших чисел количество итераций примерно равно количеству монет, а количество монет стремиться к n/25.

Последний раз редактировалось LeBron; 22.11.2009 в 15:53.
LeBron вне форума Ответить с цитированием
Старый 22.11.2009, 15:49   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

я паскаль не знаю, что это значит?
for t:=1 to n div 25 do begin inc(i);ar[i]:=25;end;

цикл от 1 до n/25
a[i] = 25
i+=1
?


Цитата:
количество монет стремиться к n/25
n = 78, хочешь сказать что кол-во монет будет стремиться к 3 ?

Последний раз редактировалось NiCola999; 22.11.2009 в 15:52.
NiCola999 вне форума Ответить с цитированием
Старый 22.11.2009, 15:55   #6
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
я паскаль не знаю, что это значит?
for t:=1 to n div 25 do begin inc(i);ar[i]:=25;end;

цикл от 1 до n/25
a[i] = 25
i+=1
?
То же самое на плюсах:
Код:
if (n>=25){
for (t=1;t<=n/25;t++){i++;ar[i]=25;}
n%=25;}
Я показал пример для монет по 25. Для остальных дальше так же. Суть такая - считаем, сколько монет по 25 можно "отнять" и отнимаем их одним циклом, не проверяя каждый раз, можно ли еще забирать 25, или уже нечего забирать.
LeBron вне форума Ответить с цитированием
Старый 22.11.2009, 17:37   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

так у меня получается тоже самое что и у тебя, просто вместо 25 идут элменты массива.Только кол-во итераций получается 3+кол-во монет

Последний раз редактировалось NiCola999; 22.11.2009 в 17:49.
NiCola999 вне форума Ответить с цитированием
Старый 22.11.2009, 17:49   #8
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
так у меня получается тоже самое что и у тебя, просто вместо 25 идут элменты массива. Кол-во итераций получается 3+кол-во монет в размене
По сути да, но мой вариант более общий - такое используют, если надо просто подсчитать количество монет, не разменивая. Или, например, если можно написать так: 12*25+4*10+1*5+2*1 В конкретно взятом случае да, оба решения одинаково хорошие.
LeBron вне форума Ответить с цитированием
Старый 22.11.2009, 17:51   #9
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

так как расчитать O(n) ?=)
NiCola999 вне форума Ответить с цитированием
Старый 22.11.2009, 17:56   #10
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Рассчитать - разложить? Это и есть решение за О(n). И Ваше, и мое решение, при увеличении числа N, скажем, с миллиона до 2 миллионов, станут работать в 2 раза дольше.
LeBron вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложность с запросом БД k1r1ch БД в Delphi 4 27.09.2009 18:50
Сложность взлома XLS Alex Cones Свободное общение 13 29.08.2009 15:13
Требуется дописать программу на QT. За деньги, сложность низкая. Static2 Фриланс 4 27.02.2009 14:32
Уже не студент, и не могу преодолеть сложность (строки, *.txt) SarahConner Помощь студентам 6 13.01.2009 16:24
Сложность Алгоритма PChEL@ Помощь студентам 3 26.05.2007 07:56