This commit is contained in:
krahets
2023-11-09 05:13:54 +08:00
parent 9a09f9407e
commit 3f666fa676
85 changed files with 619 additions and 610 deletions

View File

@@ -3477,7 +3477,7 @@
<!-- Page content -->
<h1 id="41">4.1 &nbsp; 数组<a class="headerlink" href="#41" title="Permanent link">&para;</a></h1>
<p>「数组 array」是一种线性数据结构其将相同类型元素存储在连续的内存空间中。我们将元素在数组中的位置称为该元素的「索引 index」。图 4-1 展示了数组的主要术语和概念。</p>
<p><a class="glightbox" href="../array.assets/array_definition.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="数组定义与存储方式" src="../array.assets/array_definition.png" /></a></p>
<p><a class="glightbox" href="../array.assets/array_definition.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="数组定义与存储方式" class="animation-figure" src="../array.assets/array_definition.png" /></a></p>
<p align="center"> 图 4-1 &nbsp; 数组定义与存储方式 </p>
<h2 id="411">4.1.1 &nbsp; 数组常用操作<a class="headerlink" href="#411" title="Permanent link">&para;</a></h2>
@@ -3568,7 +3568,7 @@
</div>
<h3 id="2">2. &nbsp; 访问元素<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3>
<p>数组元素被存储在连续的内存空间中,这意味着计算数组元素的内存地址非常容易。给定数组内存地址(即首元素内存地址)和某个元素的索引,我们可以使用图 4-2 所示的公式计算得到该元素的内存地址,从而直接访问此元素。</p>
<p><a class="glightbox" href="../array.assets/array_memory_location_calculation.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="数组元素的内存地址计算" src="../array.assets/array_memory_location_calculation.png" /></a></p>
<p><a class="glightbox" href="../array.assets/array_memory_location_calculation.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="数组元素的内存地址计算" class="animation-figure" src="../array.assets/array_memory_location_calculation.png" /></a></p>
<p align="center"> 图 4-2 &nbsp; 数组元素的内存地址计算 </p>
<p>观察图 4-2 ,我们发现数组首个元素的索引为 <span class="arithmatex">\(0\)</span> ,这似乎有些反直觉,因为从 <span class="arithmatex">\(1\)</span> 开始计数会更自然。但从地址计算公式的角度看,<strong>索引的含义本质上是内存地址的偏移量</strong>。首个元素的地址偏移量是 <span class="arithmatex">\(0\)</span> ,因此它的索引为 <span class="arithmatex">\(0\)</span> 也是合理的。</p>
@@ -3711,7 +3711,7 @@
</div>
<h3 id="3">3. &nbsp; 插入元素<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3>
<p>数组元素在内存中是“紧挨着的”,它们之间没有空间再存放任何数据。如图 4-3 所示,如果想要在数组中间插入一个元素,则需要将该元素之后的所有元素都向后移动一位,之后再把元素赋值给该索引。</p>
<p><a class="glightbox" href="../array.assets/array_insert_element.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="数组插入元素示例" src="../array.assets/array_insert_element.png" /></a></p>
<p><a class="glightbox" href="../array.assets/array_insert_element.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="数组插入元素示例" class="animation-figure" src="../array.assets/array_insert_element.png" /></a></p>
<p align="center"> 图 4-3 &nbsp; 数组插入元素示例 </p>
<p>值得注意的是,由于数组的长度是固定的,因此插入一个元素必定会导致数组尾部元素的“丢失”。我们将这个问题的解决方案留在列表章节中讨论。</p>
@@ -3864,7 +3864,7 @@
</div>
<h3 id="4">4. &nbsp; 删除元素<a class="headerlink" href="#4" title="Permanent link">&para;</a></h3>
<p>同理,如图 4-4 所示,若想要删除索引 <span class="arithmatex">\(i\)</span> 处的元素,则需要把索引 <span class="arithmatex">\(i\)</span> 之后的元素都向前移动一位。</p>
<p><a class="glightbox" href="../array.assets/array_remove_element.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="数组删除元素示例" src="../array.assets/array_remove_element.png" /></a></p>
<p><a class="glightbox" href="../array.assets/array_remove_element.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="数组删除元素示例" class="animation-figure" src="../array.assets/array_remove_element.png" /></a></p>
<p align="center"> 图 4-4 &nbsp; 数组删除元素示例 </p>
<p>请注意,删除元素完成后,原先末尾的元素变得“无意义”了,所以我们无须特意去修改它。</p>

