【问题标题】:Hash table chaining with avl tree带有avl树的哈希表链接
【发布时间】:2018-04-17 09:10:37
【问题描述】:

我正在散列字符串.. 然后我必须按字母顺序对第二个字符串进行排序。我必须能够在我的第二个字符串的排序树中删除、插入或获取位置数。因此,例如,我有基于动物类型(猫、狗..)的哈希表,每个桶都有 AVL 树,其名称按字母顺序排序。

插入(“猫”,“加菲猫”);插入(“猫”,“佐罗”);

garfield 和 zoro 将具有相同的哈希键,因为它们都是猫,但 garfield 将是 root 和 zoro 的右孩子.. 所以当我想删除 garfield 时,我必须再次对树进行排序..

我的问题是,如果哈希表 + avl 树是最快的选择?就像我说的,我需要能够根据类型(哈希键)加上索引来获取动物的名称。

编辑:这只是一个示例,所有内容都是可变的,并通过函数插入,因此片段数可以是 100 万个,名称也可以

【问题讨论】:

  • 这完全取决于您的使用模式。添加、删除和读取的相对频率是多少?
  • 物种是预先固定的(你知道它们会是猫、狗等)还是可变的?
  • 一切都是可变的
  • 就渐近运行时复杂度而言,您可以简单地删除哈希表部分并使用 AVL-Tree(在最坏的情况下,这两种情况都是 O(n * log n))。如果使用常见的使用模式进行基准测试,第一步可能会保护你一些周期,但是......
  • 是否有特殊原因必须按字母顺序对第二个字符串进行排序?是不是因为查询时必须按字母顺序返回列表?

标签: algorithm data-structures hash avl-tree


【解决方案1】:

一般来说,如果您的需求有很多遍历整个表,并且如果有很多删除或插入操作而不是 seach 操作,则首选 AVL 树。但是,如果您的需求相对需要大量的搜索操作(相对于插入或删除),那么哈希表是一个非常好的选择。..

如果您要进行散列,其中通过链接解决冲突,则数组用于保存键和指向树/链表的指针(这里是树)。在这种情况下,缺点是内存开销会很高,并且引用的局部性较低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2019-03-24
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多