mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-14 16:16:06 +00:00
deploy
This commit is contained in:
@@ -2163,7 +2163,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p><strong>在递归函数中,需要注意统计栈帧空间</strong>。例如,函数 <code>loop()</code> 在循环中调用了 <span class="arithmatex">\(n\)</span> 次 <code>function()</code>,每轮中的 <code>function()</code> 都返回并释放了栈帧空间,因此空间复杂度仍为 <span class="arithmatex">\(O(1)\)</span> 。而递归函数 <code>recur()</code> 在运行过程中会同时存在 <span class="arithmatex">\(n\)</span> 个未返回的 <code>recur()</code>,从而占用 <span class="arithmatex">\(O(n)\)</span> 的栈帧空间。</p>
|
||||
<p><strong>在递归函数中,需要注意统计栈帧空间</strong>。例如,函数 <code>loop()</code> 在循环中调用了 <span class="arithmatex">\(n\)</span> 次 <code>function()</code> ,每轮中的 <code>function()</code> 都返回并释放了栈帧空间,因此空间复杂度仍为 <span class="arithmatex">\(O(1)\)</span> 。而递归函数 <code>recur()</code> 在运行过程中会同时存在 <span class="arithmatex">\(n\)</span> 个未返回的 <code>recur()</code> ,从而占用 <span class="arithmatex">\(O(n)\)</span> 的栈帧空间。</p>
|
||||
<div class="tabbed-set tabbed-alternate" data-tabs="3:10"><input checked="checked" id="__tabbed_3_1" name="__tabbed_3" type="radio" /><input id="__tabbed_3_2" name="__tabbed_3" type="radio" /><input id="__tabbed_3_3" name="__tabbed_3" type="radio" /><input id="__tabbed_3_4" name="__tabbed_3" type="radio" /><input id="__tabbed_3_5" name="__tabbed_3" type="radio" /><input id="__tabbed_3_6" name="__tabbed_3" type="radio" /><input id="__tabbed_3_7" name="__tabbed_3" type="radio" /><input id="__tabbed_3_8" name="__tabbed_3" type="radio" /><input id="__tabbed_3_9" name="__tabbed_3" type="radio" /><input id="__tabbed_3_10" name="__tabbed_3" type="radio" /><div class="tabbed-labels"><label for="__tabbed_3_1">Java</label><label for="__tabbed_3_2">C++</label><label for="__tabbed_3_3">Python</label><label for="__tabbed_3_4">Go</label><label for="__tabbed_3_5">JavaScript</label><label for="__tabbed_3_6">TypeScript</label><label for="__tabbed_3_7">C</label><label for="__tabbed_3_8">C#</label><label for="__tabbed_3_9">Swift</label><label for="__tabbed_3_10">Zig</label></div>
|
||||
<div class="tabbed-content">
|
||||
<div class="tabbed-block">
|
||||
@@ -2946,7 +2946,7 @@ O(1) < O(\log n) < O(n) < O(n^2) < O(2^n) \newline
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p>在以下递归函数中,同时存在 <span class="arithmatex">\(n\)</span> 个未返回的 <code>algorithm()</code>,并且每个函数中都初始化了一个数组,长度分别为 <span class="arithmatex">\(n, n-1, n-2, ..., 2, 1\)</span> ,平均长度为 <span class="arithmatex">\(\frac{n}{2}\)</span> ,因此总体占用 <span class="arithmatex">\(O(n^2)\)</span> 空间。</p>
|
||||
<p>在以下递归函数中,同时存在 <span class="arithmatex">\(n\)</span> 个未返回的 <code>algorithm()</code> ,并且每个函数中都初始化了一个数组,长度分别为 <span class="arithmatex">\(n, n-1, n-2, ..., 2, 1\)</span> ,平均长度为 <span class="arithmatex">\(\frac{n}{2}\)</span> ,因此总体占用 <span class="arithmatex">\(O(n^2)\)</span> 空间。</p>
|
||||
<div class="tabbed-set tabbed-alternate" data-tabs="8:10"><input checked="checked" id="__tabbed_8_1" name="__tabbed_8" type="radio" /><input id="__tabbed_8_2" name="__tabbed_8" type="radio" /><input id="__tabbed_8_3" name="__tabbed_8" type="radio" /><input id="__tabbed_8_4" name="__tabbed_8" type="radio" /><input id="__tabbed_8_5" name="__tabbed_8" type="radio" /><input id="__tabbed_8_6" name="__tabbed_8" type="radio" /><input id="__tabbed_8_7" name="__tabbed_8" type="radio" /><input id="__tabbed_8_8" name="__tabbed_8" type="radio" /><input id="__tabbed_8_9" name="__tabbed_8" type="radio" /><input id="__tabbed_8_10" name="__tabbed_8" type="radio" /><div class="tabbed-labels"><label for="__tabbed_8_1">Java</label><label for="__tabbed_8_2">C++</label><label for="__tabbed_8_3">Python</label><label for="__tabbed_8_4">Go</label><label for="__tabbed_8_5">JavaScript</label><label for="__tabbed_8_6">TypeScript</label><label for="__tabbed_8_7">C</label><label for="__tabbed_8_8">C#</label><label for="__tabbed_8_9">Swift</label><label for="__tabbed_8_10">Zig</label></div>
|
||||
<div class="tabbed-content">
|
||||
<div class="tabbed-block">
|
||||
|
||||
@@ -2085,7 +2085,7 @@
|
||||
<p>然而实际上,<strong>统计算法的运行时间既不合理也不现实</strong>。首先,我们不希望预估时间和运行平台绑定,因为算法需要在各种不同的平台上运行。其次,我们很难获知每种操作的运行时间,这给预估过程带来了极大的难度。</p>
|
||||
<h2 id="222">2.2.2. 统计时间增长趋势<a class="headerlink" href="#222" title="Permanent link">¶</a></h2>
|
||||
<p>「时间复杂度分析」采取了一种不同的方法,其统计的不是算法运行时间,<strong>而是算法运行时间随着数据量变大时的增长趋势</strong>。</p>
|
||||
<p>“时间增长趋势”这个概念较为抽象,我们通过一个例子来加以理解。假设输入数据大小为 <span class="arithmatex">\(n\)</span>,给定三个算法 <code>A</code>,<code>B</code>,<code>C</code> 。</p>
|
||||
<p>“时间增长趋势”这个概念较为抽象,我们通过一个例子来加以理解。假设输入数据大小为 <span class="arithmatex">\(n\)</span> ,给定三个算法 <code>A</code> , <code>B</code> , <code>C</code> 。</p>
|
||||
<ul>
|
||||
<li>算法 <code>A</code> 只有 <span class="arithmatex">\(1\)</span> 个打印操作,算法运行时间不随着 <span class="arithmatex">\(n\)</span> 增大而增长。我们称此算法的时间复杂度为「常数阶」。</li>
|
||||
<li>算法 <code>B</code> 中的打印操作需要循环 <span class="arithmatex">\(n\)</span> 次,算法运行时间随着 <span class="arithmatex">\(n\)</span> 增大呈线性增长。此算法的时间复杂度被称为「线性阶」。</li>
|
||||
@@ -2599,7 +2599,7 @@ T(n) & = n^2 + n & \text{偷懒统计 (o.O)}
|
||||
</div>
|
||||
</div>
|
||||
<h3 id="2">2) 判断渐近上界<a class="headerlink" href="#2" title="Permanent link">¶</a></h3>
|
||||
<p><strong>时间复杂度由多项式 <span class="arithmatex">\(T(n)\)</span> 中最高阶的项来决定</strong>。这是因为在 <span class="arithmatex">\(n\)</span> 趋于无穷大时,最高阶的项将发挥主导作用,其它项的影响都可以被忽略。</p>
|
||||
<p><strong>时间复杂度由多项式 <span class="arithmatex">\(T(n)\)</span> 中最高阶的项来决定</strong>。这是因为在 <span class="arithmatex">\(n\)</span> 趋于无穷大时,最高阶的项将发挥主导作用,其他项的影响都可以被忽略。</p>
|
||||
<p>以下表格展示了一些例子,其中一些夸张的值是为了强调“系数无法撼动阶数”这一结论。当 <span class="arithmatex">\(n\)</span> 趋于无穷大时,这些常数变得无足轻重。</p>
|
||||
<div class="center-table">
|
||||
<table>
|
||||
|
||||
Reference in New Issue
Block a user