算法

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。

算法的五大特征

  1. 输入性:算法有零个或多个外部量作为算法的输入
  2. 输出性:算法至少偶遇一个量作为输出
  3. 确定性:算法中每条指令清晰,无歧义
  4. 有穷性:算法中每条指令的执行次数有限,执行每条指令时间也有限
  5. 可行性:算法原则上能够精确的运行,且用纸笔做有限次运算后即可完成

时间复杂度

时间复杂度,是一个用于度量一个算法的运算时间的一个描述,本质是一个函数,根据这个函数能在不用具体的测试数据来测试的情况下,粗略地估计算法的执行效率,换句话讲时间复杂度表示的只是代码执行时间随数据规模增长的变化趋势。

time模块

time模块计算两种算法的运行时间

  • 导入模块import time
  • 调用time.time()
  • 用程序执行 结束的时间-开始的时间

例:计算1~1000中,有多少个三个数,加起来等于1000,并且前两个数的平方和等于第三个数的平方?

  1. import time
  2. srat_time=time.time()
  3. for i in range(1,1001):
  4. for j in range(1,1001):
  5. for k in range(1,1001):
  6. if i + j + k == 1000 and i ** 2 + j ** 2 == k ** 2:
  7. print(i,j,k)
  8. end_time=time.time()
  9. print("所用的时间",end_time-srat_time)

计算结果为:
image.png

  1. import time
  2. start_time = time.time()
  3. for i in range(1,1001):
  4. for j in range(1,1001):
  5. k=1000-i-j
  6. if i ** 2 + j ** == k ** 2:
  7. print(i,j,k)
  8. end_time = time.time()
  9. print("所用时间:",end_time-start_time)

计算结果为:
image.png

计算时间复杂度

设:时间复杂度函数为f(n)

  • 算法一的时间复杂度为:

算法复杂度 - 图4

分析: 题目中1~n即是算法的规模,即n,三次for循环是nnn,if语句中执行1次,输出执行1次

  • 算法二的时间复杂度为:

算法复杂度 - 图5

分析: 两层for循环为n*n,赋值语句1次,if语句1次再加上输出语句1次

结论:

  • 算法的不同,所执行的时间不同,效率不同,即时间复杂度不同
  • 计算时,我们往往只计算相对重要的执行步骤,而忽略较小,较细节的执行步骤

大O渐进法

在计算时间复杂度中,我们并不需要精确的执行次数,只需要大概的执行次数,我们称为大O渐进法

大O渐进法的使用:

  • 我们通常用1来代替所有常数加法
  • 在修改后的运行次数函数中,只保留最高项
  • 如果最高项存在且不为1,则去除这个项的系数。

常见的复杂度关系

算法复杂度 - 图6

image.png

空间复杂度

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。

程序执行时所需存储空间包括以下两部分。

  1. 固定部分。

这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。

  1. 可变空间

这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。