【发布时间】: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;
}
哪个选项最能说明时间复杂度,为什么?
【问题讨论】: