This commit is contained in:
krahets
2023-04-17 21:00:28 +08:00
parent ca2ccfea0b
commit cc58db2cfa
59 changed files with 3271 additions and 382 deletions

View File

@@ -981,6 +981,8 @@
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
@@ -1028,9 +1030,23 @@
<li class="md-nav__item">
<a href="../../chapter_tree/array_representation_of_tree/" class="md-nav__link">
8.3. &nbsp; 二叉树数组表示
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_tree/binary_search_tree/" class="md-nav__link">
8.3. &nbsp; 二叉搜索树
8.4. &nbsp; 二叉搜索树
</a>
</li>
@@ -1044,7 +1060,7 @@
<li class="md-nav__item">
<a href="../../chapter_tree/avl_tree/" class="md-nav__link">
8.4. &nbsp; AVL 树 *
8.5. &nbsp; AVL 树 *
</a>
</li>
@@ -1058,7 +1074,7 @@
<li class="md-nav__item">
<a href="../../chapter_tree/summary/" class="md-nav__link">
8.5. &nbsp; 小结
8.6. &nbsp; 小结
</a>
</li>
@@ -1167,34 +1183,21 @@
<li class="md-nav__item">
<a href="#921" class="md-nav__link">
9.2.1. &nbsp; 两种建堆方法
9.2.1. &nbsp; 借助入堆方法实现
</a>
<nav class="md-nav" aria-label="9.2.1. &nbsp; 两种建堆方法">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
借助入堆方法实现
</a>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
基于堆化操作实现
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#922" class="md-nav__link">
9.2.2. &nbsp; 复杂度分析
9.2.2. &nbsp; 基于堆化操作实现
</a>
</li>
<li class="md-nav__item">
<a href="#923" class="md-nav__link">
9.2.3. &nbsp; 复杂度分析
</a>
</li>
@@ -1802,34 +1805,21 @@
<li class="md-nav__item">
<a href="#921" class="md-nav__link">
9.2.1. &nbsp; 两种建堆方法
9.2.1. &nbsp; 借助入堆方法实现
</a>
<nav class="md-nav" aria-label="9.2.1. &nbsp; 两种建堆方法">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
借助入堆方法实现
</a>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
基于堆化操作实现
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#922" class="md-nav__link">
9.2.2. &nbsp; 复杂度分析
9.2.2. &nbsp; 基于堆化操作实现
</a>
</li>
<li class="md-nav__item">
<a href="#923" class="md-nav__link">
9.2.3. &nbsp; 复杂度分析
</a>
</li>
@@ -1859,11 +1849,10 @@
<h1 id="92">9.2. &nbsp; 建堆操作 *<a class="headerlink" href="#92" title="Permanent link">&para;</a></h1>
<p>如果我们想要根据输入列表生成一个堆,这个过程被称为「建堆」。</p>
<h2 id="921">9.2.1. &nbsp; 两种建堆方法<a class="headerlink" href="#921" title="Permanent link">&para;</a></h2>
<h3 id="_1">借助入堆方法实现<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3>
<h2 id="921">9.2.1. &nbsp; 借助入堆方法实现<a class="headerlink" href="#921" title="Permanent link">&para;</a></h2>
<p>最直接的方法是借助“元素入堆操作”实现,首先创建一个空堆,然后将列表元素依次添加到堆中。</p>
<p>设元素数量为 <span class="arithmatex">\(n\)</span> ,则最后一个元素入堆的时间复杂度为 <span class="arithmatex">\(O(\log n)\)</span> 。在依次添加元素时,堆的平均长度为 <span class="arithmatex">\(\frac{n}{2}\)</span> ,因此该方法的总体时间复杂度为 <span class="arithmatex">\(O(n \log n)\)</span></p>
<h3 id="_2">基于堆化操作实现<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3>
<h2 id="922">9.2.2. &nbsp; 基于堆化操作实现<a class="headerlink" href="#922" title="Permanent link">&para;</a></h2>
<p>有趣的是,存在一种更高效的建堆方法,其时间复杂度仅为 <span class="arithmatex">\(O(n)\)</span> 。我们先将列表所有元素原封不动添加到堆中,<strong>然后迭代地对各个节点执行“从顶至底堆化”</strong>。当然,<strong>我们不需要对叶节点执行堆化操作</strong>,因为它们没有子节点。</p>
<div class="tabbed-set tabbed-alternate" data-tabs="1:10"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><input id="__tabbed_1_6" name="__tabbed_1" type="radio" /><input id="__tabbed_1_7" name="__tabbed_1" type="radio" /><input id="__tabbed_1_8" name="__tabbed_1" type="radio" /><input id="__tabbed_1_9" name="__tabbed_1" type="radio" /><input id="__tabbed_1_10" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Java</label><label for="__tabbed_1_2">C++</label><label for="__tabbed_1_3">Python</label><label for="__tabbed_1_4">Go</label><label for="__tabbed_1_5">JavaScript</label><label for="__tabbed_1_6">TypeScript</label><label for="__tabbed_1_7">C</label><label for="__tabbed_1_8">C#</label><label for="__tabbed_1_9">Swift</label><label for="__tabbed_1_10">Zig</label></div>
<div class="tabbed-content">
@@ -1986,7 +1975,7 @@
</div>
</div>
</div>
<h2 id="922">9.2.2. &nbsp; 复杂度分析<a class="headerlink" href="#922" title="Permanent link">&para;</a></h2>
<h2 id="923">9.2.3. &nbsp; 复杂度分析<a class="headerlink" href="#923" title="Permanent link">&para;</a></h2>
<p>为什么第二种建堆方法的时间复杂度是 <span class="arithmatex">\(O(n)\)</span> ?我们来展开推算一下。</p>
<ul>
<li>完全二叉树中,设节点总数为 <span class="arithmatex">\(n\)</span> ,则叶节点数量为 <span class="arithmatex">\((n + 1) / 2\)</span> ,其中 <span class="arithmatex">\(/\)</span> 为向下整除。因此,在排除叶节点后,需要堆化的节点数量为 <span class="arithmatex">\((n - 1)/2\)</span> ,复杂度为 <span class="arithmatex">\(O(n)\)</span> </li>

