代码之家  ›  专栏  ›  技术社区  ›  akbiggs

有效地将向量与爪哇中的一系列数字进行比较

  •  0
  • akbiggs  · 技术社区  · 15 年前

    我有一系列的数字,即6,5,7,8,9,1,通过一些数学过程,我最终将通过重复获得。出于这个原因,我想使用一个向量来存储这个过程产生的最后六个数字,然后将该向量的内容与上面的一系列数字进行比较。如果它与数列完全匹配,我将结束程序,或者如果不匹配,继续数学过程。

    我的问题是如何有效地比较数列和向量。最初,我将使用一个简单的if /条件条件来比较向量中的每个值与其序列中的对应值(例如,v是一个包含六个数的向量,如果((0)= 6和安培(1)= 5(=)…)),但是考虑到这将被评估若干个。在向量等于级数之前的几次,我开始怀疑,与其他方法相比,这是否是一个相对昂贵的计算。

    我的另一个想法是将一系列数字存储在第二个向量中,然后比较这两个向量。然而,一般来说,对于向量和Java缺乏经验,我不确定如何去做这件事,以及它如何比上面提到的简单IF和FER子句更高效。

    关于如何更有效地比较一组数字和向量内容,有什么建议吗?或者如果不是向量,那么可能是列表或数组?

    5 回复  |  直到 15 年前
        1
  •  4
  •   Zed    15 年前

    从数字序列中生成一个哈希值,例如(警告-此哈希函数仅用于演示目的):

    [n1,n2,n3,n4,n5]>n1异或n2异或n3异或n4异或n5。

    然后,首先只需要检查结果向量和原始向量的散列值,只有它们匹配时,才需要比较每个单独的数字。

        2
  •  3
  •   tangens    15 年前

    这里应该避免使用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);
    }
    

    比较列表的优点是在第一个元素不匹配之后停止比较,不必接触所有元素。比较列表很快!

        3
  •  1
  •   quamrana    15 年前

    我想,只要把一个向量和目标数字放在一起,然后用新生成的数字填充一个新向量,然后对它们进行迭代比较就不会太贵了。这可能是因为第一个数字的比较可能失败,所以只需要进行一次比较来检测失败。

    似乎你要收集你使用过的六个数字,所以比较整数不会太贵。

    不管你做什么,拜托 量度!

    您应该为比较任务生成至少两个算法并比较它们的性能。选最快的。

    然而,也许第一步是将数学过程的运行时间与比较任务进行比较。如果您的数学过程运行时是比较的100倍或更多,您只需选择一些简单的东西,不必担心。

        4
  •  1
  •   Thorbjørn Ravn Andersen    15 年前

    请注意,&运算符短路,即只有在左操作数本身不确定结果时才计算右操作数。因此,比较只会看那些必要的元素。

    不过,我不认为这会在任何情况下掩盖用于生成比较数字的数学计算所花费的时间。使用jvisualvm调查时间花在哪里。

        5
  •  0
  •   phsiao    15 年前

    如果只需要对照一组数字验证,那么直接比较这些数字更有效。计算散列需要执行一些运算,这比比较要昂贵。如果需要针对多组数字进行验证,则哈希解决方案将更有效。