时间复杂度O(n)的理解

目录

  • 1. 时间复杂度
    • 1.1 例子
    • 1.2 概念的说明
    • 1.3 常用的时间复杂度按照耗费的时间从小到大排列
  • 2. 空间复杂度

1. 时间复杂度

1.1 例子

我们先来看一个简单的C++例子,来感受下时间复杂度的计算

#include 
using namespace std;

template <typename T>
// 查找成功返回该元素的index, 失败返回-1
int seq_search(const T seq[], int n, const T &value) {
    for(int i = 0; i < n; i++) {	// 1次	n+1次	n次
        if(seq[i] == value) {		// n次
            return i;				// 1次
        }
    }

    return -1;
}

int main() {
    int seq[10]={3,7,9,1,4,6,2,8,5,0};
    cout << seq_search(seq,10,6) << endl;       // 5
    cout << seq_search(seq,10,66) << endl;      // -1

    return 0;
}

seq_search函数的时间复杂度T(n) = O(f(n)) = O(1 + (n + 1) + n + n + 1) = O(3n + 3) = O(n)

1.2 概念的说明

  • 评估角度:一个算法通常有最理想情况、平均情况、最糟糕情况,我们一般只考虑最糟糕情况
  • f(n):一个算法运行的精确次数,如上面的例子,数据集合的大小为n, 则f(n) = 3n + 3
  • O(f(n)):精确次数===>渐进次数,因为我们通常考虑n趋于无穷大的情况,具体的规则如下:
    1. 当f(n)为常数时,如f(n) = 10,则O(f(n)) = O(10) = O(1)
    2. 当f(n)为多项式时,只取最高阶项,如f(n) = 2 n 2 + n + 3 2n^2 + n + 3 2n2+n+3,则O(f(n)) = O( 2 n 2 2n^2 2n2)
    3. 当f(n)有乘常数,则去除常数,如f(n) = 2 n 2 2n^2 2n2,则O(f(n)) = O( n 2 n^2 n2)
  • 什么是时间复杂度:一个算法运行所需要的时间,但不同的服务器所需的时间不同,通常采用一个算法运行的渐进次数来表示,即T(n),n是数据集合的大小,表示公式为T(n) = O(f(n))

1.3 常用的时间复杂度按照耗费的时间从小到大排列

O(1) < O(log n) < O(n) < O(n logn) < O( n 2 n^2 n2) < O( n 3 n^3 n3) < O( 2 n 2^n 2n) < O(n!)

其中 l o g k n log_kn logkn渐进为logn

2. 空间复杂度

在大多数应用场景,一个好的算法更看重时间复杂度,而空间复杂度只要合理即可

你可能感兴趣的:(数据结构和算法,数据结构)