【问题标题】:Is there a difference between an array of Linked Lists and a Hash table?链接列表数组和哈希表之间有区别吗?
【发布时间】:2015-01-09 21:00:34
【问题描述】:

我的问题几乎就是上面的内容。根据我看到的哈希表图表,例如:

Hashtable temp1 = new Hashtable(20);

SList[] temp2 = 新 SList[20];

假设 SList 是一个单链表,难道 temp1 和 temp2 几乎不一样吗?我只是想更好地理解哈希表。谢谢!

【问题讨论】:

  • 这两个是不同的。哈希表由某种称为键的对象索引,该对象具有定义良好的操作,称为hash。根据散列的值,对 (Key, Value) 存储在散列表中的适当位置。一般来说,散列函数对于几乎相同的对象应该有很大不同的值。哈希表使用列表来处理冲突 - 不同的键可以产生相同的哈希 - 如果是这样,它们将存储在此冲突解决模型中的同一位置(在相应的列表中)。哈希表可以在内部使用列表数组。
  • 我明白你的意思,但是假设你定义了一个单独的类 HashTableImplementation ,其构造函数是一个单链表数组。因为您使用的是单链表,所以已经处理了冲突,您可以按照自己喜欢的方式对同一键的值进行排序。如果你在 HashTableImplementation 中添加了一个哈希方法以及一个压缩函数方法,你就不能拥有与哈希表完全相同的东西吗?
  • 是的。但是您也可以使用另一种解决冲突的方法,它仍然是一个哈希表。内部使用的东西——无论是链表数组还是简单数组,都只是一个实现细节。
  • 啊,我明白了!谢谢两位的回答!那只是在碰撞处理中。

标签: arrays linked-list hashtable


【解决方案1】:

使用哈希表,您可以将值 V 插入到带有键 K 的表中。这个 K 可以是任何可以被哈希函数处理的东西。

然而,插入SList[] 必须使用整数索引,这远不如使用任何可散列对象的灵活性。

除此之外,还有几种方法可以处理哈希表中键的冲突。使用链式散列会产生类似于您前面提到的链表列表的东西,并具有通过可散列对象而不是整数进行索引的额外好处。

请参阅散列下的here,了解有关在散列表中处理散列冲突的其他方法的描述。

【讨论】:

  • 但是hashcode()函数返回的值不是整数吗?以便可以通过索引将其放入存储桶中,类似于 SLists 数组的方式?但我理解你所说的不同的碰撞处理场景,在这方面,哈希表确实优于 SLists 数组。
  • 没错,您可以使用通过哈希函数传递的整数索引来确定表中放置值的位置。在这种情况下,唯一的区别是哈希表的性能会比链表数组更差,因为执行哈希函数将比简单的基于数组索引的插入花费更长的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 2016-07-31
  • 2010-10-26
  • 1970-01-01
  • 2010-11-11
  • 2017-10-17
  • 2016-03-20
相关资源
最近更新 更多