散列表VS关联数组

时间:2010-06-28 16:38:16

标签: php hashtable associative-array

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

5 个答案:

答案 0 :(得分:118)

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

但从技术上讲,关联数组与哈希表不同 - 它只是实现,部分是在后台使用哈希表。因为它的大多数实现都是哈希表,所以它可以做散列表所能做的所有事情 - 但它也可以做更多。

例如,您可以使用for循环遍历关联数组,而不能使用哈希表。

因此,虽然它们相似,但关联数组实际上可以执行散列表可以执行的超集 - 因此它们并不完全相同。将其视为哈希表和额外功能。

代码示例:

使用关联数组作为哈希表

$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关联数组则保持连接(你甚至可以对PHP关联数组进行排序)。

答案 1 :(得分:22)

php数组基本上是哈希表

答案 2 :(得分:16)

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

出于性能原因,知道您喜欢的语言中的关联数组是否实现为哈希值非常重要。了解该实现的开销成本非常重要。散列表比线性数组更慢,使用的内存更多,正如您在C中看到的那样。

Perl通过调用关联数组“哈希”将这两个概念结合在一起。就像Perl的许多功能一样,它并没有错,但它很草率。

答案 3 :(得分:9)

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

答案 4 :(得分:2)

关联数组是一个数组,您不能通过索引访问元素,而是通过键访问元素。内部如何工作是特定于实现的(没有规则它必须如何工作)。关联数组可以通过哈希表实现(大多数实现都会这样做),但它也可以通过某种树结构或跳过列表来实现,或者算法只是迭代数组中的所有元素并查找键匹配(这将非常缓慢,但它的工作原理)。

哈希表是一种如何存储数据的方法,其中值与键相关联,并且您打算在(通常几乎)恒定时间内找到键的值。这听起来与您对关联数组的期望完全一样,这就是为什么大多数时候哈希表用于实现这些数组的原因,但这不是强制性的。