【问题标题】:Quantitatively Determining The Time Complexity Of A Sorting Algorithm定量确定排序算法的时间复杂度
【发布时间】:2022-12-03 15:50:16
【问题描述】:

在问这个问题之前,我想先介绍一下背景。虽然时间复杂度可以凭经验确定,但我试图通过使用变量来计算复杂度来定量确定它。从那里,算法中施加的实验数据的大小将充当 x 轴,算法中增加复杂性计数变量的迭代/条件的数量应反映笛卡尔平面的 y 轴。这将生成提供增长函数的最佳拟合曲线(回归分析)。有了这个增长函数,你就可以确定支配地位以获得你的 Big O。

我的问题是我应该在哪里添加变量来计算满足我的用例的复杂性。

在下面的示例中,complexityCount 正在计算复杂性。

选项一是这样计算:

@Override
public <T extends Comparable<T>> int sort(List<T> arr) {
    int complexityCount = 0;
    n = arr.size();
    T temp;

    // Sorting strings using bubble sort
    for (int i = 0; i < n - 1; i++) {
        complexityCount++;
        for (int j = 0; j < n - i - 1; j++) {
            complexityCount++;
            if (arr.get(j).compareTo(arr.get(j + 1)) > 0) {
                complexityCount++;
                temp = arr.get(j);
                arr.set(j, arr.get(j + 1));
                arr.set(j + 1, temp);
            }
        }
    }
    return complexityCount;
}

方案二是这样算的:

@Override
public <T extends Comparable<T>> int sort(List<T> arr) {
    int complexityCount = 0;
    n = arr.size();
    T temp;

    // Sorting strings using bubble sort
    for (int i = 0; i < n - 1; i++) {     
        for (int j = 0; j < n - i - 1; j++) {
            complexityCount++;
            if (arr.get(j).compareTo(arr.get(j + 1)) > 0) {
                temp = arr.get(j);
                arr.set(j, arr.get(j + 1));
                arr.set(j + 1, temp);
            }
        }
    }
    return complexityCount;
}

方案三是这样算的:

@Override
public <T extends Comparable<T>> int sort(List<T> arr) {
    int complexityCount = 0;
    n = arr.size();
    T temp;

    // Sorting strings using bubble sort
    for (int i = 0; i < n - 1; i++) {     
        for (int j = 0; j < n - i - 1; j++) {
            if (arr.get(j).compareTo(arr.get(j + 1)) > 0) {
                complexityCount++;
                temp = arr.get(j);
                arr.set(j, arr.get(j + 1));
                arr.set(j + 1, temp);
            }
        }
    }
    return complexityCount;
}

哪个选项最能说明时间复杂度,为什么?

【问题讨论】:

    标签: java big-o


    【解决方案1】:

    要确定时间复杂度,您应该在最内层循环中添加复杂度计数变量。这是因为最内层的循环是执行次数最多的循环,因此该循环内的计数变量将为您提供算法时间复杂度的最准确表示。

    在您的情况下,选项三是最佳选择,因为它在最内层循环中添加了复杂性计数变量。这将为您提供算法时间复杂度的最准确表示。

    值得注意的是,时间复杂度通常是使用理论分析来确定的,而不是使用变量来计算迭代次数和条件次数。这是因为时间复杂度衡量算法的运行时间如何随着输入大小的增长而增长,这可以通过分析算法本身来确定,而不是通过对其进行实验。但是,如果要使用变量来计算复杂度,最好将其添加到最内层循环中。

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 2012-09-16
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 2016-01-01
      • 1970-01-01
      相关资源
      最近更新 更多