krahets / hello-algo

《Hello 算法》:动画图解、一键运行的数据结构与算法教程。支持 Python, Java, C++, C, C#, JS, Go, Swift, Rust, Ruby, Kotlin, TS, Dart 代码。简体版和繁体版同步更新,English version ongoing
https://www.hello-algo.com
Other
95.04k stars 12.07k forks source link

/docs/chapter_hashing/hash_map.md 里的表 元素查询效率对比是不是写错了 #1461

Closed cmjzzx closed 1 month ago

cmjzzx commented 1 month ago
数组 链表 哈希表
查找元素 $O(n)$ $O(n)$ $O(1)$
添加元素 $O(1)$ $O(1)$ $O(1)$
删除元素 $O(n)$ $O(n)$ $O(1)$

数组的添加元素时间复杂度应该是 $O(n)$、链表的删除元素的时间复杂度应该是 $O(1)$ 才对?

Transmigration-zhou commented 1 month ago

应该是处于与哈希表对比的考虑出发,添加元素和删除元素的概念和数组 vs 链表中不太一样 文中也说明了这里添加元素和删除元素的含义。

添加元素:仅需将元素添加至数组(链表)的尾部即可 删除元素:需要先查询到元素,再从数组(链表)中删除

Transmigration-zhou commented 1 month ago

相对于哈希表 添加元素在数组中等价于把k-v键值对以pair/struct的方式存进去,添加到尾部即可。链表同。 删除元素在数组中等价于找到对应的k-v键值对删除,查找就用到 $O(n)$。链表同。

Transmigration-zhou commented 1 month ago

把问题改为 用数组/链表实现哈希表,添加/删除的复杂度是多少? 这样更容易理解。

cmjzzx commented 1 month ago

把问题改为 用数组/链表实现哈希表,添加/删除的复杂度是多少? 这样更容易理解。

确实,这样描述的话,就没问题了,感谢耐心解答🙏