View File

@@ -981,6 +981,8 @@
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
@@ -1028,9 +1030,23 @@
<li class="md-nav__item">
<a href="../../chapter_tree/array_representation_of_tree/" class="md-nav__link">
8.3. &nbsp; 二叉树数组表示
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_tree/binary_search_tree/" class="md-nav__link">
8.3. &nbsp; 二叉搜索树
8.4. &nbsp; 二叉搜索树
</a>
</li>
@@ -1044,7 +1060,7 @@
<li class="md-nav__item">
<a href="../../chapter_tree/avl_tree/" class="md-nav__link">
8.4. &nbsp; AVL 树 *
8.5. &nbsp; AVL 树 *
</a>
</li>
@@ -1058,7 +1074,7 @@
<li class="md-nav__item">
<a href="../../chapter_tree/summary/" class="md-nav__link">
8.5. &nbsp; 小结
8.6. &nbsp; 小结
</a>
</li>
@@ -3186,7 +3202,7 @@
<nav class="md-footer__inner md-grid" aria-label="页脚" >
<a href="../../chapter_tree/summary/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 8.5. &amp;nbsp; 小结" rel="prev">
<a href="../../chapter_tree/summary/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 8.6. &amp;nbsp; 小结" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
@@ -3195,7 +3211,7 @@
上一页
</span>
<div class="md-ellipsis">
8.5. &nbsp; 小结
8.6. &nbsp; 小结
</div>
</div>
</a>

View File

@@ -981,6 +981,8 @@
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
@@ -1028,9 +1030,23 @@
<li class="md-nav__item">
<a href="../../chapter_tree/array_representation_of_tree/" class="md-nav__link">
8.3. &nbsp; 二叉树数组表示
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_tree/binary_search_tree/" class="md-nav__link">
8.3. &nbsp; 二叉搜索树
8.4. &nbsp; 二叉搜索树
</a>
</li>
@@ -1044,7 +1060,7 @@
<li class="md-nav__item">
<a href="../../chapter_tree/avl_tree/" class="md-nav__link">
8.4. &nbsp; AVL 树 *
8.5. &nbsp; AVL 树 *
</a>
</li>
@@ -1058,7 +1074,7 @@
<li class="md-nav__item">
<a href="../../chapter_tree/summary/" class="md-nav__link">
8.5. &nbsp; 小结
8.6. &nbsp; 小结
</a>
</li>