2014-03-04 106 views
-1

每当我想要使用像Java中的Set或Map这样的通用数据结构时,我都会看到HashSet和HashMap。在搜索关于这些的更多信息时,我已阅读了位于其基础的散列表。所以我了解到,为了将键映射到相应的值,它使用了散列函数。
我的问题是:为什么不使用简单的索引通信?
我试图回答自己,但我不知道的优点是正确的:
通过指数
+速度更快,因为没有计算涉及
+无碰撞
通过哈希
+内存经济,因为需要第三个数组来关联密钥和值HashMap中的键 - 值映射

但是我一直认为几个触发器比几个字节更珍贵。无论如何,我不认为Java中有像简单的IndexMap那样的DS,是吗?我在这里错过了什么?

编辑:
通过由折射率我的意思是这样的:一个数组是通过结构的有序结构,它具有索引;所以有两个数组相关,比如说keys []和values []意味着keys [i]对应于values [i]。所以,不需要关系功能。我肯定在这里错过了一些东西,我想看看是什么。

+2

密钥“ThisIsMyKey”的索引是什么?也没有“拖鞋”,因为这里没有浮点。您真的需要查看基本的数据结构。你的问题表明你错过了一些基本概念。 –

+0

你是什么意思,“按指数”?你在谈论列表...? – 2rs2ts

+0

也许一些链接到你在说什么。也许你比较哈希表树结构? –

回答

0

为什么不使用简单的按索引的对应关系?

因为这会破坏该特定实施的Set合同;在Set中,根据定义的标准,所有值必须是唯一的。在HashSet中,这是等于(如在.equals()/.hashCode())的对象。

此外,Set没有迭代顺序保证 - 再次,合同。因此,即使您知道它的.size()(与List不同,它看起来更像您想要的,您会注意到Set没有.get()方法),因此您无法使用索引来查找Set中的任何内容。

请注意,Map中的密钥也是Set; Map中的密钥是唯一的。

使用散列表的另一个优点是查找操作的速度(如.contains())。

+0

OP没有解释什么“by-index对应”意思是... –

+0

我对OP的要求是什么,为什么所有的Maps都不像'EnumMap'那样使用数组,因为它的象征性和不可变性枚举。 –

+0

嗯,有'IdentityHash {Set,Map}',但它们的用途是奇怪的 – fge

2

您可以将HashMap看作IndexMap,其索引可以是任何Object(键),并且它映射到另一个Object(value)。在你的意义上,IndexMap只是一个List,List将一个int索引映射到Object。但是List的索引不能是对象。

+3

这应该是一个评论,而不是一个答案。 –

+0

这是为什么?听起来像是对我的回答。 –

+0

我一直在想出一个更好的答案,但我认为这个解释击中了头部。 – Tyler

0

我要刺你想问什么。为什么Java HashMap不像EnumMap或其他特殊的散列表集合不需要散列(因为散列是预先计算的)。

它是因为HashMap是一个通用集合,因此您可以存储任何对象。如果你想要一个更快的HashMap(即快速哈希),那么需要对你存储在Map中的数据进行某些假设(如EnumMap)。

+0

我为什么要把钥匙放在第一个位置,在飞行前或飞行中为什么要被哈哈大笑?这是整个观点:我期望一种能够获得2个数组并通过索引关联元素的Map。键[]中的某种类型的任意对象以及值[] – mireazma

0

我在正确的方向,但需要考虑一些您可能想要在数据结构上执行的更多操作。 (1)与基于散列的数据结构相同,但是在阵列中搜索可能非常昂贵o(n),因为它在基于散列的结构中仍然是相同的o(1)。

在决定哪个数据结构对您的应用程序有好处时,它取决于您要在该数据结构上执行的操作。如需进一步参考,请检查该网页,其中包含不同的数据结构不同的操作总结:

http://simplenotions.wordpress.com/2009/05/13/java-standard-data-structures-big-o-notation/

希望它能帮助。

+0

中的某个其他类型的任意对象感谢您的链接。如果我理解正确,像contains()这样的搜索对于数组O(n)比对散列集合O(1)代价更高?这是正确的吗? – mireazma

+0

是的,你绝对正确:) – Mak