From 504c6b0568a599beaf61fb1437dde2a964ff7302 Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Tue, 23 Jan 2024 22:08:53 +0800 Subject: [PATCH] The 4th revision (#1060) --- docs/chapter_data_structure/character_encoding.md | 2 +- .../classification_of_data_structure.md | 7 +++---- docs/chapter_sorting/quick_sort.md | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/chapter_data_structure/character_encoding.md b/docs/chapter_data_structure/character_encoding.md index 221ec47c5..e9381b8e0 100644 --- a/docs/chapter_data_structure/character_encoding.md +++ b/docs/chapter_data_structure/character_encoding.md @@ -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 字节,从而丧失了等长编码的优势。另一方面,处理代理对需要额外增加代码,这提高了编程的复杂性和调试难度。 出于以上原因,部分编程语言提出了一些不同的编码方案。 diff --git a/docs/chapter_data_structure/classification_of_data_structure.md b/docs/chapter_data_structure/classification_of_data_structure.md index 42bb7230f..75c5fd79f 100644 --- a/docs/chapter_data_structure/classification_of_data_structure.md +++ b/docs/chapter_data_structure/classification_of_data_structure.md @@ -8,17 +8,16 @@ 如下图所示,逻辑结构可分为“线性”和“非线性”两大类。线性结构比较直观,指数据在逻辑关系上呈线性排列;非线性结构则相反,呈非线性排列。 -- **线性数据结构**:数组、链表、栈、队列、哈希表。 +- **线性数据结构**:数组、链表、栈、队列、哈希表,元素之间是一对一的顺序关系。 - **非线性数据结构**:树、堆、图、哈希表。 -![线性数据结构与非线性数据结构](classification_of_data_structure.assets/classification_logic_structure.png) - 非线性数据结构可以进一步划分为树形结构和网状结构。 -- **线性结构**:数组、链表、队列、栈、哈希表,元素之间是一对一的顺序关系。 - **树形结构**:树、堆、哈希表,元素之间是一对多的关系。 - **网状结构**:图,元素之间是多对多的关系。 +![线性数据结构与非线性数据结构](classification_of_data_structure.assets/classification_logic_structure.png) + ## 物理结构:连续与分散 **当算法程序运行时,正在处理的数据主要存储在内存中**。下图展示了一个计算机内存条,其中每个黑色方块都包含一块内存空间。我们可以将内存想象成一个巨大的 Excel 表格,其中每个单元格都可以存储一定大小的数据。 diff --git a/docs/chapter_sorting/quick_sort.md b/docs/chapter_sorting/quick_sort.md index 878d34581..22be3fee0 100755 --- a/docs/chapter_sorting/quick_sort.md +++ b/docs/chapter_sorting/quick_sort.md @@ -75,7 +75,7 @@ ## 基准数优化 -**快速排序在某些输入下的时间效率可能降低**。举一个极端例子,假设输入数组是完全倒序的,由于我们选择最左端元素作为基准数,那么在哨兵划分完成后,基准数被交换至数组最右端,导致左子数组长度为 $n - 1$、右子数组长度为 $0$ 。如此递归下去,每轮哨兵划分后的右子数组长度都为 $0$ ,分治策略失效,快速排序退化为“冒泡排序”。 +**快速排序在某些输入下的时间效率可能降低**。举一个极端例子,假设输入数组是完全倒序的,由于我们选择最左端元素作为基准数,那么在哨兵划分完成后,基准数被交换至数组最右端,导致左子数组长度为 $n - 1$、右子数组长度为 $0$ 。如此递归下去,每轮哨兵划分后都有一个子数组的长度为 $0$ ,分治策略失效,快速排序退化为“冒泡排序”的近似形式。 为了尽量避免这种情况发生,**我们可以优化哨兵划分中的基准数的选取策略**。例如,我们可以随机选取一个元素作为基准数。然而,如果运气不佳,每次都选到不理想的基准数,效率仍然不尽如人意。