【问题标题】:Finding the time complexity of pairing method寻找配对方法的时间复杂度
【发布时间】:2015-02-18 05:31:06
【问题描述】:

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

有人可以帮我找出我使用的算法的时间复杂度吗?我试过了,但真的很混乱。

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) 的元素。从找到的前三个元素开始重复该过程。每当第二个差异小于第一个时,将三个中的第一个元素放在一边,并与接下来的三个进行检查。这样做直到到达数组的末尾。

【问题讨论】:

  • (确保不要将Doubledouble 混淆,因为这会显着改变算法的性能
  • 您能否提供输入数据和期望结果的示例?

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


【解决方案1】:

按照您表述算法和编写代码的方式,在最坏的情况下,您可以迭代越来越多的列表,因为算法从找到一对到下一个将设置为 -1。所以看起来最坏情况下的运行时间是 O(n^2)。

【讨论】:

  • 非常感谢。我在 O(n^2) 和 O(n!) 之间进退两难。有没有办法只对代码稍作调整就可以降低这种复杂性?
猜你喜欢
  • 2015-11-17
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2021-07-23
  • 2020-03-05
相关资源
最近更新 更多