问题包括两个排序列表,没有重复的大小为n和m。第一个列表包含应从第二个列表中删除的字符串。
最简单的算法必须进行nxm
次操作(我认为这个术语是“二次时间”?)。
改进的解决方案是利用以下事实:在将来的比较中,两个列表都被排序并跳过索引低于上次删除索引的字符串。 我想知道那会是什么时间复杂度?
对于这个问题有没有更好的时间复杂度的解决方案?
答案 0 :(得分:6)
你应该研究Merge sort。这是为什么它有效运作的基本思想。
我们的想法是将两个列表一起扫描,这需要O(n+m)
次:
为第一个列表指定x
,为第二个列表指出A
和另一个指针y
,例如B
。设置x=0
和y=0
。在x < n
和y < m
时,如果A[x] < B[y]
,则将A[x]
添加到新的合并列表并增加x
。否则,将B[y]
添加到新列表并增加y
。点击x=n
或y=m
后,分别从B
或A
获取剩余的元素。
答案 1 :(得分:5)
我认为复杂性为O(n+m)
,因为每个列表中的每个项目都只会访问一次。
答案 2 :(得分:0)
计数/存储桶排序算法适用于第二个列表中的每个字符串都是存储桶的情况。
您浏览第二个列表(花费很多时间)并创建您的存储桶。然后,您将浏览第一个列表(需要n次)并增加出现次数。然后,您必须再次遍历每个桶(花费很多时间)并且只返回出现一次的字符串。 Trie或HashMap可以很好地存储存储桶。应该是O(n + m + m)。如果您使用HashSet,则在第二次传递中而不是递增计数器时,您将从Set中删除。它应该是O(n + m +(m-n))。
答案 3 :(得分:-1)
如果使用二进制搜索,可能是O(m + log(n))吗?