我有一个执行以下操作的程序:
通过字符串迭代,将单词放入HashMap<String, Integer>
,其中键表示唯一单词,值表示运行的总出现次数(每次找到单词时递增)。
我相信到目前为止我们都是O(n)
,因为每次插入都是固定时间。
然后,我遍历hashmap并将值插入到新的HashMap<Integer, List<String>>
中。 String
进入计数匹配的值中的List
。我认为我们仍处于O(n)
因为HashMap
和List
上使用的操作是固定时间。
然后,我遍历HashMap
并在每个String
中打印List
。
此计划中的任何内容都会导致我超过O(n)
复杂度吗?
答案 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
并在任一端添加条目,则会出现这种情况。
我认为这涵盖了大多数开发人员的默认选择,因此它并不是一个障碍。