十分钟了解算法(0)——初始算法

版权声明:本文为博主原创,未经博主允许不得转载。 https://blog.csdn.net/weixin_36904568/article/details/88866112

一:算法的定义

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且毎条指令表示一个或多个操作。

二:算法的特性

  1. 输入(可以没有)
  2. 输出(至少一个)
  3. 有穷性
  4. 确定性
  5. 可行性

三:算法的要求

  1. 正确性:算法至少应该具有输入、输出和加工处理无歧义性、 能正确反映问题的需求、能够得到问题的正确答案。
  2. 可读性:便于阅读、理解和交流。
  3. 健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名
    其妙的结果。
  4. 时间效率髙和存储量低

四:算法的度量方法

  • 事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的髙低。
  • 事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算,通过算法时间复杂度来估算算法时间效率

五:运行时间

一个程序的运行时间,依赖于算法的好坏和问题的输入规模。

  • 确定输入模型,也就是算法执行的输入参数
  • 识别内循环,确定算法执行的循环次数
  • 根据内循环中的操作,确定成本模型,也就是内循环的操作次数
  • 对于给定的输人,计算操作的执行频率。

1:算法的时间复杂度(一般都是最坏时间复杂度)

定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T ( n)随n的变化情况,并确定T (n)的数量级。

记做:T (n) = O(f(n))

特点:一般情况下,随着n的増大,T(n)増长最慢的算法为最优算法。

推导:

  1. 计算最坏情况下的操作数。如果算法需要操作n次,每次需要进行m个操作,则算法的速度为O(n*m)
  2. 用常数1取代运行时间中的所有加法常数。
  3. 在修改后的运行次数函数中,只保留最高阶项。
  4. 如果最高阶项存在且不是1,则去掉与这个项相乘的常数。 在比较算法时,如果两种算法的大O运行时间不同,则大O里的常量无关紧要。

常见:

  • 常数阶 O(1):与问题的大小无关(n的多少),执行时间恒定(普通语句)
  • 对数阶 O(logn):循环体中的代码执行2n次(二分策略)
  • 线性阶 O(n):循环体中的代码执行常数次(单层循环)
  • 线性对数阶 O(nlogn):循环体中的代码执行nlogn次(分治)
  • 平方阶 O(n2):嵌套两层循环的代码(双层循环)
  • 立方阶 O(n3):嵌套三层循环的代码(三层循环)
  • 指数阶 O(2n):循环体中的代码需要执行2n次(枚举查找)
  • 阶层阶 O(n!):嵌套循环的代码需要执行n!次的算法。

比较:

O(1 )< O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n )<O(n!)< O(nn)

2:算法的空间复杂度

定义:算法的空间复杂度通过计算算法所需的存储空间实现。一般情况下,一个程序在机器上执行时,除了需要存储程序本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。

记做:S(n)= O(f(n))

猜你喜欢

转载自blog.csdn.net/weixin_36904568/article/details/88866112