【问题标题】:Why are linked lists almost always used with separate chaining?为什么链表几乎总是与单独的链接一起使用?
【发布时间】:2011-01-05 20:33:06
【问题描述】:

似乎每次我看到在哈希表中提到单独链接时,都会使用链表作为数据结构来存储有冲突的项目。为什么是这样?例如,为什么不能使用向量/数组数据结构?

【问题讨论】:

    标签: data-structures vector hashtable linked-list


    【解决方案1】:

    如果您有一个对象向量,那么复制对象可能会很昂贵,因此大多数通用哈希表使用链表,在删除或插入时不需要复制。然而,在大多数代码中,从哈希表中删除实际上是相当罕见的操作,并且插入应该很少见(你不想增长长链)所以每当我自己实现哈希时,我总是使用向量作为链,绝对没有问题。

    另一种解释是,链表是人们盲目获取的容器 - 请参阅我的博客 cmets here 了解更多关于此的意见。

    【讨论】:

    • 您能指出您具体谈论的是哪篇博客文章吗?我很想听听更多关于这方面的信息。
    【解决方案2】:

    您可以使用向量 / ArrayList 但是:

    • 您不需要 ArrayList 提供的链表所没有的任何功能,例如在 O(1) 时间内索引到列表。
    • ArrayList 的容量往往大于其当前长度,这会浪费内存。
    • ArrayList 需要偶尔增加容量,这很慢。

    【讨论】:

    • 扮演魔鬼倡导者:a) 您不需要插入列表的能力。 b) 在插入元素时需要更新指针,这很慢。 c) 由于指针的开销,链表总是比相同大小的数组列表大,这样会浪费内存。
    • b) 更新链表时只需要更新一两个指针。更新数组列表时,您必须更新指针和计数,因此这里没有真正的保存。 c) 这仅在数组列表中没有额外容量的情况下才成立,即使这样,对于具有一个元素的列表仍然不成立。
    • @MarkByers 你好,马克,我有一个问题。我们最好让负载因子为 1,但这样一来,哈希表中的每个 LinkedList 只能包含一个元素。我知道每个 LinkedList 的目的是解决冲突问题,但我不明白为什么在当前元素大小大于原始表大小时需要重新散列这样的表?为什么我们不能在每个 LinkedList 中存储更多元素?如果你能帮助我,谢谢!
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    相关资源
    最近更新 更多