使用字典优化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)算法,是否可以走得更远的主要内容,如果未能解决你的问题,请参考以下文章

IT之路如何走得更远

想在测试方向走得更远?想拿更高的工资?可以试试安全测试

干货:前端开发常见规范

脱离炒作,数字藏品才能走得更远

约束自己是为了走得更远(摘自青年文摘)

码链思想带领我们寻找本源,让我们走得更远