我了解HashMap的工作原理- hm.put(obj)根据obj.hashCode值找到将对象放入的正确存储桶。然后在该存储桶中,如果另一个对象.equals(obj)则将其替换,如果未将其添加到存储桶中。
但是我不清楚HashMap.put和HashMap.get如何可以是恒定时间O(1)。据我了解,存储桶的数量应基于哈希码,因此将100个对象放入哈希图中将(大约)创建100个存储桶(我确实知道哈希码有时会发生冲突,因此它可能小于100,但不是经常)。
因此,随着添加到哈希图中的对象数量的增加,存储桶的数量也随之增加- 并且由于冲突很少发生,这并不意味着存储桶的数量几乎与添加的对象的数量呈线性增长,在这种情况下,就是HashMap。 put / HashMap.get将为O(n),因为它必须在找到正确的每个存储桶之前对其进行搜索。
我想念什么?
这是我的两分钱,朋友。像对待数组一样思考HashMap。实际上,它是一个数组。如果我给您索引11,则不必遍历数组即可在索引11处找到对象。您只需直接转到那里。这就是HashMap的工作方式:诀窍是使索引与值相同- 本质上。
这就是哈希码的来源。让我们看一下哈希函数为单位乘数(即1)的简单情况。然后,如果您具有0到99的值,并且想要将它们存储在数组中,那么它们将分别存储在索引0到99处。因此,放置和获取显然是O(1),因为将事物放入并放置在数组中是O(1)。现在,让我们想象一个不那么琐碎的哈希函数,例如y = x + 2。因此,在这种情况下,值0到99将存储在索引2到101处。在给定值11的情况下,您必须计算哈希以找到它或将其放入(哈希为11 + 2 = 13)。好的,哈希函数正在做一些工作来计算给定值的正确索引(在我们的情况下,y = x + 2 = 11 + 2 = 13)。但是,这项工作所花费的精力与您拥有多少个数据点无关。如果我需要输入999或123,
您可能会想一次输入n个值,这是您的困惑。那么在这种情况下,每个看跌期权仍保持不变c。但是c乘以n就是c*n= O(n)。因此,n与看跌期权本身无关,而是您一次制造n个看跌期权。我希望这种解释会有所帮助。
c
c*n