<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Time-Complexity on avni.sh</title>
    <link>http://www.avni.sh/tags/time-complexity/</link>
    <description>Recent content in Time-Complexity on avni.sh</description>
    <image>
      <title>avni.sh</title>
      <url>http://www.avni.sh/cover.webp</url>
      <link>http://www.avni.sh/cover.webp</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 22 Sep 2023 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://www.avni.sh/tags/time-complexity/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Time Complexity</title>
      <link>http://www.avni.sh/posts/data-structures-and-algorithms/time-complexity/</link>
      <pubDate>Fri, 22 Sep 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/data-structures-and-algorithms/time-complexity/</guid>
      <description>The time complexity metric is used to assess an algorithm&amp;#39;s performance on scale</description>
      <content:encoded><![CDATA[<p>While programming allows us to create virtually anything, the true test of performance arises when we deploy the same code on a significantly larger scale.</p>
<p><strong>Time Complexity</strong> ($T(n)$) is a function that estimates the execution time of an algorithm given the amount of data to be processed as its input ($n$). It is a common benchmark used to measure an algorithm&rsquo;s performance.</p>
<h1 id="bounds-of-time-complexity">Bounds of Time Complexity</h1>
<p>The output of the time complexity function will be a close estimate of an algorithm&rsquo;s runtime given the size of its input but it does not consider other characteristics of the input that could affect its runtime.</p>
<p>Some algorithms perform best when the input data is sorted in ascending order and worst when sorted in descending order or vice versa. That&rsquo;s why we have bounds on the time complexity function, a range starting from best-case to worst-case execution time for the same input size.</p>
<h2 id="upper-bound-o">Upper Bound ($O$)</h2>
<p>The &ldquo;big O&rdquo; ($O$) represents the upper bound (worst-case scenario) on the time complexity function i.e. for an input of size $n$ the algorithm can&rsquo;t take more than $O(n)$ time to provide  the solution.</p>
<h2 id="lower-bound-omega">Lower Bound ($\Omega$)</h2>
<p>The &ldquo;big Omega&rdquo; ($\Omega$) represents the lower bound (best-case scenario) on the time complexity function i.e. for an input of size $n$ the algorithm can&rsquo;t take less than $O(n)$ time to provide the solution.</p>
<h2 id="expected-case-theta">Expected Case ($\Theta$)</h2>
<p>The &ldquo;big Theta&rdquo; ($\Theta$) represents the case where both upper and lower bounds are at the same point (expected case scenario) i.e. for an input of size $n$ the algorithm&rsquo;s time complexity couldn&rsquo;t get better or worse than $\Theta(n)$.</p>
<p>Big $O$ is the preferred time complexity function for an algorithm&rsquo;s runtime analysis because it provides a conservative estimate and its result is independent of factors like hardware performance, characteristics of data, compiler optimization, etc.</p>
<p>While choosing among different algorithms to perform a task we aim for the lowest worst-case time complexity.</p>
<h1 id="common-time-complexity-functions">Common Time Complexity Functions</h1>
<p>The runtime of recurring patterns in programming could be represented by common time complexity functions. This helps us estimate the time complexity of the entire program.</p>
<h2 id="constant-time-complexity-o1">Constant Time Complexity $O(1)$</h2>
<p align="center"><img src="Constant.drawio.png" alt="Scaling an Algorithm with Constant Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Constant Time Complexity</small></p>
<p>An algorithm has <strong>constant time complexity</strong> when its runtime isn&rsquo;t affected by the amount of data passed as input. An example would be a function that performs addition on its two inputs.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">addition</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">y</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// The size of x and y does not affect</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// the runtime of this function</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">x</span><span class="o">+</span><span class="nx">y</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">x</span> <span class="o">:=</span> <span class="mi">2000</span>
</span></span><span class="line"><span class="cl">	<span class="nx">y</span> <span class="o">:=</span> <span class="mi">2132</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Addition of&#34;</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="s">&#34;and&#34;</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span> <span class="nf">addition</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">))</span> 
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Result</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Addition of 2000 and 2132 is: 4132</span>
</span></span></code></pre></div><p>The above example is implemented in the <a href="/posts/go/go-programming-language/" target="_blank">Go Programming Language</a>.</p>
<h2 id="linear-time-complexity-on">Linear Time Complexity $O(n)$</h2>
<p align="center"><img src="Linear.drawio.png" alt="Scaling an Algorithm with Linear Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Linear Time Complexity</small></p>
<p>For some algorithms the execution time is directly proportional to the size of its input, such algorithms are categorized in <strong>linear time complexity</strong>.</p>
<p>An example would be a loop that iterates over elements in a list and returns its sum.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">arraySum</span><span class="p">(</span><span class="nx">arr</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">sum</span> <span class="o">:=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Time taken to complete this loop</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// will be directly proportional to the</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// size of arr</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">element</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">arr</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">sum</span> <span class="o">+=</span> <span class="nx">element</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">sum</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">arrayExample</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Sum of the array:&#34;</span><span class="p">,</span> <span class="nx">arrayExample</span><span class="p">,</span> <span class="s">&#34;will be&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                <span class="nf">arraySum</span><span class="p">(</span><span class="nx">arrayExample</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Sum of the array: [1 2 3 2 1 1] will be 10</span>
</span></span></code></pre></div><p>If we call the function <code>arraySum()</code> twice then the time complexity of the program will be $O(2n)$. However, we can generalize it to $O(n)$ because even though the program performs two passes over the array, the growth rate in runtime remains linear with respect to its input size.</p>
<h2 id="quadratic-time-complexity-on2">Quadratic Time Complexity $O(n^2)$</h2>
<p align="center"><img src="Quadratic.drawio.png" alt="Scaling an Algorithm with Quadratic Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Quadratic Time Complexity</small></p>
<p>Similar to linear time complexity, algorithms exhibiting quadratic time complexity experience execution times that are directly proportional to the square of the number of inputs. These algorithms scale relatively slower (longer execution time) compared to linear time complexity algorithms like $O(n)$, $O(2n)$, etc.</p>
<p>For example, a program that displays pair combinations of all elements in an array using nested loops.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">showCombinations</span><span class="p">(</span><span class="nx">arr</span> <span class="p">[]</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// The inner loop is executed n (size of arr) times.</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Thus, the total time complexity of this function will be O(n*n)</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">element1</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">arr</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="c1">// Time complexity of the inner loop</span>
</span></span><span class="line"><span class="cl">		<span class="c1">// is directly proportional to the size of arr i.e. O(n)</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">element2</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">arr</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">			<span class="k">if</span><span class="p">(</span><span class="nx">element1</span> <span class="o">!=</span> <span class="nx">element2</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">				<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Combination:&#34;</span><span class="p">,</span> <span class="nx">element1</span><span class="p">,</span> <span class="s">&#34;and&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                                            <span class="nx">element2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">arrayExample</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">123</span><span class="p">,</span> <span class="mi">1234</span><span class="p">,</span> <span class="mi">456</span><span class="p">,</span> <span class="mi">5462</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Pair combination of all elements in the array: &#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                <span class="nx">arrayExample</span><span class="p">,</span> <span class="s">&#34;are:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nf">showCombinations</span><span class="p">(</span><span class="nx">arrayExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Pair combination of all elements in the array:  [123 1234 456 5462] are:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 123 and 1234</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 123 and 456</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 123 and 5462</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 1234 and 123</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 1234 and 456</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 1234 and 5462</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 456 and 123</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 456 and 1234</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 456 and 5462</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 5462 and 123</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 5462 and 1234</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Combination: 5462 and 456</span>
</span></span></code></pre></div><h2 id="exponential-time-complexity-o2n">Exponential Time Complexity $O(2^n)$</h2>
<p align="center"><img src="Exponential.drawio.png" alt="Scaling an Algorithm with Exponential Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Exponential Time Complexity</small></p>
<p>A brute-force algorithm to find the $n$th number in the Fibonacci series has exponential time complexity because it branches in two recursive calls on every iteration.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="nx">n</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">n</span> <span class="o">&lt;=</span> <span class="mi">1</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="nx">n</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="c1">// The recursive calls will branch</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// further in two more calls</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">n</span> <span class="o">:=</span> <span class="mi">10</span> 
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;The&#34;</span><span class="p">,</span> <span class="nx">n</span><span class="p">,</span> <span class="s">&#34;th Fibonacci number is:&#34;</span><span class="p">,</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="nx">n</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// The 10 th Fibonacci number is: 55</span>
</span></span></code></pre></div><p>Algorithms with $O(2^n)$, $O(e^n)$, $O(10^n)$, etc. time complexities are grouped under <strong>exponential</strong> time. Among these, the $2^n$ function has widespread use in computer science like Moore&rsquo;s law or to find the number of memory addresses possible with $n$ bits arrangement.</p>
<blockquote>
<p>The number of transistors in an Integrated Circuit (IC) doubles about every two years</p>
<p><cite><a href="https://en.wikipedia.org/wiki/Gordon_Moore" target=_blank>Gordon Moore</a>, Co-Founder of Intel, 1965</cite></p></blockquote>
<h2 id="logarithmic-time-complexity-olog_2n">Logarithmic Time Complexity $O(\log_2{n})$</h2>
<p align="center"><img src="Logarithmic.drawio.png" alt="Scaling an Algorithm with Logarithmic Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Logarithmic Time Complexity</small></p>
<p>The $\log_2{n}$ is the inverse of function $2^n$. The following example of a number guessing game has $O(\log_2{n})$ time complexity because it cuts the search space by half on each iteration.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">guessNumber</span><span class="p">(</span><span class="nx">low</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">high</span> <span class="kt">int</span><span class="p">)(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Returns the middle number in a range from low to high</span>
</span></span><span class="line"><span class="cl">	<span class="nx">mid</span> <span class="o">:=</span> <span class="p">(</span><span class="nx">high</span><span class="o">+</span><span class="nx">low</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">mid</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">low</span> <span class="o">:=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="nx">high</span> <span class="o">:=</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Think of a number between&#34;</span><span class="p">,</span> <span class="nx">low</span><span class="p">,</span> <span class="s">&#34;and&#34;</span><span class="p">,</span> <span class="nx">high</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">numQuestions</span> <span class="o">:=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="nx">answer1</span><span class="p">,</span> <span class="nx">answer2</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">            <span class="nx">guessedNumber</span> <span class="o">:=</span> <span class="nf">guessNumber</span><span class="p">(</span><span class="nx">low</span><span class="p">,</span> <span class="nx">high</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;I guessed:&#34;</span><span class="p">,</span> <span class="nx">guessedNumber</span><span class="p">,</span> <span class="s">&#34;Is that correct?&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;1) Yes&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;2) No&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;Enter your response (1 or 2):&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="nx">fmt</span><span class="p">.</span><span class="nf">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">answer1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="k">switch</span><span class="p">(</span><span class="nx">answer1</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                <span class="k">case</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;It took me&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                                <span class="nx">numQuestions</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">                                <span class="s">&#34;questions to guess your number&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="c1">// It will take maximum log(n) questions to guess a number</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">// Where n is size of the number range in this case 100</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Thanks for playing&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="k">return</span>
</span></span><span class="line"><span class="cl">                
</span></span><span class="line"><span class="cl">                <span class="k">case</span> <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">numQuestions</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Is it higher or lower than&#34;</span><span class="p">,</span> <span class="nx">guessedNumber</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;1) Higher&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;2) Lower&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;Enter your response (1 or 2):&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">answer2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="k">switch</span><span class="p">(</span><span class="nx">answer2</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                        <span class="k">case</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// Halving the search space </span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// to exclude number lower than guessed</span>
</span></span><span class="line"><span class="cl">                            <span class="nx">low</span> <span class="p">=</span> <span class="nx">guessedNumber</span>
</span></span><span class="line"><span class="cl">                        <span class="k">case</span> <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// Halving the search space </span>
</span></span><span class="line"><span class="cl">                            <span class="c1">// to exclude number higher than guessed</span>
</span></span><span class="line"><span class="cl">                            <span class="nx">high</span> <span class="p">=</span> <span class="nx">guessedNumber</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Think of a number between 1 and 100</span>
</span></span><span class="line"><span class="cl"><span class="c1">// I guessed: 50 Is that correct?</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1) Yes</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2) No</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter your response (1 or 2):2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Is it higher or lower than 50</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1) Higher</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2) Lower</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter your response (1 or 2):2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// I guessed: 24 Is that correct?</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1) Yes</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2) No</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter your response (1 or 2):2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Is it higher or lower than 24</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1) Higher</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2) Lower</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter your response (1 or 2):1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// I guessed: 37 Is that correct?</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1) Yes</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2) No</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter your response (1 or 2):1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// It took me 2 questions to guess your number</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Thanks for playing</span>
</span></span></code></pre></div><h2 id="linearithmic-time-complexity-on-log_2-n">Linearithmic Time Complexity $O(n \log_2 n)$</h2>
<p align="center"><img src="Linearithmic.drawio.png" alt="Scaling an Algorithm with Linearithmic Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Linearithmic Time Complexity</small></p>
<p><a href="/posts/computer-science/interview-preparation/merge-sort/" target="_blank">Merge Sort</a>, <a href="/posts/computer-science/interview-preparation/quick-sort/" target="_blank">Quick Sort</a>, and <a href="/posts/computer-science/interview-preparation/heap-sort/" target="_blank">Heap Sort</a> are some examples of algorithms with <strong>linearithmic time complexity</strong>.</p>
<h2 id="factorial-time-complexity-on">Factorial Time Complexity $O(n!)$</h2>
<p align="center"><img src="Factorial.drawio.png" alt="Scaling an Algorithm with Factorial Time Complexity"></p>
<p align="center"><small>Scaling an Algorithm with Factorial Time Complexity</small></p>
<p>The solution to the <a href="/posts/computer-science/interview-preparation/travelling-salesman-problem/" target="_blank">Travelling Salesman Problem</a> has factorial time complexity.</p>
<h1 id="comparing-algorithm-performance-using-time-complexity">Comparing Algorithm Performance Using Time Complexity</h1>
<p>Let&rsquo;s say we&rsquo;ve been provided with a set of algorithms and we have to choose the one which scales best with respect to the growing input size.</p>
<p>Assuming the output of the function $O()$ is an algorithm&rsquo;s worst-case execution time in seconds. As we increase the input size from $1$ to $100$ the runtime of algorithms will scale as follows:</p>
<table>
  <thead>
      <tr>
          <th>Algorithm</th>
          <th>Time Complexity</th>
          <th>Runtime ($n=2$)</th>
          <th>Runtime ($n=10$)</th>
          <th>Runtime ($n=100$)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Logarithmic</td>
          <td>$O(log_2{n})$</td>
          <td>$1$s</td>
          <td>$3.321$s</td>
          <td>$6.644$s</td>
      </tr>
      <tr>
          <td>Linear</td>
          <td>$O(n)$</td>
          <td>$2$s</td>
          <td>$10$s</td>
          <td>$100$s</td>
      </tr>
      <tr>
          <td>Linearithmic</td>
          <td>$O(nlog_2{n})$</td>
          <td>$2$s</td>
          <td>$33.21$s</td>
          <td>$664.4$s</td>
      </tr>
      <tr>
          <td>Quadratic</td>
          <td>$O(n^2)$</td>
          <td>$4$s</td>
          <td>$100$s</td>
          <td>$10000$s</td>
      </tr>
      <tr>
          <td>Exponential</td>
          <td>$O(2^n)$</td>
          <td>$4$s</td>
          <td>$1024$s</td>
          <td>$1.26 \times 10^{30}$s</td>
      </tr>
      <tr>
          <td>Factorial</td>
          <td>$O(n!)$</td>
          <td>$2$s</td>
          <td>$3628800$s</td>
          <td>$9.33 \times 10^{157}$s</td>
      </tr>
  </tbody>
</table>
<p>With the same amount of computational power and input size ($100$), an algorithm with $O(2^n)$ time complexity will finish the task in $3.99 \times 10^{22}$ years. In contrast, an algorithm with $O(n \log_2{n})$ time complexity will take only $664.4$ seconds. This illustrates the importance of performing a time complexity analysis of all possible solutions while solving a problem.</p>
<p>If we plot the worst-case time complexity $O(n)$ against the input size $n$ we can see that algorithms with logarithmic or linear time complexity scale better relative to algorithms with quadratic or exponential time complexity i.e. their runtime grows relatively slow as the input size increases.</p>
<p align="center"><img src="Time Complexity.drawio.png" alt="Time Complexity Comparison of Algorithms"></p>
<p align="center"><small>Time Complexity Comparison of Algorithms</small></p>
<h1 id="resources">Resources</h1>
<p><a href="https://www.freecodecamp.org/news/big-theta-and-asymptotic-notation-explained/" target="_blank">Big Theta and Asymptotic Notation Explained</a><br>
<a href="http://watson.latech.edu/book/future/futureMoores1.html" target="_blank">What is Moore&rsquo;s Law</a><br>
<a href="https://www.khanacademy.org/math/algebra2/x2ec2f6f830c9fb89:logs/x2ec2f6f830c9fb89:log-intro/v/plotting-exponential-logarithm" target="_blank">Relationship between exponentials &amp; logarithms</a><br>
<a href="https://www.khanacademy.org/computing/computer-science/algorithms/recursive-algorithms/a/the-factorial-function" target="_blank">The factorial function</a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
