我有一系列数字,即6,5,7,8,9,1,通过一些数学过程,我最终会通过重复获得。出于这个原因,我想使用一个向量来存储这个过程产生的最后六个数字,然后将该向量的内容与上面的一系列数字进行比较。如果它与一系列数字完全匹配,我将结束程序,或者如果不继续数学程序。
我的问题是我如何有效地比较一系列数字和向量。最初我打算使用一个简单的if / else条件来比较向量中的每个单独的值与系列中的对应值(例如,其中v是一个填充有六个数字的Vector,if(v.get(0)== 6& ;& v.get(1)== 5 ...)),但考虑到在向量等于系列之前将对其进行多次评估,我开始怀疑这是否是一个相对昂贵的计算与一些替代程序相比。
我这样做的另一个想法是将一系列数字存储在第二个向量中,然后比较两个向量。但是,由于缺乏对向量和Java的经验,我不确定如何做到这一点,以及它如何比上面提到的简单if和else子句更有效。
有关如何更有效地完成一堆数字和矢量内容之间的比较的任何建议?或者如果不是矢量,而不是列表或数组?
答案 0 :(得分:4)
从您的数字序列中创建哈希值,例如(警告 - 此哈希函数仅用于演示目的):
[N1,N2,N3,N4,N5] - > N1 xor N2 xor N3 xor N4 xor N5。
然后首先你只需要检查结果向量和原始向量的哈希值,只有当它们匹配时才需要比较每个单独的数字。
答案 1 :(得分:3)
你应该在这里避免使用Vector,因为它被实现为线程安全并且有一些开销。使用LinkedList代替插入和删除操作以及ArrayList的最大性能,以获得随机访问的最大性能。
void repeatedCompute() {
List<Integer> triggerList = new ArrayList<Integer>() {{
add(6);
add(5);
add(7);
add(8);
add(9);
add(1);
}};
List<Integer> intList = new LinkedList<Integer>();
boolean found = false;
while (!found) {
int nextResult = compute();
intList.add(0, nextResult);
if (intList.size() > triggerList.size()) {
intList.remove(intList.size() - 1);
}
if (intList.equals(triggerList)) {
found = true;
}
}
}
int compute() {
return new Random().nextInt(10);
}
比较列表的优点是在第一个元素不匹配后停止比较,您不必触摸所有元素。比较列表非常快!
答案 2 :(得分:1)
我猜想只需将一个向量与目标数字保持在一起,然后用新生成的数字填充一个新数据,然后迭代它们进行比较就不会太昂贵。可能是您可能在第一个数字上进行了比较失败,因此只需花费一个比较来检测失败。
您似乎必须收集您使用过的六种数字,所以只需比较整数就不会太贵。
无论你做什么,请衡量!
您应该为比较任务生成至少两种算法并比较它们的性能。选择最快。
但是,第一步可能是将数学过程的运行时间与比较任务进行比较。如果你的数学过程运行时间是比较的100倍或更多,你只需选择一些简单的东西,不用担心。
答案 3 :(得分:1)
请注意&amp;&amp;运算符短路,即仅在左操作数本身不确定结果时才评估右操作数。因此,比较只会考虑那些必要的元素。
但是,我不认为这会在任何情况下掩盖用于生成您比较的数字的数学计算所花费的时间。使用jvisualvm来调查花费的时间。答案 4 :(得分:0)
如果您只需要针对一组数字进行验证,那么直接比较这些数字会更有效。计算哈希需要你执行一些算术,这比比较更昂贵。如果您需要验证针对多组数字而不是哈希解决方案会更有效。