【问题标题】:How to improve the efficiency of the algorithm while using Iterator in java?在java中使用Iterator时如何提高算法的效率?
【发布时间】:2015-09-12 21:44:00
【问题描述】:

这是一个问题: 有N个男孩和N个女孩。只有一个男孩和一个女孩可以组成一个舞蹈对(即不允许同性舞蹈对)。成对的唯一其他条件是它们的绝对高度差应小于或等于 K。

找出可以组成的最大配对数,以便每个人都有一个独特的伙伴。

我想改进我的算法以减少时间.. 先看代码:

    //k is the maximum difference between pairs 
    int k = 5;
    ArrayList<Integer> ArrBoys = new ArrayList<>(Arrays.asList(new Integer[]{28, 16, 22}));
    ArrayList<Integer> ArrGirls = new ArrayList<>(Arrays.asList(new Integer[]{13, 10, 14}));

    //sorting all arrays
    Collections.sort(ArrBoys);
    Collections.sort(ArrGirls);

    System.out.println("After Sorting");

    //printing arrays after sorting
    for (Integer ArrBoy : ArrBoys) {
        System.out.print(ArrBoy + " ");
    }
    System.out.println("");
    for (Integer ArrGirl : ArrGirls) {
        System.out.print(ArrGirl + " ");
    }
    System.out.println("");

    //algorithm used to find the number of pairs
    int count = 0;
    for (Iterator<Integer> iteB = ArrBoys.iterator(); iteB.hasNext();) {
        Integer ArrBoy = iteB.next();
        for (Iterator<Integer> iteG = ArrGirls.iterator(); iteG.hasNext();) {
            {
                Integer ArrGirl = iteG.next();
                int dif = (int) Math.abs(ArrBoy - ArrGirl);
                if (dif <= k) {
                    System.out.println("we took " + ArrBoy + " from boys with "
                            + ArrGirl + " from girls, thier dif < " + k);
                    ArrBoys.remove(ArrBoy);
                    ArrGirls.remove(ArrGirl);
                    iteB = ArrBoys.iterator();
                    count++;
                    break;
                } else {
                    System.out.println("we try " + ArrBoy + " from boys with " + ArrGirl + " from grils but thier dif > " + (int) k);
                    //ArrGirls.remove(ArrGirl);                   
                }
            }

        }
    }
    System.out.println("the number of pairs we can take is "+count);

这段代码的输出是:

如您所见,该算法效率低下,因为我们不需要开始比较从第一个女孩到第二个男孩的身高,我们应该去寻找在我们配对的前一个女孩之后的女孩。

例如: 在身高 22 的男孩中,算法必须开始比较男孩的身高和身高 14 的女孩,因为我们已经对它们进行了排序,如果第一个男孩(更矮)不能和第一个女孩配对,那么肯定是第二个男孩(更长)也不能,如果我们与第一个女孩相比,我们会浪费时间。

我们可以通过两种选择来解决这个问题,或者通过在前一个男孩停止后让迭代器从女孩开始(我不知道如何使用迭代器),或者通过从数组列表中删除女孩一次,如果它不满足条件,让循环从第一个女孩开始(我试过这个,但它给了我一个例外)

如果可以的话,通过这两种方式解决...

【问题讨论】:

    标签: java arraylist iterator processing-efficiency


    【解决方案1】:

    您必须添加更多条件。在这里,有三个选项:

    • abs(dif)
    • dif > k : 连现在的男孩(最小的)都对她来说太高了,没有人可以和她跳舞,排除她
    • dif

    代码如下:

    int count = 0;
    int gLimit = 0;
    for (int b = 0; b<ArrBoys.size();b++) {
        if(gLimit == ArrGirls.size()) {
            System.out.println("no more girl for boy " + ArrBoys.get(b));
        }
        for (int g = gLimit; g<ArrGirls.size();g++) {
            {
    
                int dif = ArrBoys.get(b) - ArrGirls.get(g);
                if (Math.abs(dif) <= k) {
                    System.out.println("we took " + ArrBoys.get(b) + " from boys with "
                            + ArrGirls.get(g) + " from girls, thier dif < " + k);
                    gLimit++;
                    count++;
                    break;
                } else if (dif > k) {
                    System.out.println("we try " + ArrBoys.get(b) + " from boys with " + ArrGirls.get(g) + " from grils but thier dif > " + (int) k + ", girl too small, excluded");
                    gLimit++;
                } else if (dif < -k) {
                    System.out.println("we try " + ArrBoys.get(b) + " from boys with " + ArrGirls.get(g) + " from grils but thier dif > " + (int) k + ", boy too small, excluded");
                    break;
                }
            }
        }
    }
    

    我使用 get index 来提高列表内容的可操作性

    这是输出

    After Sorting
    16 22 28 
    10 13 14 
    we try 16 from boys with 10 from grils but thier dif > 5, girl too small, excluded
    we took 16 from boys with 13 from girls, thier dif < 5
    we try 22 from boys with 14 from grils but thier dif > 5, girl too small, excluded
    no more girl for boy 28
    the number of pairs we can take is 1
    

    【讨论】:

    • 感谢您的帮助,但我需要知道如何使用迭代器或删除方法解决此问题,您的代码非常好。
    猜你喜欢
    • 2011-06-08
    • 2020-04-21
    • 1970-01-01
    • 2019-03-29
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多