2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Время работы алгоритма и оценка его сложности
Сообщение10.11.2007, 18:41 
Надо определить время работы алгоритма и оценить его сложность
Я под каждым примером написал ответы которые у меня получились
проверьте плиз правильно или нет =)


Код:
1.For I = 1: N
  I=I+1;     
  For K=1:N
      K=K+1;
  End 
End


\Longrightarrow n^2, O(n^2)

Код:
2. For I = 1: N
  I=I*2;     
  For K=1:N
      K=K+1;
  End 
End

\Longrightarrow  \frac {n^2} {2} , O(n^2)


Код:
3. For I = 1: N
  I=I*2;     
  For K=1:N
      K=K*2;
  End 
End

\Longrightarrow  \frac {n^2} {4} , O(n^2)


Код:
4. For I = 1: N
  I=I+1;     
  For K=1:I
      K=K+1;
  End 
End 

\Longrightarrow  \frac {n+n^2} {2} , O(n^2)


Код:
5. For I = 1: N
  I=I*2;     
  For K=1:I
      K=K+1;
  End 
End

\Longrightarrow  2^n-1 , O(2^n) - ??? неуверен
Код:

6. For I = 1: N
  I=I*2;     
  For K=1:I
      K=K*2;
  End 
End

\Longrightarrow  \frac {n+n^2} {2} , O(n^2)

 
 
 
 
Сообщение10.11.2007, 20:15 
Аватара пользователя
Во втором примере внешний цикл крутится $1+\lfloor\log_2 N\rfloor$ раз и ответом будет $O(N\log N)$. В остальных аналогичных задачах у вас также неверные ответы.

 
 
 
 
Сообщение10.11.2007, 23:51 
maxal спасибо, а можешь посоветовать литературу по данной теме ?

а то я запутался

вроде по моей формуле работает
например во втором примере если \begin{verbatim} N=4\end{verbatim}
то \begin{verbatim}  I \end{verbatim} и\begin{verbatim}  K \end{verbatim} примут значения:

\begin{verbatim} 
I - K
1 - 
2 - 1 2 
4 - 1 2 3 4 \end{verbatim}

тоесть в сумме будет 7 действий :roll:
как раз по формуле $ \frac {n^2} 2 -1  $

 
 
 
 
Сообщение11.11.2007, 04:39 
Аватара пользователя
:evil:
Invisible, Вы, к сожалению, не указали язык. Между тем, это существенно — в некоторых языках конструкция
Код:
For I = 1:5
  I = I * I
  Print I
End
напечатает 1, 4, 9, 16, 25, а не 1, 4, 16.

Поэтому, без знания исполнения цикла в языке определить сложность нельзя.

P.S. Вы нашли необычный способ записи кода. Форум предоставляет другой — тег [code]

 
 
 
 
Сообщение11.11.2007, 09:33 
незваный гость писал(а):
Вы, к сожалению, не указали язык.

сори,
актуально для языка С++
запись в виде псевдо кода


незваный гость писал(а):
P.S. Вы нашли необычный способ записи кода. Форум предоставляет другой — тег [code]

исправил

 
 
 
 
Сообщение11.11.2007, 09:55 
Аватара пользователя
:evil:
Invisible писал(а):
актуально для языка С++
запись в виде псевдо кода

тогда maxal прав.

Invisible писал(а):
исправил

Немного жаль. Ваш способ был удобочитаем, но очень необычен. Хорошо хоть, кусочек остался, как пример «хорошей магии»


~~~

Ещё одна деталь: какие операции Вы считаете? Сложения, умножения, или число исполнений внутреннего цикла? Если последнее, то нехитро модифицировать любую из программ примерно так:
Код:
5.ExecutionCount = 0;
For I = 1: N
  I=I*2;     
  For K=1:I
      K=K+1;
      ++ExecutionCounter;
  End
End
Print(N, ExecutionCounter);

и сверить с ответом для $N = 1, 2, 3,…$. Думаю, дойдя до 10, Вы найдёте либо совпадение, либо ошибку в большинстве случаев.

 
 
 
 
Сообщение11.11.2007, 17:06 
незваный гость писал(а):
Немного жаль. Ваш способ был удобочитаем, но очень необычен. Хорошо хоть, кусочек остался, как пример «хорошей магии»

вы сами попросили :)
мне тоже нравилось больше как было


незваный гость писал(а):
Ещё одна деталь: какие операции Вы считаете? Сложения, умножения, или число исполнений внутреннего цикла? Если последнее, то нехитро модифицировать любую из программ примерно так:

считать надо по внутреннему циклу
сделать программу и тупо посмотреть на то сколько получится не сложно
вопрос в том как правильно формулу написать

есть литература по теме?

 
 
 
 
Сообщение12.11.2007, 09:34 
Аватара пользователя
:evil:
Invisible писал(а):
вы сами попросили Smile

Я не то, чтобы просил — просто сказал о возможности форума.

Invisible писал(а):
сделать программу и тупо посмотреть на то сколько получится не сложно

Конечно. Смысл в том, чтобы проверить формулу.

С ходу в голову приходит классика: например, первый том Кнута (Искусство программирования для ЭВМ). Но там это не очень внятно, как, впрочем, многое у К. У него же есть очень старая статья, предлагающая $\Theta$ нотацию.

