最近,我在一本非常著名的书“算法简介”中阅读了有关散列表的信息。我还没有在任何实际的应用程序中使用它们,但是想要。但是我不知道如何开始。
谁能给我一些使用它的示例,例如,如何使用哈希表实现字典应用程序(例如ABBYY Lingvo)?
最后,我想知道PHP中的哈希表和关联数组之间的区别是什么,我的意思是应该使用哪种技术以及在哪种情况下?
如果我错了(请原谅),请纠正我,因为实际上我是从哈希表开始的,并且我对哈希表只有基本的(理论上的)知识。
非常感谢。
Answers:
在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关联数组进行排序)。
php数组基本上是哈希表
关联数组和哈希表之间的区别在于,关联数组是数据类型,而哈希表是数据实现。显然,关联数组类型在许多当前的编程语言中非常重要:Perl,Python,PHP等。哈希表是实现关联数组的主要方法,但不是唯一的方法。关联数组是哈希表的主要用途,但不是唯一的用途。因此,并不是它们是相同的,而是如果您已经具有关联数组,则通常不必担心它们之间的差异。
出于性能原因,了解自己喜欢的语言中的关联数组已实现为散列很重要。对实现的开销成本有所了解可能很重要。哈希表比线性数组要慢,并且使用的内存要比线性数组多,就像您在C中看到的那样。
Perl通过将关联数组称为“哈希”来将这两个概念混在一起。像Perl的许多功能一样,这不是很错误,但是它很草率。
PHP中的数组实际上是有序映射,而不是哈希表。map和hashtable之间的主要区别在于无法记住已添加的元素的顺序。另一方面,哈希表比映射快得多。从映射中获取元素的复杂度为O(nlogn),从哈希表中获取元素的复杂度为O(1)。