java - 如何降低在两个列表中搜索算法的复杂度?

标签 java algorithm

我必须在两个列表中找到一些共同的项目。我无法排序它,顺序很重要。必须从 secondList 中找到多少个元素发生在 firstList .现在看起来像下面这样:

int[] firstList;
int[] secondList;
int iterator=0;
for(int i:firstList){
 while(i <= secondList[iterator]/* two conditions more */){
       iterator++;
       //some actions
   }
}

这个算法的复杂度是n x n。我试图降低此操作的复杂性,但我不知道如何以不同的方式比较元素?有什么建议吗?

编辑: 示例:A=5,4,3,2,3 B=1,2,3 我们寻找对 B[i],A[j] 健康)状况: 当

B[i] < A[j]
         j++ 

B[i] >= A[j]
         return B[i],A[j-1]

通过 A 列表到元素 j-1 的下一次迭代(平均 for(int z=0;z<j-1;z++) ) 我不确定,我说清楚了吗? 允许重复。

最佳答案

我的方法是 - 将第一个数组中的所有元素放入 HashSet 中,然后对第二个数组进行迭代。这将复杂度降低为两个数组的长度之和。它有占用额外内存的缺点,但除非你使用更多内存,否则我不认为你可以改进你的暴力解决方案。

编辑:避免对此事产生进一步的争议。如果您允许在第一个数组中有重复项,并且您实际上关心第二个数组中的元素与第一个数组中的元素匹配多少次,请使用 HashMultiSet

关于java - 如何降低在两个列表中搜索算法的复杂度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14335386/

相关文章:

java - 通过 JAX-RS 的 RESTful,@QueryParam 和@Consume 的常见用法是什么?

java - 我应该如何使用 servlet 和 Ajax?

java - 无法将invokeAndWait中的值分配给全局字符串变量

c++ - 面试 - 找到和已知的所有数组元素对

c# - 线程化对象中包含的方法 - C#

java - 使用分而治之的方法背后的推理

java - 在 Eclipse 中运行 java 程序时更改文件

java - Android studio, File.properties 重新打开应用后删除

algorithm - 用于查找数组最大值的 O(log n) 算法?

algorithm - 任何涉及图论的解决指南?