我试图在此处提供我的要求的简化版本以便于理解。
我有这个班级
public class MyClass {
private byte[] data1;
private byte[] data2;
private long hash1; // Hash value for data1
private long hash2; // Hash value for data2
// getter and setters }
现在我需要在这个类的2个List实例之间进行搜索,找到2个实例之间的hash1匹配数,并且对于所有匹配,找到相应的hash2匹配的数量。 2列表将包含大约1000万个MyClass对象。
现在我计划迭代第一个列表并在第二个列表中搜索。有没有办法可以通过任何特定方式排序或排序来优化搜索?我应该对两个列表进行排序还是只对1进行排序?
答案 0 :(得分:0)
排序第二,迭代第一次,二次搜索,排序O(nlogn)和二次搜索n项O(nlogn)
或者使用hashset作为第二个,首先迭代并在第二个中搜索,O(n)
答案 1 :(得分:0)
最好的解决方案是迭代没有比这更快的解决方案。您可以创建Hashmap并利用该地图不添加相同的密钥,但它有自己的创建重载
答案 2 :(得分:0)
如果你必须检查所有元素,我认为你应该迭代第一个列表并为第二个列表提供一个Hashmap作为AmitD。
您必须在equals
课程中正确覆盖hashcode
和MyClass
。最后,我建议您尽可能使用基本类型。例如,对于第一个列表,使用简单数组而不是列表将更好。
此外,在开始时,您可以选择两个列表中的哪一个是较短的列表(如果大小不同)并迭代该列表。
答案 3 :(得分:0)
我认为你应该为其中一个列表创建一个hashmap(比如list1
) -
Map<Long, MyClass> map = new HashMap<Long, MyClass>(list1.size());//specify the capacity
//populate map like - put(myClass.getHash1(), myClass) : for each element in the list
现在只需遍历第二个列表(排序两者都没有意义) -
int hash1MatchCount = 0;
int hash2MatchCount = 0;
for(MyClass myClass : list2) {
MyClass mc = map.get(myClass.getHash1());
if(mc != null) {
hash1MatchCount++;
if(myClass.getHash2() == mc.getHash2) {
hash2MatchCount++;
}
}
}
注意:假设hash1
是重复的,没有问题。