mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-11 06:56:06 +00:00
deploy
This commit is contained in:
@@ -1731,7 +1731,7 @@
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
8.3 Top-K 问题
|
||||
8.3 Top-k 问题
|
||||
</span>
|
||||
|
||||
|
||||
@@ -3452,8 +3452,8 @@
|
||||
<p><strong>基本数据类型以二进制的形式存储在计算机中</strong>。一个二进制位即为 <span class="arithmatex">\(1\)</span> 比特。在绝大多数现代操作系统中,<span class="arithmatex">\(1\)</span> 字节(byte)由 <span class="arithmatex">\(8\)</span> 比特(bit)组成。</p>
|
||||
<p>基本数据类型的取值范围取决于其占用的空间大小。下面以 Java 为例。</p>
|
||||
<ul>
|
||||
<li>整数类型 <code>byte</code> 占用 <span class="arithmatex">\(1\)</span> byte = <span class="arithmatex">\(8\)</span> bits ,可以表示 <span class="arithmatex">\(2^{8}\)</span> 个数字。</li>
|
||||
<li>整数类型 <code>int</code> 占用 <span class="arithmatex">\(4\)</span> bytes = <span class="arithmatex">\(32\)</span> bits ,可以表示 <span class="arithmatex">\(2^{32}\)</span> 个数字。</li>
|
||||
<li>整数类型 <code>byte</code> 占用 <span class="arithmatex">\(1\)</span> 字节 = <span class="arithmatex">\(8\)</span> 比特 ,可以表示 <span class="arithmatex">\(2^{8}\)</span> 个数字。</li>
|
||||
<li>整数类型 <code>int</code> 占用 <span class="arithmatex">\(4\)</span> 字节 = <span class="arithmatex">\(32\)</span> 比特 ,可以表示 <span class="arithmatex">\(2^{32}\)</span> 个数字。</li>
|
||||
</ul>
|
||||
<p>表 3-1 列举了 Java 中各种基本数据类型的占用空间、取值范围和默认值。此表格无须死记硬背,大致理解即可,需要时可以通过查表来回忆。</p>
|
||||
<p align="center"> 表 3-1 基本数据类型的占用空间和取值范围 </p>
|
||||
@@ -3474,7 +3474,7 @@
|
||||
<tr>
|
||||
<td>整数</td>
|
||||
<td><code>byte</code></td>
|
||||
<td>1 byte</td>
|
||||
<td>1 字节</td>
|
||||
<td><span class="arithmatex">\(-2^7\)</span> (<span class="arithmatex">\(-128\)</span>)</td>
|
||||
<td><span class="arithmatex">\(2^7 - 1\)</span> (<span class="arithmatex">\(127\)</span>)</td>
|
||||
<td><span class="arithmatex">\(0\)</span></td>
|
||||
@@ -3482,7 +3482,7 @@
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><code>short</code></td>
|
||||
<td>2 bytes</td>
|
||||
<td>2 字节</td>
|
||||
<td><span class="arithmatex">\(-2^{15}\)</span></td>
|
||||
<td><span class="arithmatex">\(2^{15} - 1\)</span></td>
|
||||
<td><span class="arithmatex">\(0\)</span></td>
|
||||
@@ -3490,7 +3490,7 @@
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><code>int</code></td>
|
||||
<td>4 bytes</td>
|
||||
<td>4 字节</td>
|
||||
<td><span class="arithmatex">\(-2^{31}\)</span></td>
|
||||
<td><span class="arithmatex">\(2^{31} - 1\)</span></td>
|
||||
<td><span class="arithmatex">\(0\)</span></td>
|
||||
@@ -3498,7 +3498,7 @@
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><code>long</code></td>
|
||||
<td>8 bytes</td>
|
||||
<td>8 字节</td>
|
||||
<td><span class="arithmatex">\(-2^{63}\)</span></td>
|
||||
<td><span class="arithmatex">\(2^{63} - 1\)</span></td>
|
||||
<td><span class="arithmatex">\(0\)</span></td>
|
||||
@@ -3506,7 +3506,7 @@
|
||||
<tr>
|
||||
<td>浮点数</td>
|
||||
<td><code>float</code></td>
|
||||
<td>4 bytes</td>
|
||||
<td>4 字节</td>
|
||||
<td><span class="arithmatex">\(1.175 \times 10^{-38}\)</span></td>
|
||||
<td><span class="arithmatex">\(3.403 \times 10^{38}\)</span></td>
|
||||
<td><span class="arithmatex">\(0.0\text{f}\)</span></td>
|
||||
@@ -3514,7 +3514,7 @@
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><code>double</code></td>
|
||||
<td>8 bytes</td>
|
||||
<td>8 字节</td>
|
||||
<td><span class="arithmatex">\(2.225 \times 10^{-308}\)</span></td>
|
||||
<td><span class="arithmatex">\(1.798 \times 10^{308}\)</span></td>
|
||||
<td><span class="arithmatex">\(0.0\)</span></td>
|
||||
@@ -3522,7 +3522,7 @@
|
||||
<tr>
|
||||
<td>字符</td>
|
||||
<td><code>char</code></td>
|
||||
<td>2 bytes</td>
|
||||
<td>2 字节</td>
|
||||
<td><span class="arithmatex">\(0\)</span></td>
|
||||
<td><span class="arithmatex">\(2^{16} - 1\)</span></td>
|
||||
<td><span class="arithmatex">\(0\)</span></td>
|
||||
@@ -3530,7 +3530,7 @@
|
||||
<tr>
|
||||
<td>布尔</td>
|
||||
<td><code>bool</code></td>
|
||||
<td>1 byte</td>
|
||||
<td>1 字节</td>
|
||||
<td><span class="arithmatex">\(\text{false}\)</span></td>
|
||||
<td><span class="arithmatex">\(\text{true}\)</span></td>
|
||||
<td><span class="arithmatex">\(\text{false}\)</span></td>
|
||||
@@ -3541,12 +3541,12 @@
|
||||
<p>请注意,表 3-1 针对的是 Java 的基本数据类型的情况。每种编程语言都有各自的数据类型定义,它们的占用空间、取值范围和默认值可能会有所不同。</p>
|
||||
<ul>
|
||||
<li>在 Python 中,整数类型 <code>int</code> 可以是任意大小,只受限于可用内存;浮点数 <code>float</code> 是双精度 64 位;没有 <code>char</code> 类型,单个字符实际上是长度为 1 的字符串 <code>str</code> 。</li>
|
||||
<li>C 和 C++ 未明确规定基本数据类型大小,而因实现和平台各异。表 3-1 遵循 LP64 <a href="https://en.cppreference.com/w/cpp/language/types#Properties">数据模型</a>,其用于包括 Linux 和 macOS 在内的 Unix 64 位操作系统。</li>
|
||||
<li>C 和 C++ 未明确规定基本数据类型的大小,而因实现和平台各异。表 3-1 遵循 LP64 <a href="https://en.cppreference.com/w/cpp/language/types#Properties">数据模型</a>,其用于包括 Linux 和 macOS 在内的 Unix 64 位操作系统。</li>
|
||||
<li>字符 <code>char</code> 的大小在 C 和 C++ 中为 1 字节,在大多数编程语言中取决于特定的字符编码方法,详见“字符编码”章节。</li>
|
||||
<li>即使表示布尔量仅需 1 位(<span class="arithmatex">\(0\)</span> 或 <span class="arithmatex">\(1\)</span>),它在内存中通常存储为 1 字节。这是因为现代计算机 CPU 通常将 1 字节作为最小寻址内存单元。</li>
|
||||
<li>即使表示布尔量仅需 1 位(<span class="arithmatex">\(0\)</span> 或 <span class="arithmatex">\(1\)</span>),它在内存中通常也存储为 1 字节。这是因为现代计算机 CPU 通常将 1 字节作为最小寻址内存单元。</li>
|
||||
</ul>
|
||||
<p>那么,基本数据类型与数据结构之间有什么联系呢?我们知道,数据结构是在计算机中组织与存储数据的方式。这句话的主语是“结构”而非“数据”。</p>
|
||||
<p>如果想表示“一排数字”,我们自然会想到使用数组。这是因为数组的线性结构可以表示数字的相邻关系和顺序关系,但至于存储的内容是整数 <code>int</code>、小数 <code>float</code> 或是字符 <code>char</code> ,则与“数据结构”无关。</p>
|
||||
<p>如果想表示“一排数字”,我们自然会想到使用数组。这是因为数组的线性结构可以表示数字的相邻关系和顺序关系,但至于存储的内容是整数 <code>int</code>、小数 <code>float</code> 还是字符 <code>char</code> ,则与“数据结构”无关。</p>
|
||||
<p>换句话说,<strong>基本数据类型提供了数据的“内容类型”,而数据结构提供了数据的“组织方式”</strong>。例如以下代码,我们用相同的数据结构(数组)来存储与表示不同的基本数据类型,包括 <code>int</code>、<code>float</code>、<code>char</code>、<code>bool</code> 等。</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">Python</label><label for="__tabbed_1_2">C++</label><label for="__tabbed_1_3">Java</label><label for="__tabbed_1_4">C#</label><label for="__tabbed_1_5">Go</label><label for="__tabbed_1_6">Swift</label><label for="__tabbed_1_7">JS</label><label for="__tabbed_1_8">TS</label><label for="__tabbed_1_9">Dart</label><label for="__tabbed_1_10">Rust</label><label for="__tabbed_1_11">C</label><label for="__tabbed_1_12">Zig</label></div>
|
||||
<div class="tabbed-content">
|
||||
|
||||
@@ -1806,7 +1806,7 @@
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
8.3 Top-K 问题
|
||||
8.3 Top-k 问题
|
||||
</span>
|
||||
|
||||
|
||||
@@ -3575,7 +3575,7 @@
|
||||
<p><a class="glightbox" href="../character_encoding.assets/ascii_table.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="ASCII 码" class="animation-figure" src="../character_encoding.assets/ascii_table.png" /></a></p>
|
||||
<p align="center"> 图 3-6 ASCII 码 </p>
|
||||
|
||||
<p>然而,<strong>ASCII 码仅能够表示英文</strong>。随着计算机的全球化,诞生了一种能够表示更多语言的字符集「EASCII」。它在 ASCII 的 7 位基础上扩展到 8 位,能够表示 256 个不同的字符。</p>
|
||||
<p>然而,<strong>ASCII 码仅能够表示英文</strong>。随着计算机的全球化,诞生了一种能够表示更多语言的「EASCII」字符集。它在 ASCII 的 7 位基础上扩展到 8 位,能够表示 256 个不同的字符。</p>
|
||||
<p>在世界范围内,陆续出现了一批适用于不同地区的 EASCII 字符集。这些字符集的前 128 个字符统一为 ASCII 码,后 128 个字符定义不同,以适应不同语言的需求。</p>
|
||||
<h2 id="342-gbk">3.4.2 GBK 字符集<a class="headerlink" href="#342-gbk" title="Permanent link">¶</a></h2>
|
||||
<p>后来人们发现,<strong>EASCII 码仍然无法满足许多语言的字符数量要求</strong>。比如汉字有近十万个,光日常使用的就有几千个。中国国家标准总局于 1980 年发布了「GB2312」字符集,其收录了 6763 个汉字,基本满足了汉字的计算机处理需要。</p>
|
||||
@@ -3612,7 +3612,7 @@
|
||||
<p>从存储空间占用的角度看,使用 UTF-8 表示英文字符非常高效,因为它仅需 1 字节;使用 UTF-16 编码某些非英文字符(例如中文)会更加高效,因为它仅需 2 字节,而 UTF-8 可能需要 3 字节。</p>
|
||||
<p>从兼容性的角度看,UTF-8 的通用性最佳,许多工具和库优先支持 UTF-8 。</p>
|
||||
<h2 id="345">3.4.5 编程语言的字符编码<a class="headerlink" href="#345" title="Permanent link">¶</a></h2>
|
||||
<p>对于以往的大多数编程语言,程序运行中的字符串都采用 UTF-16 或 UTF-32 这类等长的编码。在等长编码下,我们可以将字符串看作数组来处理,这种做法具有以下优点。</p>
|
||||
<p>对于以往的大多数编程语言,程序运行中的字符串都采用 UTF-16 或 UTF-32 这类等长编码。在等长编码下,我们可以将字符串看作数组来处理,这种做法具有以下优点。</p>
|
||||
<ul>
|
||||
<li><strong>随机访问</strong>:UTF-16 编码的字符串可以很容易地进行随机访问。UTF-8 是一种变长编码,要想找到第 <span class="arithmatex">\(i\)</span> 个字符,我们需要从字符串的开始处遍历到第 <span class="arithmatex">\(i\)</span> 个字符,这需要 <span class="arithmatex">\(O(n)\)</span> 的时间。</li>
|
||||
<li><strong>字符计数</strong>:与随机访问类似,计算 UTF-16 编码的字符串的长度也是 <span class="arithmatex">\(O(1)\)</span> 的操作。但是,计算 UTF-8 编码的字符串的长度需要遍历整个字符串。</li>
|
||||
|
||||
@@ -1779,7 +1779,7 @@
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
8.3 Top-K 问题
|
||||
8.3 Top-k 问题
|
||||
</span>
|
||||
|
||||
|
||||
@@ -3552,7 +3552,7 @@
|
||||
<li><strong>基于数组可实现</strong>:栈、队列、哈希表、树、堆、图、矩阵、张量(维度 <span class="arithmatex">\(\geq 3\)</span> 的数组)等。</li>
|
||||
<li><strong>基于链表可实现</strong>:栈、队列、哈希表、树、堆、图等。</li>
|
||||
</ul>
|
||||
<p>基于数组实现的数据结构也称“静态数据结构”,这意味着此类数据结构在初始化后长度不可变。相对应地,基于链表实现的数据结构称“动态数据结构”,这类数据结构在初始化后,仍可以在程序运行过程中对其长度进行调整。</p>
|
||||
<p>基于数组实现的数据结构也称“静态数据结构”,这意味着此类数据结构在初始化后长度不可变。相对应地,基于链表实现的数据结构也称“动态数据结构”,这类数据结构在初始化后,仍可以在程序运行过程中对其长度进行调整。</p>
|
||||
<div class="admonition tip">
|
||||
<p class="admonition-title">Tip</p>
|
||||
<p>如果你感觉物理结构理解起来有困难,建议先阅读下一章,然后再回顾本节内容。</p>
|
||||
|
||||
@@ -1721,7 +1721,7 @@
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
8.3 Top-K 问题
|
||||
8.3 Top-k 问题
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
@@ -897,7 +897,7 @@
|
||||
<li class="md-nav__item">
|
||||
<a href="#331" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
3.3.1 整数编码
|
||||
3.3.1 原码、反码和补码
|
||||
</span>
|
||||
</a>
|
||||
|
||||
@@ -1779,7 +1779,7 @@
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
8.3 Top-K 问题
|
||||
8.3 Top-k 问题
|
||||
</span>
|
||||
|
||||
|
||||
@@ -3463,7 +3463,7 @@
|
||||
<li class="md-nav__item">
|
||||
<a href="#331" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
3.3.1 整数编码
|
||||
3.3.1 原码、反码和补码
|
||||
</span>
|
||||
</a>
|
||||
|
||||
@@ -3519,7 +3519,7 @@
|
||||
<p class="admonition-title">Note</p>
|
||||
<p>在本书中,标题带有 * 符号的是选读章节。如果你时间有限或感到理解困难,可以先跳过,等学完必读章节后再单独攻克。</p>
|
||||
</div>
|
||||
<h2 id="331">3.3.1 整数编码<a class="headerlink" href="#331" title="Permanent link">¶</a></h2>
|
||||
<h2 id="331">3.3.1 原码、反码和补码<a class="headerlink" href="#331" title="Permanent link">¶</a></h2>
|
||||
<p>在上一节的表格中我们发现,所有整数类型能够表示的负数都比正数多一个,例如 <code>byte</code> 的取值范围是 <span class="arithmatex">\([-128, 127]\)</span> 。这个现象比较反直觉,它的内在原因涉及原码、反码、补码的相关知识。</p>
|
||||
<p>首先需要指出,<strong>数字是以“补码”的形式存储在计算机中的</strong>。在分析这样做的原因之前,首先给出三者的定义。</p>
|
||||
<ul>
|
||||
@@ -3584,16 +3584,16 @@
|
||||
<p>现在我们可以总结出计算机使用补码的原因:基于补码表示,计算机可以用同样的电路和操作来处理正数和负数的加法,不需要设计特殊的硬件电路来处理减法,并且无须特别处理正负零的歧义问题。这大大简化了硬件设计,提高了运算效率。</p>
|
||||
<p>补码的设计非常精妙,因篇幅关系我们就先介绍到这里,建议有兴趣的读者进一步深入了解。</p>
|
||||
<h2 id="332">3.3.2 浮点数编码<a class="headerlink" href="#332" title="Permanent link">¶</a></h2>
|
||||
<p>细心的你可能会发现:<code>int</code> 和 <code>float</code> 长度相同,都是 4 bytes ,但为什么 <code>float</code> 的取值范围远大于 <code>int</code> ?这非常反直觉,因为按理说 <code>float</code> 需要表示小数,取值范围应该变小才对。</p>
|
||||
<p>实际上,<strong>这是因为浮点数 <code>float</code> 采用了不同的表示方式</strong>。记一个 32-bit 长度的二进制数为:</p>
|
||||
<p>细心的你可能会发现:<code>int</code> 和 <code>float</code> 长度相同,都是 4 字节 ,但为什么 <code>float</code> 的取值范围远大于 <code>int</code> ?这非常反直觉,因为按理说 <code>float</code> 需要表示小数,取值范围应该变小才对。</p>
|
||||
<p>实际上,<strong>这是因为浮点数 <code>float</code> 采用了不同的表示方式</strong>。记一个 32 位长度的二进制数为:</p>
|
||||
<div class="arithmatex">\[
|
||||
b_{31} b_{30} b_{29} \ldots b_2 b_1 b_0
|
||||
\]</div>
|
||||
<p>根据 IEEE 754 标准,32-bit 长度的 <code>float</code> 由以下三个部分构成。</p>
|
||||
<ul>
|
||||
<li>符号位 <span class="arithmatex">\(\mathrm{S}\)</span> :占 1 bit ,对应 <span class="arithmatex">\(b_{31}\)</span> 。</li>
|
||||
<li>指数位 <span class="arithmatex">\(\mathrm{E}\)</span> :占 8 bits ,对应 <span class="arithmatex">\(b_{30} b_{29} \ldots b_{23}\)</span> 。</li>
|
||||
<li>分数位 <span class="arithmatex">\(\mathrm{N}\)</span> :占 23 bits ,对应 <span class="arithmatex">\(b_{22} b_{21} \ldots b_0\)</span> 。</li>
|
||||
<li>符号位 <span class="arithmatex">\(\mathrm{S}\)</span> :占 1 位 ,对应 <span class="arithmatex">\(b_{31}\)</span> 。</li>
|
||||
<li>指数位 <span class="arithmatex">\(\mathrm{E}\)</span> :占 8 位 ,对应 <span class="arithmatex">\(b_{30} b_{29} \ldots b_{23}\)</span> 。</li>
|
||||
<li>分数位 <span class="arithmatex">\(\mathrm{N}\)</span> :占 23 位 ,对应 <span class="arithmatex">\(b_{22} b_{21} \ldots b_0\)</span> 。</li>
|
||||
</ul>
|
||||
<p>二进制数 <code>float</code> 对应值的计算方法为:</p>
|
||||
<div class="arithmatex">\[
|
||||
|
||||
@@ -1779,7 +1779,7 @@
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
8.3 Top-K 问题
|
||||
8.3 Top-k 问题
|
||||
</span>
|
||||
|
||||
|
||||
@@ -3525,8 +3525,8 @@
|
||||
<li>原码、反码和补码是在计算机中编码数字的三种方法,它们之间可以相互转换。整数的原码的最高位是符号位,其余位是数字的值。</li>
|
||||
<li>整数在计算机中是以补码的形式存储的。在补码表示下,计算机可以对正数和负数的加法一视同仁,不需要为减法操作单独设计特殊的硬件电路,并且不存在正负零歧义的问题。</li>
|
||||
<li>浮点数的编码由 1 位符号位、8 位指数位和 23 位分数位构成。由于存在指数位,因此浮点数的取值范围远大于整数,代价是牺牲了精度。</li>
|
||||
<li>ASCII 码是最早出现的英文字符集,长度为 1 字节,共收录 127 个字符。GBK 字符集是常用的中文字符集,共收录两万多个汉字。Unicode 致力于提供一个完整的字符集标准,收录世界内各种语言的字符,从而解决由于字符编码方法不一致而导致的乱码问题。</li>
|
||||
<li>UTF-8 是最受欢迎的 Unicode 编码方法,通用性非常好。它是一种变长的编码方法,具有很好的扩展性,有效提升了存储空间的使用效率。UTF-16 和 UTF-32 是等长的编码方法。在编码中文时,UTF-16 比 UTF-8 的占用空间更小。Java 和 C# 等编程语言默认使用 UTF-16 编码。</li>
|
||||
<li>ASCII 码是最早出现的英文字符集,长度为 1 字节,共收录 127 个字符。GBK 字符集是常用的中文字符集,共收录两万多个汉字。Unicode 致力于提供一个完整的字符集标准,收录世界上各种语言的字符,从而解决由于字符编码方法不一致而导致的乱码问题。</li>
|
||||
<li>UTF-8 是最受欢迎的 Unicode 编码方法,通用性非常好。它是一种变长的编码方法,具有很好的扩展性,有效提升了存储空间的使用效率。UTF-16 和 UTF-32 是等长的编码方法。在编码中文时,UTF-16 占用的空间比 UTF-8 更小。Java 和 C# 等编程语言默认使用 UTF-16 编码。</li>
|
||||
</ul>
|
||||
<h3 id="2-q-a">2. Q & A<a class="headerlink" href="#2-q-a" title="Permanent link">¶</a></h3>
|
||||
<div class="admonition question">
|
||||
@@ -3535,16 +3535,16 @@
|
||||
从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。</p>
|
||||
</div>
|
||||
<div class="admonition question">
|
||||
<p class="admonition-title"><code>char</code> 类型的长度是 1 byte 吗?</p>
|
||||
<p><code>char</code> 类型的长度由编程语言采用的编码方法决定。例如,Java、JavaScript、TypeScript、C# 都采用 UTF-16 编码(保存 Unicode 码点),因此 char 类型的长度为 2 bytes。</p>
|
||||
<p class="admonition-title"><code>char</code> 类型的长度是 1 字节吗?</p>
|
||||
<p><code>char</code> 类型的长度由编程语言采用的编码方法决定。例如,Java、JavaScript、TypeScript、C# 都采用 UTF-16 编码(保存 Unicode 码点),因此 <code>char</code> 类型的长度为 2 字节。</p>
|
||||
</div>
|
||||
<div class="admonition question">
|
||||
<p class="admonition-title">基于数组实现的数据结构也称“静态数据结构” 是否有歧义?因为栈也可以进行出栈和入栈等操作,这些操作都是“动态”的。</p>
|
||||
<p class="admonition-title">基于数组实现的数据结构也称“静态数据结构” 是否有歧义?栈也可以进行出栈和入栈等操作,这些操作都是“动态”的。</p>
|
||||
<p>栈确实可以实现动态的数据操作,但数据结构仍然是“静态”(长度不可变)的。尽管基于数组的数据结构可以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的更大的数组,并将旧数组的内容复制到新数组中。</p>
|
||||
</div>
|
||||
<div class="admonition question">
|
||||
<p class="admonition-title">在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢?</p>
|
||||
<p>在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。</p>
|
||||
<p>在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 <code>ArrayList</code> 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。</p>
|
||||
</div>
|
||||
|
||||
<!-- Source file information -->
|
||||
|
||||
Reference in New Issue
Block a user