# 复杂度的概念

在早期的计算机中,控制功能要通过开关电路做成硬件,这就导致机器实际上只能解决一些特殊领域的专业计算问题,如果要完成其他类型的计算就要修改电路。于是冯诺依曼和莫奇利一起提出了一个全新的设计方案,即利用程序控制通用电子计算机。冯诺依曼客观上讲计算机分为了软硬件两部分,高德纳则奠定了计算机算法的基础。

要明确算法的好坏,就必须先明确算法的衡量标准以及测试方法,最早将算法严格量化的人还是高德纳,他的主要思想包括以下三个部分:

  1. 在比较算法快慢时,只需要考虑数据量特别大,大到近乎无穷的情况。
  2. 决定算法快慢的因素有很多,但是所有因素都可以分为不随数据量变化的因素和随着数据量会变化的因素。
  3. 两种算法的复杂度哪怕相差只有一点,但是随着计算量无限大后,可能效率就会千差万别。

基于这个思想,我们在讨论算法复杂度时,就只考虑N趋近于无穷时相关的部分。我们可以把一种算法的计算量或者占用空间的大小,写成一个函数f(N),这个函数的边界可以用数学上的大O概念来限制,如果两个函数f(N)和g(N),在趋近于无穷大时,比值只差一个人常数,那么他们就被看成同一数量级的函数,在这种算法被认为是具有相同的复杂度。