View File

@@ -3291,9 +3291,7 @@
<!-- Page content -->
<h1 id="4">第 4 章 &nbsp; 数组与链表<a class="headerlink" href="#4" title="Permanent link">&para;</a></h1>
<div class="center-table">
<p><a class="glightbox" href="../assets/covers/chapter_array_and_linkedlist.jpg" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="数组与链表" src="../assets/covers/chapter_array_and_linkedlist.jpg" width="600" /></a></p>
</div>
<p><a class="glightbox" href="../assets/covers/chapter_array_and_linkedlist.jpg" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="数组与链表" class="cover-image" src="../assets/covers/chapter_array_and_linkedlist.jpg" /></a></p>
<div class="admonition abstract">
<p class="admonition-title">Abstract</p>
<p>数据结构的世界如同一堵厚实的砖墙。</p>

View File

@@ -3465,7 +3465,7 @@
<p>内存空间是所有程序的公共资源,在一个复杂的系统运行环境下,空闲的内存空间可能散落在内存各处。我们知道,存储数组的内存空间必须是连续的,而当数组非常大时,内存可能无法提供如此大的连续空间。此时链表的灵活性优势就体现出来了。</p>
<p>「链表 linked list」是一种线性数据结构其中的每个元素都是一个节点对象各个节点通过“引用”相连接。引用记录了下一个节点的内存地址通过它可以从当前节点访问到下一个节点。</p>
<p>链表的设计使得各个节点可以被分散存储在内存各处,它们的内存地址是无须连续的。</p>
<p><a class="glightbox" href="../linked_list.assets/linkedlist_definition.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="链表定义与存储方式" src="../linked_list.assets/linkedlist_definition.png" /></a></p>
<p><a class="glightbox" href="../linked_list.assets/linkedlist_definition.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="链表定义与存储方式" class="animation-figure" src="../linked_list.assets/linkedlist_definition.png" /></a></p>
<p align="center"> 图 4-5 &nbsp; 链表定义与存储方式 </p>
<p>观察图 4-5 ,链表的组成单位是「节点 node」对象。每个节点都包含两项数据节点的“值”和指向下一节点的“引用”。</p>
@@ -3811,7 +3811,7 @@
<h3 id="2">2. &nbsp; 插入节点<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3>
<p>在链表中插入节点非常容易。如图 4-6 所示,假设我们想在相邻的两个节点 <code>n0</code><code>n1</code> 之间插入一个新节点 <code>P</code> <strong>则只需要改变两个节点引用(指针)即可</strong>,时间复杂度为 <span class="arithmatex">\(O(1)\)</span></p>
<p>相比之下,在数组中插入元素的时间复杂度为 <span class="arithmatex">\(O(n)\)</span> ,在大数据量下的效率较低。</p>
<p><a class="glightbox" href="../linked_list.assets/linkedlist_insert_node.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="链表插入节点示例" src="../linked_list.assets/linkedlist_insert_node.png" /></a></p>
<p><a class="glightbox" href="../linked_list.assets/linkedlist_insert_node.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="链表插入节点示例" class="animation-figure" src="../linked_list.assets/linkedlist_insert_node.png" /></a></p>
<p align="center"> 图 4-6 &nbsp; 链表插入节点示例 </p>
<div class="tabbed-set tabbed-alternate" data-tabs="3:12"><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" /><input id="__tabbed_3_11" name="__tabbed_3" type="radio" /><input id="__tabbed_3_12" name="__tabbed_3" type="radio" /><div class="tabbed-labels"><label for="__tabbed_3_1">Python</label><label for="__tabbed_3_2">C++</label><label for="__tabbed_3_3">Java</label><label for="__tabbed_3_4">C#</label><label for="__tabbed_3_5">Go</label><label for="__tabbed_3_6">Swift</label><label for="__tabbed_3_7">JS</label><label for="__tabbed_3_8">TS</label><label for="__tabbed_3_9">Dart</label><label for="__tabbed_3_10">Rust</label><label for="__tabbed_3_11">C</label><label for="__tabbed_3_12">Zig</label></div>
@@ -3929,7 +3929,7 @@
<h3 id="3">3. &nbsp; 删除节点<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3>
<p>如图 4-7 所示,在链表中删除节点也非常方便,<strong>只需改变一个节点的引用(指针)即可</strong></p>
<p>请注意,尽管在删除操作完成后节点 <code>P</code> 仍然指向 <code>n1</code> ,但实际上遍历此链表已经无法访问到 <code>P</code> ,这意味着 <code>P</code> 已经不再属于该链表了。</p>
<p><a class="glightbox" href="../linked_list.assets/linkedlist_remove_node.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="链表删除节点" src="../linked_list.assets/linkedlist_remove_node.png" /></a></p>
<p><a class="glightbox" href="../linked_list.assets/linkedlist_remove_node.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="链表删除节点" class="animation-figure" src="../linked_list.assets/linkedlist_remove_node.png" /></a></p>
<p align="center"> 图 4-7 &nbsp; 链表删除节点 </p>
<div class="tabbed-set tabbed-alternate" data-tabs="4:12"><input checked="checked" id="__tabbed_4_1" name="__tabbed_4" type="radio" /><input id="__tabbed_4_2" name="__tabbed_4" type="radio" /><input id="__tabbed_4_3" name="__tabbed_4" type="radio" /><input id="__tabbed_4_4" name="__tabbed_4" type="radio" /><input id="__tabbed_4_5" name="__tabbed_4" type="radio" /><input id="__tabbed_4_6" name="__tabbed_4" type="radio" /><input id="__tabbed_4_7" name="__tabbed_4" type="radio" /><input id="__tabbed_4_8" name="__tabbed_4" type="radio" /><input id="__tabbed_4_9" name="__tabbed_4" type="radio" /><input id="__tabbed_4_10" name="__tabbed_4" type="radio" /><input id="__tabbed_4_11" name="__tabbed_4" type="radio" /><input id="__tabbed_4_12" name="__tabbed_4" type="radio" /><div class="tabbed-labels"><label for="__tabbed_4_1">Python</label><label for="__tabbed_4_2">C++</label><label for="__tabbed_4_3">Java</label><label for="__tabbed_4_4">C#</label><label for="__tabbed_4_5">Go</label><label for="__tabbed_4_6">Swift</label><label for="__tabbed_4_7">JS</label><label for="__tabbed_4_8">TS</label><label for="__tabbed_4_9">Dart</label><label for="__tabbed_4_10">Rust</label><label for="__tabbed_4_11">C</label><label for="__tabbed_4_12">Zig</label></div>
@@ -4644,7 +4644,7 @@
</div>
</div>
</div>
<p><a class="glightbox" href="../linked_list.assets/linkedlist_common_types.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="常见链表种类" src="../linked_list.assets/linkedlist_common_types.png" /></a></p>
<p><a class="glightbox" href="../linked_list.assets/linkedlist_common_types.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="常见链表种类" class="animation-figure" src="../linked_list.assets/linkedlist_common_types.png" /></a></p>
<p align="center"> 图 4-8 &nbsp; 常见链表种类 </p>
<h2 id="424">4.2.4 &nbsp; 链表典型应用<a class="headerlink" href="#424" title="Permanent link">&para;</a></h2>