从行组合

时间:2016-08-11 13:25:57

标签: java algorithm

我想检查数据的组合是否存在。下面的代码工作正常,但它看起来效率低下。我正在寻找这个问题的一个很好的解决方案。

=sumif(Src, 1, weight )

强文

4 个答案:

答案 0 :(得分:2)

看起来您只想检查组合是否是数据集的子集...它在数据集中的显示顺序并不重要。这是对的吗?

您的数据集有多大?数据集是在需要时创建还是在整个过程中维护?

如果数据集很大并且在整个过程中都得到维护,那么搜索是否可以保持排序是更容易的。

for (Integer comb : combination) {
    if (Arrays.binarySearch(dataset, comb) < 0) 
        return false; //If any element is not found, return false
    }
}
return true;

如果您可以对组合进行排序,则可以进一步优化组合。

int loc = 0;
for (Integer comb : combination) {
    loc = Arrays.binarySearch(dataset, loc, data.length, comb);
    //Since both are sorted, u can be sure that next element will be 
    //after previous element match
    if (loc < 0) 
        return false;
    }
}
return true;

即使你不能维护一个有序数组,你可以做的一个优化就是去掉那个布尔数组和底部的for循环。算法如下......

boolean isMatch = false;
for (Integer comb : combination) {
    //We will be here in two condition - 
    //  1. first iteration or previous element was found in dataset. 
    //  2. Just set to false to check next element. Reset the flag 
    boolean isMatch = false; 
    for (Integer data : dataset) {
        if (data.equals(comb)) {
            //match found for the current combination element
            isMatch = true;  
            break;
        }
    }
    //This mean one of the combination element is not there. Break out.
    if (!isMatch) break;  
}
return isMatch;

答案 1 :(得分:1)

对复杂度为nlog(n)的数据集进行排序。 (快速或合并排序可能?)然后对数据集上的组合数组的每个成员运行二进制搜索。二进制搜索复杂度日志(n)。当你为组合数组的每个成员执行此操作时,复杂性将是nlog(n)。

nlog(n)+ nlog(n)= 2nlog(n),即O(nlogn)。这样你的表现就会增加。

代码

public static boolean combinations(Integer dataset[], Integer combination[]) {

sort(dataset); // quick or insertion sort, nlogn


for (Integer comb : combination) { // n

    if (!binarysearch(dataset, comb)) //logn
       return false;
}  //n*logn = nlogn

return true;} //2nlogn = O(nlogn)

答案 2 :(得分:1)

您可以从数组更改为ArrayList并使用containsAll方法。不确定它是否足够有效但会缩短您的代码。

public static void main(String args[]) {
    Integer data[] = {1, 2, 5, 1, 9, 3, 5, 3, 2};
    Integer combination[] = {1,3 ,2};
    System.out.println("Result: " + combinations(data, combination));
}
public static boolean combinations(Integer dataset[], Integer combination[]) {
    List<Integer> data = Arrays.asList(dataset);
    List<Integer> comb = Arrays.asList(combination);
    return data.containsAll(comb);
}

答案 3 :(得分:0)

由于您的数据由实现“Comparable”的Integers组成,我建议您利用它并构造一个TreeSet并将所有数据添加到其中。然后,您可以运行contains()来查找TreeSet中是否存在元素。 TreeSet保证每次添加,删除和包含的log(n)成本。 添加所有元素(n)将花费你n log(n)。 找出'm'元素是否存在将花费你 log(n)。