From 9562287a2166a2a099b13491e42d549d87457e27 Mon Sep 17 00:00:00 2001 From: Sizhuo Long Date: Mon, 23 Oct 2023 07:54:25 +1100 Subject: [PATCH] Update Q&A of data_structure, array_and_linkedlist (#861) * "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 * "Expand details on HashTable, arrays, and linked lists in docs" Extended the section explaining how HashTables use both linear and nonlinear data structures. Added Q&A sections addressing common questions on character type size, the static and dynamic nature of array-based data structures, and distinguishing array and linked list from logic and physical perspective. These changes provide clearer understanding for readers. * "Add FAQs to array and linked list docs chapter" Added several Frequently Asked Questions to improve clarity in the arrays and linked list documentation chapter. These questions mainly address the behavior and structure of array initializations, circular array queues, and single-link list node deletion. Providing answers to these can enhance understanding and prevent misconceptions among readers. * Update summary.md * Update summary.md * Update summary.md --------- Co-authored-by: Yudong Jin --- docs/chapter_array_and_linkedlist/summary.md | 10 +++++++++- docs/chapter_data_structure/summary.md | 11 ++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/chapter_array_and_linkedlist/summary.md b/docs/chapter_array_and_linkedlist/summary.md index 1e8c436cc..b6ca3a67b 100644 --- a/docs/chapter_array_and_linkedlist/summary.md +++ b/docs/chapter_array_and_linkedlist/summary.md @@ -60,7 +60,7 @@ 与许多语言不同的是,在 Python 中数字也被包装为对象,列表中存储的不是数字本身,而是对数字的引用。因此,我们会发现两个数组中的相同数字拥有同一个 id ,并且这些数字的内存地址是无须连续的。 -!!! question "C++ STL 里面的 std::list 已经实现了双向链表,但好像一些算法的书上都不怎么直接用这个,是不是有什么局限性呢?" +!!! question "C++ STL 里面的 `std::list` 已经实现了双向链表,但好像一些算法的书上都不怎么直接用这个,是不是有什么局限性呢?" 一方面,我们往往更青睐使用数组实现算法,而只有在必要时才使用链表,主要有两个原因。 @@ -68,3 +68,11 @@ - 缓存不友好:由于数据不是连续存放的,`std::list` 对缓存的利用率较低。一般情况下,`std::vector` 的性能会更好。 另一方面,必要使用链表的情况主要是二叉树和图。栈和队列往往会使用编程语言提供的 `stack` 和 `queue` ,而非链表。 + +!!! question "初始化列表 `res = [0] * self.size()` 操作,会导致 `res` 的每个元素引用相同的地址吗?" + + 不会。但二维数组会有这个问题,例如初始化二维列表 `res = [[0] * self.size()]` ,则多次引用了同一个列表 `[0]` 。 + +!!! question "在删除节点中,需要断开该节点与其后继节点之间的引用指向吗?" + + 从数据结构与算法(做题)的角度看,不断开没有关系,只要保证程序的逻辑是正确的就行。从标准库的角度看,断开更加安全、逻辑更加清晰。如果不断开,假设被删除节点未被正常回收,那么它也会影响后继节点的内存回收。 diff --git a/docs/chapter_data_structure/summary.md b/docs/chapter_data_structure/summary.md index 332775e4b..3069b671f 100644 --- a/docs/chapter_data_structure/summary.md +++ b/docs/chapter_data_structure/summary.md @@ -17,8 +17,17 @@ !!! question "为什么哈希表同时包含线性数据结构和非线性数据结构?" - 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续哈希表章节会讲)。在拉链法中,数组中每个地址(桶)指向一个链表;当这个链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。因此,哈希表可能同时包含线性(数组、链表)和非线性(树)数据结构。 + 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续哈希表章节会讲):数组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 + 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或树。因此,哈希表可能同时包含线性(数组、链表)和非线性(树)数据结构。 !!! question "`char` 类型的长度是 1 byte 吗?" `char` 类型的长度由编程语言采用的编码方法决定。例如,Java、JS、TS、C# 都采用 UTF-16 编码(保存 Unicode 码点),因此 char 类型的长度为 2 bytes 。 + +!!! question "基于数组实现的数据结构也被称为“静态数据结构” 是否有歧义?因为栈也可以进行出栈和入栈等操作,这些操作都是“动态”的。" + + 栈确实可以实现动态的数据操作,但数据结构仍然是“静态”(长度不可变)的。尽管基于数组的数据结构可以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的更大的数组,并将老数组的内容复制到新数组中。 + +!!! question "在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢?" + + 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作是由类内部自动完成的。例如,Java 的 ArrayList 的初始容量通常为 10 。另外,扩容操作也是自动实现的。详见本书的“列表”章节。