mirror of
https://github.com/krahets/hello-algo.git
synced 2024-12-24 04:06:28 +08:00
The 4th revision (#1060)
This commit is contained in:
parent
dbb2c07cb1
commit
504c6b0568
3 changed files with 5 additions and 6 deletions
|
@ -76,7 +76,7 @@ UTF-8 的编码规则并不复杂,分为以下两种情况。
|
|||
- JavaScript 和 TypeScript 的字符串使用 UTF-16 编码的原因与 Java 类似。当 1995 年 Netscape 公司首次推出 JavaScript 语言时,Unicode 还处于发展早期,那时候使用 16 位的编码就足以表示所有的 Unicode 字符了。
|
||||
- C# 使用 UTF-16 编码,主要是因为 .NET 平台是由 Microsoft 设计的,而 Microsoft 的很多技术(包括 Windows 操作系统)都广泛使用 UTF-16 编码。
|
||||
|
||||
由于以上编程语言对字符数量的低估,它们不得不采取“代理对”的方式来表示超过 16 位长度的 Unicode 字符。这是一个不得已为之的无奈之举。一方面,包含代理对的字符串中,一个字符可能占用 2 字节或 4 字节,从而丧失了等长编码的优势。另一方面,处理代理对需要增加额外代码,这提高了编程的复杂性和调试难度。
|
||||
由于以上编程语言对字符数量的低估,它们不得不采取“代理对”的方式来表示超过 16 位长度的 Unicode 字符。这是一个不得已为之的无奈之举。一方面,包含代理对的字符串中,一个字符可能占用 2 字节或 4 字节,从而丧失了等长编码的优势。另一方面,处理代理对需要额外增加代码,这提高了编程的复杂性和调试难度。
|
||||
|
||||
出于以上原因,部分编程语言提出了一些不同的编码方案。
|
||||
|
||||
|
|
|
@ -8,17 +8,16 @@
|
|||
|
||||
如下图所示,逻辑结构可分为“线性”和“非线性”两大类。线性结构比较直观,指数据在逻辑关系上呈线性排列;非线性结构则相反,呈非线性排列。
|
||||
|
||||
- **线性数据结构**:数组、链表、栈、队列、哈希表。
|
||||
- **线性数据结构**:数组、链表、栈、队列、哈希表,元素之间是一对一的顺序关系。
|
||||
- **非线性数据结构**:树、堆、图、哈希表。
|
||||
|
||||
![线性数据结构与非线性数据结构](classification_of_data_structure.assets/classification_logic_structure.png)
|
||||
|
||||
非线性数据结构可以进一步划分为树形结构和网状结构。
|
||||
|
||||
- **线性结构**:数组、链表、队列、栈、哈希表,元素之间是一对一的顺序关系。
|
||||
- **树形结构**:树、堆、哈希表,元素之间是一对多的关系。
|
||||
- **网状结构**:图,元素之间是多对多的关系。
|
||||
|
||||
![线性数据结构与非线性数据结构](classification_of_data_structure.assets/classification_logic_structure.png)
|
||||
|
||||
## 物理结构:连续与分散
|
||||
|
||||
**当算法程序运行时,正在处理的数据主要存储在内存中**。下图展示了一个计算机内存条,其中每个黑色方块都包含一块内存空间。我们可以将内存想象成一个巨大的 Excel 表格,其中每个单元格都可以存储一定大小的数据。
|
||||
|
|
|
@ -75,7 +75,7 @@
|
|||
|
||||
## 基准数优化
|
||||
|
||||
**快速排序在某些输入下的时间效率可能降低**。举一个极端例子,假设输入数组是完全倒序的,由于我们选择最左端元素作为基准数,那么在哨兵划分完成后,基准数被交换至数组最右端,导致左子数组长度为 $n - 1$、右子数组长度为 $0$ 。如此递归下去,每轮哨兵划分后的右子数组长度都为 $0$ ,分治策略失效,快速排序退化为“冒泡排序”。
|
||||
**快速排序在某些输入下的时间效率可能降低**。举一个极端例子,假设输入数组是完全倒序的,由于我们选择最左端元素作为基准数,那么在哨兵划分完成后,基准数被交换至数组最右端,导致左子数组长度为 $n - 1$、右子数组长度为 $0$ 。如此递归下去,每轮哨兵划分后都有一个子数组的长度为 $0$ ,分治策略失效,快速排序退化为“冒泡排序”的近似形式。
|
||||
|
||||
为了尽量避免这种情况发生,**我们可以优化哨兵划分中的基准数的选取策略**。例如,我们可以随机选取一个元素作为基准数。然而,如果运气不佳,每次都选到不理想的基准数,效率仍然不尽如人意。
|
||||
|
||||
|
|
Loading…
Reference in a new issue