哈希表VS关联数组

最近我读了一本非常有名的书“ algorithm导论 ”中的哈希表 。 我还没有在任何实际应用中使用它们,但是想要。 但我不知道如何开始。
任何人都可以给我一些使用它的例子,例如,如何使用散列表实现字典应用程序(如ABBYY Lingvo)?
最后,我想知道什么是PHP中的哈希表和关联数组之间的区别,我的意思是我应该使用哪种技术,以及在哪种情况下?
如果我错了(请谅解),请纠正我,因为实际上我是从哈希表开始的,而且我只是对它们有基本的理论知识。
非常感谢。

在PHP中,关联数组被实现为哈希表,具有一些额外的function。

然而,从技术上来说,关联数组与哈希表不同 – 它只是部分用哈希表的后台实现。 因为它的大部分实现是一个哈希表,它可以做一切哈希表可以 – 但它也可以做更多。

例如,你可以使用for循环遍历一个关联数组,而你不能用一个hashtable来完成。

所以虽然他们是相似的,但是一个关联数组实际上可以做一个哈希表可以做的超集 – 所以他们不完全一样。 把它看作哈希表加上额外的function。

代码示例:

使用关联数组作为哈希表

$favoriteColor = array(); $favoriteColor['bob']='blue'; $favoriteColor['Peter']='red'; $favoriteColor['Sally']='pink'; echo 'bob likes: '.$favoriteColor['bob']."\n"; echo 'Sally likes: '.$favoriteColor['Sally']."\n"; //output: bob likes blue // Sally likes pink 

通过关联数组循环

 $idTable=array(); $idTable['Tyler']=1; $idTable['Bill']=20; $idTable['Marc']=4; //up until here, we're using the array as a hashtable. //now we loop through the array - you can't do this with a hashtable: foreach($idTable as $person=>$id) echo 'id: '.$id.' | person: '.$person."\n"; //output: id: 1 | person: Tyler // id: 20 | person: Bill // id: 4 | person: Marc 

特别要注意在第二个例子中,每个元素的顺序(Tyler,Bill Marc)根据它们进入数组的顺序来维护。 这是关联数组和哈希表之间的主要区别。 哈希表保持它所拥有的项目之间没有连接,而PHP关联数组(甚至可以sortingPHP关联数组)。

PHP数组基本上是哈希表

关联数组和哈希表的区别在于关联数组是数据types,而哈希表是数据实现。 显然,关联数组types在许多当前的编程语言中是非常重要的:Perl,Python,PHP等。哈希表是实现关联数组的主要方式,但不是唯一的方法。 关联数组是散列表的主要用途,但不是唯一的用途。 所以并不是说它们是相同的,但是如果你已经有了关联数组,那么你通常不应该担心这个差异。

出于性能方面的原因,知道您最喜欢的语言中的关联数组是以散列的forms实现是非常重要的。 对这个实现的开销成本有一些了解是很重要的。 散列表比较慢,并且使用比线性数组更多的内存,就像你在C中看到的一样。

Perl通过调用关联数组“哈希”将这两个概念结合在一起。 就像Perl的一些特性一样,它并不是很错误,但是很sl </s>。

PHP中的数组实际上是一个有序的映射,而不是哈希表。 map和hashtable的主要区别在于无法记住添加了哪些元素的顺序。 另一方面,哈希表比地图要快得多。 从映射中获取元素的复杂度是O(nlogn),而来自散列表的复杂度是O(1)。

一个关联数组是一个数组,你不能通过索引访问元素,而是通过一个键。 如何在内部工作是具体实现(没有规则如何工作)。 一个关联数组可以通过一个哈希表来实现(大多数实现都是这样做的),但是它也可以通过某种树结构或者跳过列表来实现,或者该algorithm只是迭代数组中的所有元素,然后查找关键字匹配(这将是非常缓慢,但它的作品)。

哈希表是一种如何存储数据的方法,这些数据的值与键相关联,以及您打算如何在(通常几乎)恒定的时间内find键的值。 这听起来就像你期望的关联数组,这就是为什么大多数时候哈希表用于实现这些数组,但这不是强制性的。