我一直想知道为什么会这样。
例如,假设我想找到一个数字数组中的数字5。我必须将我想要的数字与其他每一个值进行比较,以找到我正在寻找的东西。 这显然是O(N)。
但是,比如说,我有一个我知道的索引包含我想要的项目。我可以直接向右跳吗?对于经过哈希处理的地图也是这种情况,因为当我提供查找的键时,在确定它的索引位置的键上运行相同的哈希函数,所以这也允许我这样,直接跳到它的正确索引。
但我的问题是,为什么通过直接比较找到数组中的值的O(N)查找时间有何不同?
就一台天真的计算机而言,索引不应该与查找值相同吗?当我遍历结构时,我不应该继续原始操作,我必须将当前的指数值与我所知道的那个值进行比较吗?
为什么像二元搜索这样的东西可以实现O(logN)很有意义,但我仍然无法直观地理解为什么某些东西可以是O(1)。
我的想法中缺少什么?
答案 0 :(得分:2)
数组通常存储为一大块内存。
如果您要查找索引,则可以计算该索引在O(1)中的此内存块中的偏移量。
假设数组从内存地址124开始,每个元素大10个字节,那么你就可以知道第5个元素位于地址124 + 10*5 = 174
。
二进制搜索实际上(通常)会做类似的事情(因为按索引查找只是数组的O(1)) - 你从中间开始 - 你做一个按索引查找来获取该元素。然后你看看1/4或3/4位置的元素,你需要再次进行索引查找。
答案 1 :(得分:0)
HashMap
下面有array
。将键/值对添加到地图时。对键hashCode()
进行评估和规范化,以便将其值放在数组中的特殊索引中。当两个密钥的代码被规范化为属于地图的相同索引时,它们会附加到LinkedList
当您执行查找时,您正在查找的密钥已对其进行hash code()
评估和规范化,以返回索引以搜索密钥。然后它遍历您找到密钥的链表并返回相关值。
在最佳情况下,查找时间与查找array[i]
O(1)
加速的原因是因为你实际上不必遍历你的结构来查找某些东西,你只需要跳到你预期的地方。