什么是算法分析

对比程序,还是算法?

❖如何对比两个程序?

  看起来不同,但解决同一个问题的程序,哪个“ 更好”?

❖程序和算法的区别

  算法是对问题解决的分步描述 程序则是采用某种编程语言实现的算法,同一个 算法通过不同的程序员采用不同的编程语言,能 产生很多程序

 大O表示法

 算法时间度量指标

 ❖ 一个算法所实施的操作数量或步骤数可作为 独立于具体程序/机器的度量指标 哪种操作跟算法的具体实现无关? 需要一种通用的基本操作来作为运行步骤的计量单位

❖ 赋值语句是一个合适的选择

一条赋值语句同时包含了(表达式)计算和(变量) 存储两个基本资源

仔细观察程序设计语言特性,除了与计算资源无关的 定义语句外,主要就是三种控制流语句和赋值语句, 而控制流仅仅起了组织语句的作用,并不实施处理。

❖分析SumOfN的赋值语句执行次数

对于“问题规模”n

赋值语句数量T(n)=1+n 那么,什么是问题规模?

学习笔记:[算法分析]数据结构与算法Python版

 

 

 ❖问题规模:影响算法执行时间的主要因素

❖在前n个整数累计求和的算法中,需要累 计的整数个数合适作为问题规模的指标 前100,000个整数求和对比前1,000个整数求和 ,算是同一问题的更大规模

❖算法分析的目标是要找出问题规模会怎么影响一个算法的执行时间

数量级函数 Order of Magnitude

❖基本操作数量函数T(n)的精确值并不是特 别重要,重要的是T(n)中起决定性因素的 主导部分

  用动态的眼光看,就是当问题规模增大的时候, T(n)中的一些部分会盖过其它部分的贡献

❖数量级函数描述了T(n)中随着n增加而增 加速度最快的主导部分

   称作“大O”表示法,记作O(f(n)),其中f(n) 表示T(n)中的主导部分

 

确定运行时间数量级大O的方法

❖例1:T(n)=1+n

当n增大时,常数1在最终结果中显得越来越无足 轻重 所以可以去掉1,保留n作为主要部分,运行时间 数量级就是O(n)

 

 影响算法运行时间的其它因素

❖有时决定运行时间的不仅是问题规模

❖某些具体数据也会影响算法运行时间

   分为最好、最差和平均情况,平均状况体现了算 法的主流性能 对算法的分析要看主流,而不被某几种特定的运行状况所迷惑

 

常见的大O数量级函数

❖通常当n较小时,难以确定其数量级

❖当n增长到较大时,容易看出其主要变化 量级

学习笔记:[算法分析]数据结构与算法Python版学习笔记:[算法分析]数据结构与算法Python版

 

 

 

从代码分析确定执行时间数量级函数

可以看到38--40这一段代码有3个赋值符号所以记作3

41-45行代码有双重循环并且有3个n 记作3n2

46-48行代码有单个循环2个赋值记作2n

49行最后一行代码又一个赋值符号记作1

最后得出结果:

学习笔记:[算法分析]数据结构与算法Python版

❖仅保留最高阶项n2 ,去掉所有系数

❖数量级为O(n2)

 

 学习笔记:[算法分析]数据结构与算法Python版

 

 

其它算法复杂度表示法

 

 ❖大O表示法 表示了所有上限中最小的那个上限。

❖大????表示法 表示了所有下限中最大的那个下限

学习笔记:[算法分析]数据结构与算法Python版

❖大????表示法 如果上下限相同,那么就可以用大????????表示

 学习笔记:[算法分析]数据结构与算法Python版

 

 

 

“变位词”判断问题

“变位词”判断问题

所谓“变位词”是指两个词之间存在组成字母的 重新排列关系 如:heart和earth,python和typhon 为了简单起见,假设参与判断的两个词仅由小写 字母构成,而且长度相等

❖解题目标:写一个bool函数,以两个词作 为参数,返回这两个词是否变位词

❖可以很好展示同一问题的不同数量级算法

解法1:逐字检查

❖解法思路 将词1中的字符逐个到词2中检查是否存在 存在就“打勾”标记(防止重复检查) 如果每个字符都能找到,则两个词是变位词 只要有1个字符找不到,就不是变位词

学习笔记:[算法分析]数据结构与算法Python版

 

❖程序技巧 实现“打勾”标记:将词2对应字符设为None 由于字符串是不可变类型,需要先复制到列表中

 

 学习笔记:[算法分析]数据结构与算法Python版

❖逐字检查法代码

#逐字检查法
def anagramSolution1(s1,s2):
    alist=list(s2)  #将s2内容转换成列表复制到alist中
    pos1=0;
    stillOK=True
    
    while pos1<len(s1) and stillOK: #循环s1中的每一个字符
        pos2=0
        found=False
        
        while pos2<len(alist) and not found:#循环alist中每一个字符
            if s1[pos1]==alist[pos2]:  #s1与s2的值进行对比 如果为真则判断整确跳出这个循环
                found=True
            else:
                pos2=pos2+1 #否则继续比较
                    
        if found:
            alist[pos2]=None   #找到打勾
        else:
            stillOK=False   #未找到、失败
        pos1=pos1+1
    return stillOK


print(anagramSolution1('python','ypthon'));
View Code

相关文章: