找出配对方法的时间复杂度

时间:2015-02-17 20:08:16

标签: java arrays algorithm time-complexity complexity-theory

我必须编写代码来获取具有奇数个元素的有序双数组,找到它们之间最短距离的值对,并返回剩余值,这被认为是“奇数”和#39 ;.以下是我编写的代码,它可以正常工作并返回正确的值。

有人可以帮我找一下我用过的算法的时间复杂度吗?我尝试过,但这确实令人困惑。

public static Double findPairs(Double[] data, int i, int j, int k, int count) {

    Double oddNumber = -1.;

    if ((k < data.length) && (diff(data[i], data[j]) <= diff(data[j], data[k]))) {
        data[i] = (-1.);
        data[j] = (-1.);
        if (k == data.length - 1) {
            for (int c = 0; c < data.length; c++) {
                if (data[c] != -1.) {
                    i = c;
                    break;
                }
            }
            if (i != k) {
                for (int c = 0; c < data.length; c++) {
                    if ((c > i) && (data[c] != -1.)) {
                        j = c;
                        break;
                    }
                }
                findPairs(data, i, j, k, count + 1);                    
            } 
        }
        else {
            for (int c = 0; c < data.length; c++) {
                if (data[c] != -1.) {
                    i = c;
                    break;
                }
            }    
            for (int c = 0; c < data.length; c++) {
                if ((c > i) && (data[c] != -1.)) {
                    j = c;
                    break;
                }
            }    
            for (int c = 0; c < data.length; c++) {
                if ((c > j) && (data[c] != -1.)) {
                    k = c;
                    break;
                }
            }
            findPairs(data, i, j, k, count + 1);
        }
    }
    else if ((k < data.length) && (diff(data[i], data[j]) > diff(data[j], data[k]))) {
        if (k == data.length - 1) {
            data[j] = (-1.);
            data[k] = (-1.);
        }
        else {
            i = j; j = k;
            for (int c = 0; c < data.length; c++) {
                if ((c > j) && (data[c] != -1.)) {
                    k = c;
                    break;
                }
            }
            findPairs(data, i, j, k, count);
        }
    }    
    for (int c = 0; c < data.length; c++) {
        if (data[c] != -1) {
            oddNumber = data[c];
        }
    }
    return oddNumber;
}

算法:从数组的第一,第二和第三个元素开始。比较第一个和第二个元素以及第二个和第三个元素之间的差异。如果第一个差异小于或等于后者,则将前两个元素设为(-1)。否则,对第二,第三和第四个元素执行相同的操作。继续这个过程。每当第一个差异小于第二个差异时,将相对元素设为(-1)并从数组的开头搜索不是(-1)的元素。从找到的前三个元素开始重复该过程。每当第二个差异小于第一个差异时,将三个中的第一个元素放在一边,然后检查接下来的三个元素。这样做直到你到达阵列的末尾。

1 个答案:

答案 0 :(得分:1)

你已经对算法进行了编写并编写了代码的方式,在最坏的情况下,你可以迭代越来越多的列表,因为算法从找到一对到下一个将被设置为-1。因此,最坏情况下的运行时间似乎是O(n ^ 2)。