地图与列表的搜索时间复杂度

问题描述 投票:0回答:2

您可能遇到过提到在某个地方在哈希图/字典/表中查找元素比在列表/数组中查找元素更快的地方。我的问题是为什么?

((到目前为止,我所做的推断:就我所知,为什么在两个数据结构中它都必须遍历直到达到所需元素的速度更快)

arrays list search hashmap time-complexity
2个回答
0
投票

以类推的理由。假设您想找一件特定的衬衫在早上穿。我认为这样做的话,您不必看字面上的每一件衣服。相反,您可能会做一些事情,例如检查梳妆台中的特定抽屉或壁橱的特定区域,然后仅查看那里。毕竟,您(我希望)不会在袜子抽屉里找到衬衫。

哈希表比列表更快地搜索,因为它们采用类似的策略-它们根据每个项目都有其应有的位置的原则来组织数据,然后仅在该位置查找即可搜索该项目。与此形成对比的是列表,其中的项目是根据它们的添加顺序来组织的,并且没有关于每个项目为何位置的特定模式。

更具体地说:实现哈希表的一种常见方法是使用称为链式哈希的策略。这个想法是这样的:我们维护一个buckets数组。然后,我们提出一个规则,为每个对象分配一个存储桶编号。当我们将某些东西添加到表中时,我们确定它应该去哪个存储桶号,然后跳转到该存储桶,然后将项目放在那里。要搜索一个项目,我们确定存储桶编号,然后跳到那里,仅查看该存储桶中的项目。假设我们用于分配项目的策略最终会在桶中或多或少地平均分配项目,这意味着我们在搜索时不必查看哈希表中的大多数项目,这就是为什么哈希表往往比列表要快得多。

有关此操作的更多详细信息,请查看these lecture slides on hash tables,其中填写了有关此操作的更多详细信息。

希望这会有所帮助!


0
投票

要了解这一点,您可以考虑元素如何存储在这些数据结构中。

HashMap / Dictionary如您所知,它是键值数据结构。要存储元素,首先要找到Hash值(该函数始终为键提供唯一的值。例如,可以通过执行模运算来创建简单的hash函数。)然后,您基本上将值放在此散列键上。

List中,基本上将元素追加到末尾。元素插入的顺序在此数据结构中很重要。分配给该数据结构的内存不连续。

Array中,您可以认为它类似于List。但是在这种情况下,分配的内存实际上是连续的。因此,如果您知道第一个索引的地址值,则可以找到第n个元素的地址。

现在考虑从这些数据结构中检索元素:

来自HashMap / Dictionary:在搜索元素时,要做的第一件事是找到键的哈希值。一旦有了它,就可以在地图上找到散列值并获取该值。在这种方法中,执行的动作量始终是恒定的。在渐近表示法中,这可以称为O(1)

来自列表:实际上,您需要遍历每个元素,并检查该元素是否为您要查找的元素。在最坏的情况下,您所需的元素可能会出现在列表的末尾。因此,执行的操作量各不相同,在最坏的情况下,您可能必须遍历整个列表。在渐近符号中,这可以称为O(n)。其中n是列表中元素的数量。

From array:要查找数组中的元素,您需要知道的是第一个元素的地址值。对于任何其他元素,您可以对第一个索引中该元素的相对关系进行数学计算。

例如,假设第一个元素的地址值为100。每个元素占用4个字节的内存。您要查找的元素位于第三位置。然后,您知道该元素的地址值为108。使用的数学是

Addresses of first element + (position of element -1 )* memory used for each element

即100 +(3-1)* 4 = 108。

在这种情况下,您也可以观察到,执行操作始终是恒定的,以找到元素。在渐近表示法中,这可以称为O(1)

现在进行比较,O(1)将始终快于O(n)。因此,从HashMap / Dictionary或数组中检索元素总是比List更快。

我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.