为了解决动态编程问题,我使用了两种方法来存储表项,一种使用多维数组ex:tb [m] [n] [p] [q]和其他使用hashmap并使用1st方法的索引来制作字符串用作" m,n,p,q"中的键。但是在一个输入上,第一个方法在2分钟内完成,而其他方法需要超过3分钟。 如果hashmap和array的访问时间渐近等于为什么性能差异如此之大?
答案 0 :(得分:0)
HashMap使用下面的数组,因此它永远不会比使用更快 数组正确。
你是对的,数组和HashMap的访问时间在O(1)中,但这只是说它与输入大小或集合的当前大小无关。但它并没有说明每项行动必须要做的实际工作。
要访问数组的条目,您必须计算条目的内存地址。这很容易array's memory address + (index * size of entity)
。
要访问HashMap的条目,首先必须散列给定的密钥(需要很多cpu循环),然后使用包含列表的哈希访问HashMap数组的条目(取决于实现) HashMap的详细信息),最后你必须在列表中线性搜索正确的条目(这些列表在大多数情况下都非常短,所以它被视为O(1))。
所以你看到它更像是O(10)的数组和O(5000)哈希映射。或者更准确的T(Array access)
表示数组,T(hashing) + T(Array access) + T(linear search)
表示HashMaps,T(X)
表示实际作用时间x
。