java - 如何在自定义 HashMap 实现中创建 O(1) 时间复杂度的查找方法和插入方法?

标签 java arrays hashmap

我正在自定义 HashMap 实现,但不使用 HashMap 数据结构作为分配的一部分,目前我可以选择使用两个一维数组或使用一个二维数组来存储我的键和值。我希望能够检查某个键是否存在并以 O(1) 时间复杂度(赋值要求)返回相应的值,但我假设它不使用 containsKey() 。

此外,当将键和值对插入到我的数组时,我很困惑,因为逻辑上它不应该是 O(1),因为偶尔会出现冲突并且我必须重新计算索引,所以为什么是插入的赋值要求 O(1)?

最佳答案

里面有很多问题,我来试试。

I want to be able to check if a key exists and return the corresponding value in O(1) time complexity (assignment requirement) but i am assuming it is without the use of containsKey().

这实际上没有什么区别。 O(1) 意味着执行时间与输入无关,并不意味着使用单个操作。如果您的 containsKey()put() 实现都是 O(1),那么您的解决方案仅使用它们一次。

Also, when inserting key and value pairs to my arrays, i am confused because it should not be O(1) logically, since there would occasionally be cases where there is collision and i have to recalculate the index, so why is the assignment requirement for insertion O(1)?

O(1) 是最好的情况,假设不存在哈希冲突。如果每个键生成相同的哈希码,最坏的情况是 O(n)。因此,当 HashMap 的查找或插入性能计算为 O(1) 时,就假设了完美的 hashCode 实现。

最后,说到数据结构,通常的做法是使用单个数组,其中数组项是链表节点。数组偏移量对应于 hashcode() % 数组大小(还有比这更多的高级公式,但这是一个很好的起点)。如果发生哈希冲突,您将必须导航链表节点,直到找到正确的条目。

关于java - 如何在自定义 HashMap 实现中创建 O(1) 时间复杂度的查找方法和插入方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60894440/

相关文章:

java.lang.ClassCastException : java. util.HashMap 无法转换为自定义数据类

java - 将 HashMap 用于节点和图数据结构

java - Clojure reify - 使用另一个宏自动实现 Java 接口(interface)?

java - Spring OAUTH - web e REST的不同登录

arrays - 从 gmatch 返回的列表在 Lua 中创建数组

javascript - 检查 JavaScript 数组中是否存在动态属性

c++ - 如何在 C++ 4.4.6 中包含 hash_map?

java - 从后台线程异常设置 TextView 上的文本

Java - spring控制台应用程序全局异常处理程序

java - 如何在Java中读取数组变量