mirror of
https://github.com/krahets/hello-algo.git
synced 2024-12-24 09:26:28 +08:00
"Add Q&A sections to array/linked_list and tree chapters" (#682)
* "Add Q&A sections to array/linked_list and tree chapters" Added question and answers related to the use of std::list in C++ and space complexity in full binary tree traversal to their respective chapters in array_and_linked_list and tree documentation. * Update summary.md * Update summary.md * Update summary.md --------- Co-authored-by: Yudong Jin <krahets@163.com>
This commit is contained in:
parent
c310edb672
commit
4eb621dda7
2 changed files with 13 additions and 0 deletions
|
@ -56,3 +56,12 @@
|
|||
假如把列表元素换成链表节点 `n = [n1, n2, n3, n4, n5]` ,通常情况下这五个节点对象也是被分散存储在内存各处的。然而,给定一个列表索引,我们仍然可以在 $O(1)$ 时间内获取到节点内存地址,从而访问到对应的节点。这是因为数组中存储的是节点的引用,而非节点本身。
|
||||
|
||||
与许多语言不同的是,在 Python 中数字也被包装为对象,列表中存储的不是数字本身,而是对数字的引用。因此,我们会发现两个数组中的相同数字拥有同一个 id ,并且这些数字的内存地址是无需连续的。
|
||||
|
||||
!!! question "C++ STL 里面的 std::list 已经实现了双向链表,但好像一些算法的书上都不怎么直接用这个,是不是有什么局限性呢?"
|
||||
|
||||
一方面,我们往往更青睐使用数组实现算法,而只有在必要时才使用链表。这是因为:
|
||||
|
||||
1. 空间开销:由于每个元素需要两个额外的指针(一个用于前一个元素,一个用于后一个元素),所以 `std::list` 通常比 `std::vector` 更占用空间。
|
||||
2. 缓存不友好:由于数据不是连续存放的,`std::list` 对缓存的利用率较低。一般情况下,`std::vector` 的性能会更好。
|
||||
|
||||
另一方面,必要使用链表的情况主要是二叉树和图。栈和队列往往会使用编程语言提供的 `stack` 和 `queue` ,而非链表。
|
||||
|
|
|
@ -46,3 +46,7 @@
|
|||
- `equals()`:用来对比两个对象的值是否相等。
|
||||
|
||||
因此如果要对比值,我们通常会用 `equals()` 。然而,通过 `String a = "hi"; String b = "hi";` 初始化的字符串都存储在字符串常量池中,它们指向同一个对象,因此也可以用 `a == b` 来比较两个字符串的内容。
|
||||
|
||||
!!! question "广度优先遍历到最底层之前,队列中的节点数量是 $2^h$ 吗?"
|
||||
|
||||
是的,例如高度 $h = 2$ 的满二叉树,其节点总数 $n = 7$ ,则底层节点数量 $4 = 2^h = (n + 1) / 2$ 。
|
||||
|
|
Loading…
Reference in a new issue