diff --git a/chapter_array_and_linkedlist/linked_list.md b/chapter_array_and_linkedlist/linked_list.md index 461250e02..5059de250 100755 --- a/chapter_array_and_linkedlist/linked_list.md +++ b/chapter_array_and_linkedlist/linked_list.md @@ -102,6 +102,18 @@ comments: true int val; // 结点值 struct ListNode *next; // 指向下一结点的指针(引用) }; + + // typedef 作用是为一种数据类型定义一个新名字 + typedef struct ListNode ListNode; + + /* 构造函数,初始化一个新结点 */ + ListNode *newListNode(int val) { + ListNode *node, *next; + node = (ListNode *) malloc(sizeof(ListNode)); + node->val = val; + node->next = NULL; + return node; + } ``` === "C#" @@ -264,7 +276,18 @@ comments: true === "C" ```c title="linked_list.c" - + /* 初始化链表 1 -> 3 -> 2 -> 5 -> 4 */ + // 初始化各个结点 + ListNode* n0 = newListNode(1); + ListNode* n1 = newListNode(3); + ListNode* n2 = newListNode(2); + ListNode* n3 = newListNode(5); + ListNode* n4 = newListNode(4); + // 构建引用指向 + n0->next = n1; + n1->next = n2; + n2->next = n3; + n3->next = n4; ``` === "C#" diff --git a/chapter_hashing/hash_collision.md b/chapter_hashing/hash_collision.md index 64db37815..6756418fa 100644 --- a/chapter_hashing/hash_collision.md +++ b/chapter_hashing/hash_collision.md @@ -10,15 +10,15 @@ comments: true 为了缓解哈希冲突,一方面,**我们可以通过哈希表扩容来减小冲突概率**。极端情况下,当输入空间和输出空间大小相等时,哈希表就等价于数组了,每个 key 都对应唯一的数组索引,可谓“大力出奇迹”。 -另一方面,**考虑通过优化哈希表的来缓解哈希冲突**,常见的方法有「链式地址」和「开放寻址」。 +另一方面,**考虑通过优化哈希表的表示来缓解哈希冲突**,常见的方法有「链式地址」和「开放寻址」。 ## 6.2.1.   哈希表扩容 -「负载因子 Load Factor」定义为 **哈希表中元素数量除以桶数量(即数组大小)**,代表哈希冲突的严重程度。 +哈希函数的最后一步往往是对桶数量 $n$ 取余,以将哈希值映射到桶的索引范围,从而将 key 放入对应的桶中。当哈希表容量越大(即 $n$ 越大)时,多个 key 被分配到同一个桶中的概率就越低,冲突就越少。 -**负载因子常用作哈希表扩容的触发条件**。比如在 Java 中,当负载因子 $> 0.75$ 时则触发扩容,将 HashMap 大小扩充至原先的 $2$ 倍。 +因此,**在哈希表内的冲突整体比较严重时,编程语言一般通过扩容哈希表来缓解**。与数组扩容类似,哈希表扩容需要将所有键值对从原哈希表移动至新哈希表,**开销很大**。 -与数组扩容类似,**哈希表扩容操作的开销很大**,因为需要将所有键值对从原哈希表依次移动至新哈希表。 +编程语言一般使用「负载因子 Load Factor」来评估哈希冲突的严重程度,**其定义为哈希表中元素数量除以桶数量**,常用作哈希表扩容的触发条件。比如在 Java 中,当负载因子 $> 0.75$ 时,系统会将 HashMap 容量扩充至原先的 $2$ 倍。 ## 6.2.2.   链式地址