Java 求配对法的时间复杂度

Java 求配对法的时间复杂度,java,arrays,algorithm,time-complexity,complexity-theory,Java,Arrays,Algorithm,Time Complexity,Complexity Theory,我必须编写代码,以获取具有奇数个元素的排序双数组,找到它们之间距离最短的值对,并返回剩余值,即“奇数”。下面是我编写的代码,它工作并返回正确的值 有人能帮我找到我使用的算法的时间复杂度吗?我试过了,但真的很困惑 public static Double findPairs(Double[] data, int i, int j, int k, int count) { Double oddNumber = -1.; if ((k < data.length) &

我必须编写代码,以获取具有奇数个元素的排序双数组,找到它们之间距离最短的值对,并返回剩余值,即“奇数”。下面是我编写的代码,它工作并返回正确的值

有人能帮我找到我使用的算法的时间复杂度吗?我试过了,但真的很困惑

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;
}
公共静态双findPairs(双[]数据,int i,int j,int k,int count){
双奇数=-1。;
if((ki)&(数据[c]!=-1.)){
j=c;
打破
}
}    
for(int c=0;cj)&(数据[c]!=-1.)){
k=c;
打破
}
}
findPairs(数据,i,j,k,计数+1);
}
}
如果((kdiff(data[j],data[k])){
if(k==data.length-1){
数据[j]=(-1.);
数据[k]=(-1.);
}
否则{
i=j;j=k;
for(int c=0;cj)&(数据[c]!=-1.)){
k=c;
打破
}
}
findPairs(数据、i、j、k、计数);
}
}    
for(int c=0;c

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

按照您对算法的措辞和编写代码的方式,在最坏的情况下,当算法从查找一对到下一对(将设置为-1)时,您可以迭代列表中越来越多的内容。因此,最坏情况下的运行时间似乎是O(n^2)。

(请确保不要将
Double
Double
混淆,因为这会显著改变算法的性能)您能提供一个输入数据和期望结果的示例吗?非常感谢。我在O(n^2)和O(n!)之间进退两难。有没有一种方法可以通过对代码稍加调整来降低这种复杂性?