1)O(1):如果一个函数(或一组语句)不包含循环,递归和调用任何其他非常数时间函数,则将其视为O(1)的时间复杂度。
//非递归和非循环语句集
例如swap()函数具有O(1)时间复杂度。
通常,运行常数次数的循环或递归也被认为是O(1)。
例如,以下循环是O(1)。
// Here c is a constant for (int i = 1; i <= c; i++) { // some O(1) expressions }
2)O(n):时间如果循环变量递增/递减一个常数,则循环的复杂度被认为是O(n)。例如,以下函数具有O(n)时间复杂度。
// Here c is a positive integer constant for (int i = 1; i <= n; i += c) { // some O(1) expressions } for (int i = n; i > 0; i -= c) { // some O(1) expressions }
3)O(n c):嵌套循环的时间复杂度等于最内层语句的执行次数。
例如,以下样本循环具有O(n 2)时间复杂度
for (int i = 1; i <=n; i += c) { for (int j = 1; j <=n; j += c) { // some O(1) expressions } } for (int i = n; i > 0; i += c) { for (int j = i+1; j <=n; j += c) { // some O(1) expressions }
例如,选择排序和插入排序具有O(n 2)时间复杂性。
4)O(Logn)时间如果循环变量被分割 / 乘以恒定量,则将循环的复杂度视为O(log n)。
for (int i = 1; i <=n; i *= c) { // some O(1) expressions } for (int i = n; i > 0; i /= c) { // some O(1) expressions }
例如二进制搜索(参考迭代实现)具有O(log n)时间复杂度。
5)O(LogLogn)时间如果循环变量以指数规律减小/增加,则将循环的复杂度视为O(LogLogn)。
// Here c is a constant greater than 1 for (int i = 2; i <=n; i = pow(i, c)) { // some O(1) expressions } //Here fun is sqrt or cuberoot or any other constant root for (int i = n; i > 0; i = fun(i)) { // some O(1) expressions }
看到这个更多的解释。
如何组合连续循环的时间复杂度?
当有连续循环时,我们将时间复杂度计算为单个循环的时间复杂度之和。
for (int i = 1; i <=m; i += c) { // some O(1) expressions } for (int i = 1; i <=n; i += c) { // some O(1) expressions } Time complexity of above code is O(m) + O(n) which is O(m+n) If m == n, the time complexity becomes O(2n) which is O(n).
如何计算时间复杂度当在内层循环中有很多if,else语句?
如这里所讨论的,最糟糕的时间复杂度在最佳,平均和最差之间是最有用的。
所以我们需要考虑最坏的情况。我们评估if-else条件中的值会导致执行语句的最大数目的情况。
例如,考虑线性搜索函数,我们考虑到元素存在于结尾或完全不存在时的情况。
当代码太复杂而不能考虑所有的if-else情况时,我们可以通过忽略else和其他复杂的控制语句来获得上限。
如何计算递归函数的时间复杂度?
递归函数的时间复杂度可以写成数学递归关系。为了计算时间复杂度,我们必须知道如何解决循环。
我们不久将在单独的一篇文章中来讨论递归解决技术。