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