From 1113d03a8f4343f0d01c939bf6358e5bf6941237 Mon Sep 17 00:00:00 2001 From: krahets Date: Sat, 1 Jul 2023 22:37:26 +0800 Subject: [PATCH] Add new Q&As. --- docs/chapter_array_and_linkedlist/summary.md | 6 ++++++ docs/chapter_hashing/hash_map.md | 14 +++++--------- docs/chapter_tree/summary.md | 4 ++++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/docs/chapter_array_and_linkedlist/summary.md b/docs/chapter_array_and_linkedlist/summary.md index 46f2fc9fe..cb53d5ac0 100644 --- a/docs/chapter_array_and_linkedlist/summary.md +++ b/docs/chapter_array_and_linkedlist/summary.md @@ -69,3 +69,9 @@ !!! question "“列表的出现大大提升了数组的实用性,但副作用是会造成部分内存空间浪费”,这里的空间浪费是指额外增加的变量如容量、长度、扩容倍数所占的内存吗?" 这里的空间浪费主要有两方面含义:一方面,列表都会设定一个初始长度,我们不一定需要用这么多。另一方面,为了防止频繁扩容,扩容一般都会乘以一个系数,比如 $\times 1.5$ 。这样一来,也会出现很多空位,我们通常不能完全填满它们。 + +!!! question "在 Python 中初始化 `n = [1, 2, 3]` 后,这 3 个元素的地址是相连的,但是初始化 `m = [2, 1, 3]` 会发现它们每个元素的 id 并不是连续的,而是分别跟 `n` 中的相同。这些元素地址不连续,那么 `m` 还是数组吗?" + + 假如把列表元素换成链表节点 `n = [n1, n2, n3, n4, n5]` ,通常情况下这五个节点对象也是被分散存储在内存各处的。然而,给定一个列表索引,我们仍然可以在 $O(1)$ 时间内获取到节点内存地址,从而访问到对应的节点。这是因为数组中存储的是节点的引用,而非节点本身。 + + 与许多语言不同的是,在 Python 中数字也被包装为对象,列表中存储的不是数字本身,而是对数字的引用。因此,我们会发现两个数组中的相同数字拥有同一个 id ,并且这些数字的内存地址是无需连续的。 diff --git a/docs/chapter_hashing/hash_map.md b/docs/chapter_hashing/hash_map.md index dac61e020..8670f1ad3 100755 --- a/docs/chapter_hashing/hash_map.md +++ b/docs/chapter_hashing/hash_map.md @@ -516,18 +516,14 @@ index = hash(key) % capacity ```swift title="array_hash_map.swift" /* 键值对 */ - public class Pair: Equatable { - public var key: Int - public var val: String - - public init(key: Int, val: String) { + class Pair { + var key: Int + var val: String + + init(key: Int, val: String) { self.key = key self.val = val } - - public static func == (lhs: Pair, rhs: Pair) -> Bool { - lhs.key == rhs.key && lhs.val == rhs.val - } } [class]{ArrayHashMap}-[func]{} diff --git a/docs/chapter_tree/summary.md b/docs/chapter_tree/summary.md index 69492e56f..b6bc20f97 100644 --- a/docs/chapter_tree/summary.md +++ b/docs/chapter_tree/summary.md @@ -33,3 +33,7 @@ !!! question "在 C++ 中,函数被划分到 `private` 和 `public` 中,这方面有什么考量吗?为什么要将 `height()` 函数和 `updateHeight()` 函数分别放在 `public` 和 `private` 中呢?" 主要看方法的使用范围,如果方法只在类内部使用,那么就设计为 `private` 。例如,用户单独调用 `updateHeight()` 是没有意义的,它只是插入、删除操作中的一步。而 `height()` 是访问结点高度,类似于 `vector.size()` ,因此设置成 `public` 以便使用。 + +!!! question "请问如何从一组输入数据构建一个二叉搜索树?根节点的选择是不是很重要?" + + 是的,构建树的方法是 `build_tree()` ,已在源代码中给出。至于根节点的选择,我们通常会将输入数据排序,然后用中点元素作为根节点,再递归地构建左右子树。这样做可以最大程度保证树的平衡性。