通过迭代和打印插入2个哈希表的运行时间

时间:2013-10-28 02:20:46

标签: java algorithm data-structures big-o time-complexity

我有一个执行以下操作的程序:

通过字符串迭代,将单词放入HashMap<String, Integer>,其中键表示唯一单词,值表示运行的总出现次数(每次找到单词时递增)。

我相信到目前为止我们都是O(n),因为每次插入都是固定时间。

然后,我遍历hashmap并将值插入到新的HashMap<Integer, List<String>>中。 String进入计数匹配的值中的List。我认为我们仍处于O(n)因为HashMapList上使用的操作是固定时间。

然后,我遍历HashMap并在每个String中打印List

此计划中的任何内容都会导致我超过O(n)复杂度吗?

3 个答案:

答案 0 :(得分:1)

那是O(n),除非你的单词解析算法不是线性的(但它应该是)。

答案 1 :(得分:1)

你是对的,但需要注意。在哈希表中,插入和查找每个都需要预期的 O(1)时间,因此算法的期望运行时为O(n)。如果你有一个糟糕的哈希函数,那么它可能需要更长的时间,通常(对于大多数合理的哈希表实现)O(n 2 )在最坏的情况下。

此外,正如@Paul Draper所指出的,这假设每个字符串的哈希码的计算花费时间O(1)并且比较表中的字符串需要时间O(1)。如果您的字符串的长度不是从上面以某个常量为界,则计算哈希码可能需要更长的时间。实际上,更准确的分析是运行时为O(n + L),其中L是所有字符串的总长度。

希望这有帮助!

答案 2 :(得分:0)

除了Paul Draper和templatetypedef指出的两个问题之外,还有另外一个问题。你写的第二张地图是hashmap < int,list < string > >。仅当您为列表选择的实现允许(摊销的)恒定时间附加时,这才允许总线性复杂度。如果您使用ArrayList并在最后添加条目,或者选择LinkedList并在任一端添加条目,则会出现这种情况。

我认为这涵盖了大多数开发人员的默认选择,因此它并不是一个障碍。