1

I have the following algorithm:

func()
{
    for(i=1; i<n; i=i*2)
        print("aa");
}

How can I find Big-Oh using summation?

Raphael
  • 72,336
  • 29
  • 179
  • 389
J. Doe
  • 51
  • 2
  • 8
  • 1
    I saw you post this question before. whatever happened to that one? – Apiwat Chantawibul Mar 01 '18 at 10:51
  • @Billiska I have created one simpler so not to make confuse others with my proposed solution. – J. Doe Mar 01 '18 at 10:53
  • The title you have chosen is not well suited to representing your question. Please take some time to improve it; we have collected some advice here. Thank you! – Raphael Mar 01 '18 at 12:39
  • What have you tried? Where did you get stuck? We do not want to just hand you the solution; we want you to gain understanding. However, as it is we do not know what your underlying problem is, so we can not begin to help. See here for tips on asking questions about exercise problems. If you are uncertain how to improve your question, why not ask around in [chat]? – Raphael Mar 01 '18 at 12:39
  • @Raphael I'm trying to understand the best mathematical way to represents the algorithms and to find the time complexity. For me, till now the best way is by using summation. In order to understand better, I'm working with the simple algorithms as it is in my question here. Now I want to know how can I express this algorithm in summation because it is much easier and much more information on general formulas of summation so in that order I can solve it easier. – J. Doe Mar 01 '18 at 12:44
  • 1
  • "I want to know how can I express this algorithm in summation" You can't. The algorithm prints a's on the screen; summations add up numbers. Adding up numbers can't print letters on a screen. – David Richerby Mar 01 '18 at 18:08

2 Answers2

2

Finding a suitable sum here is a bit awkward since sums in mathematics tend to step up by one, always. So we have to normalize the sequence of values of i

$\qquad i = 1, 2, 4, 8, \dots [i<n]$

to

$\qquad i' = 0,1,2,3, \dots [???]$.

My notation already suggests that it's about finding the right termination predicate.

Roughly speaking, you're looking for the inverse operation to the repeated step function, which by itself is $i \mapsto 2i$. I'm not sure how to lead you towards an answer unless you know about logarithms. If you do, it should be kind of obvious; roughly:

$\quad i' = 0,1,2,3, \dots [i'<\log_2 n \pm 1]$.

Do some tinkering to find out whether you need to use $\lfloor \log_2 n \rfloor$ or $\lceil \log_2 n \rceil$ as upper bound on $i'$. Now, the rest is elementary.

Note that you can go about this by normalizing the for loop first:

for(i=1; i<n; i=i*2)
    print(i)

becomes

for(i' = 0; i' < log(2,n) +- 1; i'++)
    print(2^i');

Note that for functional equivalence, I start with $i'=0$ so that $2^{i'} = i$ in each iteration; you can also use $2^{i'-1}$ instead and start with $i'=1$. Try out a few things -- some make the code nicer, others the mathematics afterwards.

Make sure -- by proof and/or testing -- that the normalized loop computes exactly the same thing as the old one, and then it's all standard. You might need a cheat sheet to simplify the sum.

Raphael
  • 72,336
  • 29
  • 179
  • 389
0

Summation is not the correct technique here. The running time is proportional to the number of loop iterations, which is the number of times you have to double 1 until you reach $n$ (or more). For example:

  • If $n \leq 1$, the loop is run zero times.
  • If $1 < n \leq 2$, the loop is run once.
  • If $2 < n \leq 4$, the loop is run twice.
  • If $4 < n \leq 8$, the loop is run thrice.
  • If $8 < n \leq 16$, the loop is run four times.

And so on. It remains to relate $n$ to the number of iterations of the loop.

It is possible to express the number of iterations as an infinite sum: $$ T(n) = \sum_{k=0}^\infty [\![n > 2^k]\!], $$ where $[\![n > 2^k]\!]$ is $0$ if $n \leq 2^k$ and $1$ if $n > 2^k$. However, I'm not sure that this representation brings us any closer to finding the formula $T(n) = \lceil \log_2 n \rceil$.

Yuval Filmus
  • 276,994
  • 27
  • 311
  • 503
  • Yes I have found other solution like to make a table and for each $i$ to evaluate and to find the array of numbers and in the end, I can see that it is $logn$ but I find summation a better and understandable way to express time complexity this is why I'm asking. – J. Doe Mar 01 '18 at 10:52
  • Summation isn't a panacea. For example, it is completely useless here. How would you solve a quadratic equation using summation, for example? – Yuval Filmus Mar 01 '18 at 10:53
  • Based on the book of concrete mathematics there are series used to solve the complexity of algorithms. So I want to know which is the best way to solve the complexity and till now I have seen the summation is used mostly in books. – J. Doe Mar 01 '18 at 10:56
  • Here you have an example for which summation just isn't the way to determine the time complexity. Not everything in mathematics is a sum. – Yuval Filmus Mar 01 '18 at 10:59
  • @YuvalFilmus Not everything, but the number of iterations of a for-loop better be. – Raphael Mar 01 '18 at 13:11
  • "Summation is not the correct technique here." Yet you go about explaining it using summations. – Musa Al-hassy Mar 01 '18 at 16:23
  • It's an artificial explanation, which I don't find particularly insightful. – Yuval Filmus Mar 01 '18 at 16:53