// array: 数组. n: array长度. x: 需要查找的值
int searchPosition(int[] array, int n, int x) {
int pos = -1;
for (i = 0; i < n; ++i) {
if (array[i] == x) {
pos = i;
}
}
return pos;
}
最好、最坏情况时间复杂度
最好时间复杂度
根据上面的算法来说的话,如果我x的位置在
array[0]
.那么时间复杂度就是O(1).
最坏时间复杂度
如果x的位置在array[n - 1]或者不在array中.那么时间复杂度就位O(n).
平均情况时间复杂度
平均复杂度的话我们可以把平均值给加上去.这个需要考虑各种情况发生的概率.(PS.需要使用加权平均数)
我们假设,x在array中与x不在array中的概率都为1/2
T(n) = (1 / 2) / n + (2 / 2) / n + … + (n / 2) / n + 1 / 2 * n == > (3n + 1) / 4
即平均时间复杂度为O(n).
当代码在不同情况下复杂度出现了量级的差别,则用所有情况下的加权平均数表示
均摊时间复杂度
// array 表示一个长度为 n 的数组
// 代码中的 array.length 就等于 n
int[] array = new int[n];
int count = 0;
void insert(int val) {
if (count == array.length) {
int sum = 0;
for (int i = 0; i < array.length; ++i) {
sum = sum + array[i];
}
array[0] = sum;
count = 1;
}
array[count] = val;
++count;
}
当数组放不下的时候才遍历数组求和,清空数组后将sum放入index为0的位置.然后接下来插入新数据.如果放得下就直接插入数据.
最好的情况下: O(1)
最坏的情况下: O(n)
平均时间复杂度: O(1)
均摊时间复杂度分析:这个算法里头只有n的时候时间复杂度是O(n),前面的时间复杂度都是O(1).将n的情况均摊到前面所有的情况下的话,均摊的时间复杂度就是O(1).
1.代码在绝大数情况下是低级别复杂度,在极少情况下是高级别复杂度.2.低级别和高级别复杂度出现有时许规律