时间复杂度分析(最好、最坏、均摊)

// 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.低级别和高级别复杂度出现有时许规律

发布了268 篇原创文章 · 获赞 59 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/qq_18683985/article/details/100825690
今日推荐