diff --git a/chapter_computational_complexity/space_complexity/index.html b/chapter_computational_complexity/space_complexity/index.html index f5d8442f0..29cc4d84b 100644 --- a/chapter_computational_complexity/space_complexity/index.html +++ b/chapter_computational_complexity/space_complexity/index.html @@ -5498,7 +5498,7 @@ O(1) < O(\log n) < O(n) < O(n^2) < O(2^n) \newline

5.   对数阶 \(O(\log n)\)

对数阶常见于分治算法。例如归并排序,输入长度为 \(n\) 的数组,每轮递归将数组从中点处划分为两半,形成高度为 \(\log n\) 的递归树,使用 \(O(\log n)\) 栈帧空间。

-

再例如将数字转化为字符串,输入一个正整数 \(n\) ,它的位数为 \(\log_{10} n + 1\) ,即对应字符串长度为 \(\log_{10} n + 1\) ,因此空间复杂度为 \(O(\log_{10} n + 1) = O(\log n)\)

+

再例如将数字转化为字符串,输入一个正整数 \(n\) ,它的位数为 \(\lfloor \log_{10} n \rfloor + 1\) ,即对应字符串长度为 \(\lfloor \log_{10} n \rfloor + 1\) ,因此空间复杂度为 \(O(\log_{10} n + 1) = O(\log n)\)

2.4.4   权衡时间与空间

理想情况下,我们希望算法的时间复杂度和空间复杂度都能达到最优。然而在实际情况中,同时优化时间复杂度和空间复杂度通常非常困难。

降低时间复杂度通常需要以提升空间复杂度为代价,反之亦然。我们将牺牲内存空间来提升算法运行速度的思路称为“以空间换时间”;反之,则称为“以时间换空间”。

diff --git a/chapter_data_structure/character_encoding/index.html b/chapter_data_structure/character_encoding/index.html index 978b3497d..f88c19813 100644 --- a/chapter_data_structure/character_encoding/index.html +++ b/chapter_data_structure/character_encoding/index.html @@ -3624,7 +3624,7 @@
  • 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 字节,从而丧失了等长编码的优势。另一方面,处理代理对需要额外增加代码,这提高了编程的复杂性和调试难度。

    出于以上原因,部分编程语言提出了一些不同的编码方案。