Идея-то, в общем проста: честно считаем важные операции и находим асимптотику. $O$ идёт из классического матана, ничего специфически-алгоритмического нет. Есть пара приёмов: например, часто сумму оценивают интегралом.

Кстати, о честном подсчёте.
maxal писал(а):
Во втором примере внешний цикл крутится $1+\lfloor\log_2 N\rfloor$ раз
и это не совсем точно. Асимптотически, пожалуй, верно, но тогда слишком деталей — можно просто $\log_2 N$ написать. А точную формулу дать вряд ли удастся: здесь смешиваются сложение и умножение, а это часто плохо. Просто достаточно написать рекуррентную формулу для $I$ на очередной итерации: $I_1 = 1, I_j = I_{i-1}^2+1$. Вот этот-то $+1$ всё и портит: последовательность растёт несколько быстрее, чем проcто $2^{j-1}$.

 
 
 
 
Сообщение12.11.2007, 09:45 
Аватара пользователя
незваный гость писал(а):
Вот этот-то $+1$ всё и портит

А кто сказал, что там инкремент переменной происходит? Как я понял, "For" задает просто начальное значение и интервал для переменной цикла, а изменение переменной - уже где-то внутри. Типа как C++:
Код:
for(int i=1;i<=N;i=i*2)

Если именно такая конструкция имется в виду, то мой подсчет количества итераций точен.

 
 
 
 
Сообщение12.11.2007, 20:10 
Аватара пользователя
:evil:
maxal писал(а):
А кто сказал, что там инкремент переменной происходит?

Никто не сказал. Именно поэтому я писал о семантике языка. Но я ещё не встречал языка с FOR, указывающим пределы и не изменяющим переменную цикла по некоторым правилам (или, по крайней мере, явно не отменяющего изманение). Поэтому я подразумевал конструкцию типа:
Код:
for (i = 1; i <= N; ++i) {
  i = i * 2;
  …
}


Эх, стереотипы, стереотипы… Я тоже попался на эту удочку. :oops:

 
 
 
 
Сообщение12.11.2007, 21:22 
maxal писал(а):
незваный гость писал(а):
Вот этот-то $+1$ всё и портит

А кто сказал, что там инкремент переменной происходит? Как я понял, "For" задает просто начальное значение и интервал для переменной цикла, а изменение переменной - уже где-то внутри. Типа как C++:
Код:
for(int i=1;i<=N;i=i*2)



У меня в условии не сказано на счет значения
но мне кажется что
Код:
For I = 1: N
  I=I*2; 
End

надо считать так:
Код:
for(int i=1;i<=N;i=i*2)


maxal писал(а):
Если именно такая конструкция имется в виду, то мой подсчет количества итераций точен.

если подставить N = 32
то получится что во втором примере внешний цикл крутится $\log_2 N$а не $1+\lfloor\log_2 N\rfloor$
так как I примит значения: 2 4 8 16 32
тоесть 5 значний => $\log_2 32 = 5$

или я ошибаюсь?

 
 
 
 
Сообщение12.11.2007, 22:05 
Аватара пользователя
Invisible писал(а):
если подставить N = 32
то получится что во втором примере внешний цикл крутится $\log_2 N$а не $1+\lfloor\log_2 N\rfloor$
так как I примит значения: 2 4 8 16 32

Еще $I=1$. Всего 6.

 
 
 
 
Сообщение13.11.2007, 11:02 
maxal писал(а):
Invisible писал(а):
если подставить N = 32
то получится что во втором примере внешний цикл крутится $\log_2 N$а не $1+\lfloor\log_2 N\rfloor$
так как I примит значения: 2 4 8 16 32

Еще $I=1$. Всего 6.


но если считать количество выполнений внутреннего цикла, который зависит от внешнего
то выходит что 5 * 32 ...?

Добавлено спустя 2 часа 18 минут 27 секунд:

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

Код:
1.For I = 1: N
  I=I+1;     
  For K=1:N
      K=K+1;
  End 
End


\Longrightarrow n^2, O(n^2)

Код:
2. For I = 1: N
  I=I*2;     
  For K=1:N
      K=K+1;
  End 
End

\Longrightarrow  $(N-1)*(\log_2 N)$ , O($N*(\log N)$)


Код:
3. For I = 1: N
  I=I*2;     
  For K=1:N
      K=K*2;
  End 
End

\Longrightarrow  $(\log_2 N)*(\log_2 N)$ , O((\log N)^2)


Код:
4. For I = 1: N
  I=I+1;     
  For K=1:I
      K=K+1;
  End 
End 

\Longrightarrow  \frac {n^2-n} {2} , O(n^2)


Код:
5. For I = 1: N
  I=I*2;     
  For K=1:I
      K=K+1;
  End 
End

\Longrightarrow  $2^\log_2 N +1$-2 -$\log_2 N$  , O($2^\log N$)
Код:

6. For I = 1: N
  I=I*2;     
  For K=1:I
      K=K*2;
  End 
End

\Longrightarrow  \frac {(\log_2 N ) +(\log_2 N )^2} {2} , O((\log N)^2)

 
 
 
 
Сообщение16.11.2007, 09:35 
народ проверьте плиз правильность моего решения

 
 
 [ Сообщений: 14 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group