diff --git a/codes/cpp/chapter_tree/avl_tree.cpp b/codes/cpp/chapter_tree/avl_tree.cpp index be5b40db0..46ab54b23 100644 --- a/codes/cpp/chapter_tree/avl_tree.cpp +++ b/codes/cpp/chapter_tree/avl_tree.cpp @@ -8,8 +8,6 @@ /* AVL 树 */ class AVLTree { - public: - TreeNode *root; // 根节点 private: /* 更新节点高度 */ void updateHeight(TreeNode *node) { @@ -134,6 +132,8 @@ class AVLTree { } public: + TreeNode *root; // 根节点 + /* 获取节点高度 */ int height(TreeNode *node) { // 空节点高度为 -1 ,叶节点高度为 0 diff --git a/codes/go/chapter_dynamic_programming/coin_change.go b/codes/go/chapter_dynamic_programming/coin_change.go index 55f6ee650..de2a7a5c1 100644 --- a/codes/go/chapter_dynamic_programming/coin_change.go +++ b/codes/go/chapter_dynamic_programming/coin_change.go @@ -48,7 +48,7 @@ func coinChangeDPComp(coins []int, amt int) int { } // 状态转移 for i := 1; i <= n; i++ { - // 倒序遍历 + // 正序遍历 for a := 1; a <= amt; a++ { if coins[i-1] > a { // 若超过目标金额,则不选硬币 i diff --git a/codes/go/chapter_dynamic_programming/coin_change_ii.go b/codes/go/chapter_dynamic_programming/coin_change_ii.go index 783cef257..72031d442 100644 --- a/codes/go/chapter_dynamic_programming/coin_change_ii.go +++ b/codes/go/chapter_dynamic_programming/coin_change_ii.go @@ -39,7 +39,7 @@ func coinChangeIIDPComp(coins []int, amt int) int { dp[0] = 1 // 状态转移 for i := 1; i <= n; i++ { - // 倒序遍历 + // 正序遍历 for a := 1; a <= amt; a++ { if coins[i-1] > a { // 若超过目标金额,则不选硬币 i diff --git a/docs/chapter_data_structure/summary.md b/docs/chapter_data_structure/summary.md index c7b590873..38425fa46 100644 --- a/docs/chapter_data_structure/summary.md +++ b/docs/chapter_data_structure/summary.md @@ -32,3 +32,35 @@ **Q**:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 `ArrayList` 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。 + +**Q**:原码转补码的方法是“先取反后加 1”,那么补码转原码应该是逆运算“先减 1 后取反”,而补码转原码也一样可以通过“先取反后加 1”得到,这是为什么呢? + +**A**:这是因为原码和补码的相互转换实际上是计算“补数”的过程。我们先给出补数的定义:假设 $a + b = c$ ,那么我们称 $a$ 是 $b$ 到 $c$ 的补数,反之也称 $b$ 是 $a$ 到 $c$ 的补数。 + +给定一个 $n = 4$ 位长度的二进制数 $0010$ ,如果将这个数字看作原码(不考虑符号位),那么它的补码需通过“先取反后加 1”得到: + +$$ +0010 \rightarrow 1101 \rightarrow 1110 +$$ + +我们会发现,原码和补码的和是 $0010 + 1110 = 10000$ ,也就是说,补码 $1110$ 是原码 $0010$ 到 $10000$ 的“补数”。**这意味着上述“先取反后加 1”实际上是计算到 $10000$ 的补数的过程**。 + +那么,补码 $1110$ 到 $10000$ 的“补数”是多少呢?我们依然可以用“先取反后加 1”得到它: + +$$ +1110 \rightarrow 0001 \rightarrow 0010 +$$ + +换句话说,原码和补码互为对方到 $10000$ 的“补数”,因此“原码转补码”和“补码转原码”可以用相同的操作(先取反后加 1 )实现。 + +当然,我们也可以用逆运算来求补码 $1110$ 的原码,即“先减 1 后取反”: + +$$ +1110 \rightarrow 1101 \rightarrow 0010 +$$ + +总结来看,“先取反后加 1”和“先减 1 后取反”这两种运算都是在计算到 $10000$ 的补数,它们是等价的。 + +本质上看,“取反”操作实际上是求到 $1111$ 的补数(因为恒有 `原码 + 反码 = 1111`);而在反码基础上再加 1 得到的补码,就是到 $10000$ 的补数。 + +上述 $n = 4$ 为例,其可推广至任意位数的二进制数。 diff --git a/zh-hant/docs/chapter_appendix/terminology.md b/zh-hant/docs/chapter_appendix/terminology.md index 8adb3bf45..08c2847ae 100644 --- a/zh-hant/docs/chapter_appendix/terminology.md +++ b/zh-hant/docs/chapter_appendix/terminology.md @@ -7,7 +7,7 @@

  資料結構與演算法的重要名詞

-| English | 简体中文 | 繁体中文 | +| English | 簡體中文 | 繁體中文 | | ------------------------------ | -------------- | -------------- | | algorithm | 算法 | 演算法 | | data structure | 数据结构 | 資料結構 | diff --git a/zh-hant/docs/chapter_preface/about_the_book.assets/hello_algo_mindmap.png b/zh-hant/docs/chapter_preface/about_the_book.assets/hello_algo_mindmap.png index f29eb8f8f..65df7b136 100644 Binary files a/zh-hant/docs/chapter_preface/about_the_book.assets/hello_algo_mindmap.png and b/zh-hant/docs/chapter_preface/about_the_book.assets/hello_algo_mindmap.png differ diff --git a/zh-hant/docs/index.html b/zh-hant/docs/index.html index 01c3b858a..c4d11adc5 100644 --- a/zh-hant/docs/index.html +++ b/zh-hant/docs/index.html @@ -74,7 +74,7 @@

@@ -140,11 +140,11 @@