This commit is contained in:
krahets
2023-08-20 13:37:20 +08:00
parent 88e0b11361
commit 96fded547b
35 changed files with 777 additions and 716 deletions

View File

@@ -944,50 +944,50 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
初始化数组
<a href="#1" class="md-nav__link">
1. &nbsp; 初始化数组
</a>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
访问元素
<a href="#2" class="md-nav__link">
2. &nbsp; 访问元素
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
插入元素
<a href="#3" class="md-nav__link">
3. &nbsp; 插入元素
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
删除元素
<a href="#4" class="md-nav__link">
4. &nbsp; 删除元素
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
遍历数组
<a href="#5" class="md-nav__link">
5. &nbsp; 遍历数组
</a>
</li>
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
查找元素
<a href="#6" class="md-nav__link">
6. &nbsp; 查找元素
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
扩容数组
<a href="#7" class="md-nav__link">
7. &nbsp; 扩容数组
</a>
</li>
@@ -3445,50 +3445,50 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
初始化数组
<a href="#1" class="md-nav__link">
1. &nbsp; 初始化数组
</a>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
访问元素
<a href="#2" class="md-nav__link">
2. &nbsp; 访问元素
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
插入元素
<a href="#3" class="md-nav__link">
3. &nbsp; 插入元素
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
删除元素
<a href="#4" class="md-nav__link">
4. &nbsp; 删除元素
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
遍历数组
<a href="#5" class="md-nav__link">
5. &nbsp; 遍历数组
</a>
</li>
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
查找元素
<a href="#6" class="md-nav__link">
6. &nbsp; 查找元素
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
扩容数组
<a href="#7" class="md-nav__link">
7. &nbsp; 扩容数组
</a>
</li>
@@ -3541,7 +3541,7 @@
<p align="center"> 图:数组定义与存储方式 </p>
<h2 id="411">4.1.1 &nbsp; 数组常用操作<a class="headerlink" href="#411" title="Permanent link">&para;</a></h2>
<h3 id="_1">初始化数组<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3>
<h3 id="1">1. &nbsp; 初始化数组<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<p>我们可以根据需求选用数组的两种初始化方式:无初始值、给定初始值。在未指定初始值的情况下,大多数编程语言会将数组元素初始化为 <span class="arithmatex">\(0\)</span></p>
<div class="tabbed-set tabbed-alternate" data-tabs="1:12"><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" /><input id="__tabbed_1_11" name="__tabbed_1" type="radio" /><input id="__tabbed_1_12" 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">JS</label><label for="__tabbed_1_6">TS</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><label for="__tabbed_1_11">Dart</label><label for="__tabbed_1_12">Rust</label></div>
<div class="tabbed-content">
@@ -3625,7 +3625,7 @@
</div>
</div>
</div>
<h3 id="_2">访问元素<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3>
<h3 id="2">2. &nbsp; 访问元素<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3>
<p>数组元素被存储在连续的内存空间中,这意味着计算数组元素的内存地址非常容易。给定数组内存地址(即首元素内存地址)和某个元素的索引,我们可以使用以下公式计算得到该元素的内存地址,从而直接访问此元素。</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="c1"># 元素内存地址 = 数组内存地址(首元素内存地址) + 元素长度 * 元素索引</span>
<a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a><span class="nv">elementAddr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>firtstElementAddr<span class="w"> </span>+<span class="w"> </span>elementLength<span class="w"> </span>*<span class="w"> </span>elementIndex
@@ -3771,7 +3771,7 @@
</div>
</div>
</div>
<h3 id="_3">插入元素<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3>
<h3 id="3">3. &nbsp; 插入元素<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3>
<p>数组元素在内存中是“紧挨着的”,它们之间没有空间再存放任何数据。这意味着如果想要在数组中间插入一个元素,则需要将该元素之后的所有元素都向后移动一位,之后再把元素赋值给该索引。</p>
<p>值得注意的是,由于数组的长度是固定的,因此插入一个元素必定会导致数组尾部元素的“丢失”。我们将这个问题的解决方案留在列表章节中讨论。</p>
<p><img alt="数组插入元素" src="../array.assets/array_insert_element.png" /></p>
@@ -3924,7 +3924,7 @@
</div>
</div>
</div>
<h3 id="_4">删除元素<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3>
<h3 id="4">4. &nbsp; 删除元素<a class="headerlink" href="#4" title="Permanent link">&para;</a></h3>
<p>同理,如果我们想要删除索引 <span class="arithmatex">\(i\)</span> 处的元素,则需要把索引 <span class="arithmatex">\(i\)</span> 之后的元素都向前移动一位。</p>
<p>请注意,删除元素完成后,原先末尾的元素变得“无意义”了,所以我们无需特意去修改它。</p>
<p><img alt="数组删除元素" src="../array.assets/array_remove_element.png" /></p>
@@ -4061,7 +4061,7 @@
<li><strong>丢失元素</strong>:由于数组的长度不可变,因此在插入元素后,超出数组长度范围的元素会丢失。</li>
<li><strong>内存浪费</strong>:我们可以初始化一个比较长的数组,只用前面一部分,这样在插入数据时,丢失的末尾元素都是“无意义”的,但这样做也会造成部分内存空间的浪费。</li>
</ul>
<h3 id="_5">遍历数组<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3>
<h3 id="5">5. &nbsp; 遍历数组<a class="headerlink" href="#5" title="Permanent link">&para;</a></h3>
<p>在大多数编程语言中,我们既可以通过索引遍历数组,也可以直接遍历获取数组中的每个元素。</p>
<div class="tabbed-set tabbed-alternate" data-tabs="5:12"><input checked="checked" id="__tabbed_5_1" name="__tabbed_5" type="radio" /><input id="__tabbed_5_2" name="__tabbed_5" type="radio" /><input id="__tabbed_5_3" name="__tabbed_5" type="radio" /><input id="__tabbed_5_4" name="__tabbed_5" type="radio" /><input id="__tabbed_5_5" name="__tabbed_5" type="radio" /><input id="__tabbed_5_6" name="__tabbed_5" type="radio" /><input id="__tabbed_5_7" name="__tabbed_5" type="radio" /><input id="__tabbed_5_8" name="__tabbed_5" type="radio" /><input id="__tabbed_5_9" name="__tabbed_5" type="radio" /><input id="__tabbed_5_10" name="__tabbed_5" type="radio" /><input id="__tabbed_5_11" name="__tabbed_5" type="radio" /><input id="__tabbed_5_12" name="__tabbed_5" type="radio" /><div class="tabbed-labels"><label for="__tabbed_5_1">Java</label><label for="__tabbed_5_2">C++</label><label for="__tabbed_5_3">Python</label><label for="__tabbed_5_4">Go</label><label for="__tabbed_5_5">JS</label><label for="__tabbed_5_6">TS</label><label for="__tabbed_5_7">C</label><label for="__tabbed_5_8">C#</label><label for="__tabbed_5_9">Swift</label><label for="__tabbed_5_10">Zig</label><label for="__tabbed_5_11">Dart</label><label for="__tabbed_5_12">Rust</label></div>
<div class="tabbed-content">
@@ -4246,7 +4246,7 @@
</div>
</div>
</div>
<h3 id="_6">查找元素<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3>
<h3 id="6">6. &nbsp; 查找元素<a class="headerlink" href="#6" title="Permanent link">&para;</a></h3>
<p>在数组中查找指定元素需要遍历数组,每轮判断元素值是否匹配,若匹配则输出对应索引。</p>
<p>因为数组是线性数据结构,所以上述查找操作被称为「线性查找」。</p>
<div class="tabbed-set tabbed-alternate" data-tabs="6:12"><input checked="checked" id="__tabbed_6_1" name="__tabbed_6" type="radio" /><input id="__tabbed_6_2" name="__tabbed_6" type="radio" /><input id="__tabbed_6_3" name="__tabbed_6" type="radio" /><input id="__tabbed_6_4" name="__tabbed_6" type="radio" /><input id="__tabbed_6_5" name="__tabbed_6" type="radio" /><input id="__tabbed_6_6" name="__tabbed_6" type="radio" /><input id="__tabbed_6_7" name="__tabbed_6" type="radio" /><input id="__tabbed_6_8" name="__tabbed_6" type="radio" /><input id="__tabbed_6_9" name="__tabbed_6" type="radio" /><input id="__tabbed_6_10" name="__tabbed_6" type="radio" /><input id="__tabbed_6_11" name="__tabbed_6" type="radio" /><input id="__tabbed_6_12" name="__tabbed_6" type="radio" /><div class="tabbed-labels"><label for="__tabbed_6_1">Java</label><label for="__tabbed_6_2">C++</label><label for="__tabbed_6_3">Python</label><label for="__tabbed_6_4">Go</label><label for="__tabbed_6_5">JS</label><label for="__tabbed_6_6">TS</label><label for="__tabbed_6_7">C</label><label for="__tabbed_6_8">C#</label><label for="__tabbed_6_9">Swift</label><label for="__tabbed_6_10">Zig</label><label for="__tabbed_6_11">Dart</label><label for="__tabbed_6_12">Rust</label></div>
@@ -4386,7 +4386,7 @@
</div>
</div>
</div>
<h3 id="_7">扩容数组<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h3>
<h3 id="7">7. &nbsp; 扩容数组<a class="headerlink" href="#7" title="Permanent link">&para;</a></h3>
<p>在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在大多数编程语言中,<strong>数组的长度是不可变的</strong></p>
<p>如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次拷贝到新数组。这是一个 <span class="arithmatex">\(O(n)\)</span> 的操作,在数组很大的情况下是非常耗时的。</p>
<div class="tabbed-set tabbed-alternate" data-tabs="7:12"><input checked="checked" id="__tabbed_7_1" name="__tabbed_7" type="radio" /><input id="__tabbed_7_2" name="__tabbed_7" type="radio" /><input id="__tabbed_7_3" name="__tabbed_7" type="radio" /><input id="__tabbed_7_4" name="__tabbed_7" type="radio" /><input id="__tabbed_7_5" name="__tabbed_7" type="radio" /><input id="__tabbed_7_6" name="__tabbed_7" type="radio" /><input id="__tabbed_7_7" name="__tabbed_7" type="radio" /><input id="__tabbed_7_8" name="__tabbed_7" type="radio" /><input id="__tabbed_7_9" name="__tabbed_7" type="radio" /><input id="__tabbed_7_10" name="__tabbed_7" type="radio" /><input id="__tabbed_7_11" name="__tabbed_7" type="radio" /><input id="__tabbed_7_12" name="__tabbed_7" type="radio" /><div class="tabbed-labels"><label for="__tabbed_7_1">Java</label><label for="__tabbed_7_2">C++</label><label for="__tabbed_7_3">Python</label><label for="__tabbed_7_4">Go</label><label for="__tabbed_7_5">JS</label><label for="__tabbed_7_6">TS</label><label for="__tabbed_7_7">C</label><label for="__tabbed_7_8">C#</label><label for="__tabbed_7_9">Swift</label><label for="__tabbed_7_10">Zig</label><label for="__tabbed_7_11">Dart</label><label for="__tabbed_7_12">Rust</label></div>