使用字典优化O(n ^ 2)算法,是否可以走得更远
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用字典优化O(n ^ 2)算法,是否可以走得更远相关的知识,希望对你有一定的参考价值。
有2套:
值的集合1(包含所有可能的值)第2组值(包含第1组中的一些可能值)
对于每场比赛,我们都会在集合1中指出找到了它。
O(n ^ 2)的排序方式是:
foreach(var set1Variable in set1)
foreach(var set2Variable in set2)
if(set1Variable == set2Variable )
set1.indexOf(set1Variable).Found = true;
可以用字典来优化。
第一个解决方案是“好”或“坏”的程度。那字典呢?我们应该考虑什么?对此进行分类的最佳方法是什么?为什么?
答案
- 建议的解决方案是
O(n^2)
时间,没有额外的空间。 - 字典解决方案(其中最小集合的所有元素都是放入字典中)可以是
O(n)
/O(nlogn)
(取决于哪个字典,基于树或哈希的时间和O(n)
空间。 - 您还可以通过排序获得
O(nlogn)
时间,无需额外的空间这两个容器,然后并行迭代以查找匹配项项目。
哪个更好?
取决于特定的需求和约束。如果您负担不起额外的空间,那么字典解决方案将变得不可行。如果O(nlogn)
时间太多,则应坚持使用散列法。
附录:解决方案3(排序)伪代码:
sort(set1)
sort(set2)
iter1 = set1.iterator()
iter2 = set2.iterator()
while iter1.has_next() and iter2.has_next():
if iter1.item() == iter2.item():
set2.add(iter1.item())
iter1.next()
iter2.next()
else if iter1.item() < iter2.item():
iter1.next()
else:
iter2.next()
另一答案
您可以创建一个TreeSet并将所有集合添加到其中。
TreeSet myTreeSet = new TreeSet();
myTreeSet.addAll(myHashSet);
System.out.println(myTreeSet);
假设您的集合的大小为n,空间复杂度为O(n),时间复杂度为O(nlogn)
以上是关于使用字典优化O(n ^ 2)算法,是否可以走得更远的主要内容,如果未能解决你的问题,请参考以下文章