HashMap vs. ArrayList 插入性能混淆
HashMap vs. ArrayList insertion performance confusion
根据我的理解,hashmap 插入是 O(1),对于 arraylist,插入是 O(n),因为对于 hashmap,hashfunction 计算哈希码和索引并插入条目,数组列表每隔进入新元素的时间。
首先,复杂度为 O(1) 的操作并不总是比复杂度为 O(n) 的操作花费的时间更少。 O(1) 只意味着操作需要一个常数时间(可以是任何值),而不管输入的大小。 O(n) 意味着操作所需的时间随着输入的大小线性增加。这意味着仅当 n 为无穷大时,O(1) 理论上保证比 O(n) 花费更少的时间。
现在来看您的示例,ArrayList.add()
操作在分摊的常数时间内运行,这意味着尽管特定迭代可能需要 O(n) 时间,但随着时间的推移平均复杂度为 O (1).有关摊销常数时间的更多信息,请参阅 this 问题。
ArrayList
在 ArrayList
的最后添加项目时比 HashMap
快,因为不需要将 ArrayList
中的元素移动到在右边,如果你在 ArrayList
的前面添加一个项目,你可以看到 HashMap
的效率,就像这样 arrayList.add(0, str)
.
检查时使用 1000
作为外循环而不是 100000
否则它可能会挂起。
根据我的理解,hashmap 插入是 O(1),对于 arraylist,插入是 O(n),因为对于 hashmap,hashfunction 计算哈希码和索引并插入条目,数组列表每隔进入新元素的时间。
首先,复杂度为 O(1) 的操作并不总是比复杂度为 O(n) 的操作花费的时间更少。 O(1) 只意味着操作需要一个常数时间(可以是任何值),而不管输入的大小。 O(n) 意味着操作所需的时间随着输入的大小线性增加。这意味着仅当 n 为无穷大时,O(1) 理论上保证比 O(n) 花费更少的时间。
现在来看您的示例,ArrayList.add()
操作在分摊的常数时间内运行,这意味着尽管特定迭代可能需要 O(n) 时间,但随着时间的推移平均复杂度为 O (1).有关摊销常数时间的更多信息,请参阅 this 问题。
ArrayList
在 ArrayList
的最后添加项目时比 HashMap
快,因为不需要将 ArrayList
中的元素移动到在右边,如果你在 ArrayList
的前面添加一个项目,你可以看到 HashMap
的效率,就像这样 arrayList.add(0, str)
.
检查时使用 1000
作为外循环而不是 100000
否则它可能会挂起。