data-structures - 哈希表与其他数据结构,如 AVLTrees
问题描述
我正在研究 Hash Table 和 AVLTree 的复杂性。理论上,在 Hash Tables 上插入和删除元素的复杂度是 O(1),对于 AVLTree O(log(n))(研究工作流的复杂性是数据结构上的元素数量),看到这个结果 Hash表似乎比 AVLTrees 更好,但如果我们考虑到结构本身的大小和计算给定键的散列函数所需的时间,难道 AVLTrees 不是更好吗?
解决方案
哈希表和 AVL 树具有根本不同的功能。简而言之,哈希表用于查找,而树结构用于搜索和遍历。
哈希表使您可以非常快速地检索与单个键关联的值。如果您使用键“xqj57”插入了一个值,那么您可以快速检索它。如果没有插入“xqj57”,查找将说不存在这样的记录。插入和查找都是 O(1) 操作。
AVL 树和类似结构非常适合按排序顺序存储事物。这使您可以按排序顺序遍历结构,还可以轻松地按顺序检索键以“A”开头的所有记录,或获取键大于或等于“foo”的第一条记录,等等。插入和搜索是 O(log n) 操作。当然,遍历是 O(n)。
如果要按排序顺序遍历哈希表,则必须先对其进行排序。
与树结构相比,哈希表确实有一点额外的内存开销,但没有那么多。
除非键特别长,或者您的散列函数非常复杂,否则计算键的散列值的成本与您必须执行的 log(n) 键比较的成本相比要便宜结构体。
如果您只想快速插入和查找,那么很难击败哈希表。如果您想使用排序列表,那么哈希表绝对不是要走的路。AVL 树、红黑树、跳过列表或其他此类排序结构将表现更好。
推荐阅读
- performance - LogRocket 中会话速率限制/节流的解决方法
- python - 我是否正确使用 CreateView 将用户对象传递给 ModelForm?
- image - Liferay:Ckeditor 工具栏图标在 TEST 和 PROD 环境中被 CSP 阻止
- java - 为什么我们不能在启动线程后调用 setDaemon(true)?
- reactjs - 如何从 TypeScript 中的字符串名称动态构建元素?
- ruby-on-rails - 如何按关联模型字段的平均值排序?
- .htaccess - 将 robots.txt 从 http 重定向到 https
- postgresql - 非交互式 postgres 命令在 Ubuntu 机器中挂起
- cookies - 在 Apollo GraphQL 游乐场(版本 3)中允许使用 Cookie
- c++ - 按住按钮时Arduino程序多次重新执行