算法分析基础

算法分析基础

大O表示法(Big-O)

  • 一个算法所实施的操作数量或这步骤数可作为独立于具体程序/机器的度量指标
  • 赋值语句是一个合适的选择:一条赋值语句同时包含了(表达式)计算和(变量)储存两个基本资源;仔细观察程序设计语言特性,除了与计算资源无关的定义语句外,主要就是三种控制流语句和赋值语句,而控制流语句仅仅起了组织赋值语句的作用,并不实施处理。
#对于问题规模n,赋值语句数量T(n)=1+n
def sumOfn(n):
    theSum=0#做了一次赋值
    for i in range(1,n+1):
        theSum=theSum+i#做了n次赋值
    return theSum
  • 问题规模影响算法执行时间:在前n个自然数累计求和的算法中,需要累计的自然数个数适合作为问题规模的指标,而算法分析的目标是要找到问题规模会怎样影响一个算法的执行时间
  • 数量级函数(Order of Magnitude function):基本操作数量级函数T(n)的精确值不是特别重要,重要的是T(n)中起决定性因素的主导部分。用动态的眼光看,就是当问题规模增大时,T(n)中的一些部分会覆盖过其他部分的贡献,数量级函数描述了T(n)中随着n增加而增长速度最快的部分
    称作“大O”表示法,记作O(f(n)),其中f(n)表示T(n)中的主导部分
  • 有时决定运行时间不仅是规模问题,某些具体数据也会影响算法运行时间:一般来说,平均情况体现了算法的主流性能,因此对算法的分析主要看主流,而不是被特殊情况所迷惑

常见的大O数量级函数
image

“变位词”判断问题

  • 问题描述:所谓“变位词”是指两个词之间存在组成字母的重新排列关系
  • 解题目标:写一个bool函数,以两个词作为参数,返回真假,表示这两个词是否变位
  1. 解法一:逐字检查:将字符串1中的字符逐个到字符串2中检查是否存在,存在就“打勾”标记(防止重复检查),如果每个字符都能找到,则两个词是变位词,只要有一个找不到就不是
def anagramsolution(s1,s2):
    alist=list(s2)
    pos1=0
    stillOK=True
    while pos1 < len(s1) and stillOK:
        pos2=0
        found=False
        while pos1 < len(alist) and not found:
            if s1[pos1]=alist[pos2]:
                found=Ture
            else:
                pos2=pos2+1
        if found:
            alist[pos2]=None #打勾
        else:
            stillOK=False
        pos1=pos1+1
    return stillOK
  1. 解法二:排序比较:将两个字符串都按照相同字母顺序排好序,再逐个字符对比是否相同,如果相同则是变位词
def anagramsolution(s1,s2):
    alist1=list(s1)
    alist2=list(s2)
    
    alist1.sort()
    alist2.sort()
    pos=0
    matches=True
    while pos < len(s1) and matches:
        if alist1(pos) == alist2(pos)
    else:
        matches=False
    return matches
  1. 解法三:暴力法:穷尽所有可能的组合,即对字符串1中出现的字母进行全排列再查看字符二是否出现在全排列列表中
  • 有组合数学的结论,对n个字符全排列,其所有可能的字符串有n!个
  1. 解法四:计数比较:对比两个字符串中每个字母出现的个数,如果26个字母出现的次数都相同的话,则为变位词
def anagramsolution(s1,s2):
    c1 = [0]*26
    c2 = [0]*26
    for i in range(len(si))
        pos = ord(s1[i]) - ord('a')
        c1[pos] = c1[pos] + 1
    for i in range(len(si))
        pos = ord(s2[i]) - ord('a')
        c2[pos] = c2[pos] + 1
    j=0
    stillOK=True
    while j < 26 and stillOK:
        if c1[j] == c2[j]:
            j = j+1
        else:
            stillOK = False
        return stillOK

以上四种算法的算法分析

  • 解法一:主要部分在于两重循环,数量级为O(n^2)
  • 解法二:一个循环的数量级为O(n),丹sort函数的数量级为O(nlogn)
  • 解法三:O(n!)
  • 解法四:T(n)=2n+26,数量级为O(n),但是由于算法依赖长度为26的计数表,因此牺牲了储存空间,提高了空间复杂度

python数据结构的性能

  • python内置数据结构列表和字典在各种操作的大O数量级
    image
  • List基本操作的大O数量级
    image
  • Dictionary基本操作的大O数量级
  • image

使用timeit模块对函数计时

  • 对于每个具体函数的执行时间,timeit模块提供了一种在一致的运行环境下可以反复调用并计时的机制
  • timeit计时的使用方法:首先创立一个Timer对象,需要两个参数,第一个是需要反复运行的语句,第二个是为了建立运行环境而只需要运行一次的“安装语句”
    然后调用这个对象的timeit方法,其中可以指定反复运行多少次,计时完毕后可以返回以秒为单位的时间
from timeit import Timer
t=Timer("test()","from __main__ import test")
print "cincat %f seconds" % t.timeit(number=1000)#运行1000次
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,118评论 0 13
  • 讨厌算法的程序员系列入口 上一篇,我们知道了如何用循环不变式来证明算法的正确性,本篇来看另一个重要方面:算法分析。...
    袁承兴阅读 1,020评论 0 2
  • 转载自:www.cnblogs.com/absfree/p/5464779.html 姓名:梅金波 ...
    虐先森阅读 424评论 0 0
  • 冰冷的秋雨落过就更加亲近初冬。 秋日还留下多少日子? 有的人肆意挥霍, 有的人深情挽留。 留下的秋日总会过去, 挥...
    心是甜甜的阅读 283评论 0 1
  • 在去往终南山的路上天色渐亮,暮色渐沉他不知终南山的鸟儿们四季里只睡了这一夜——张小尹《终南山》 古巴比伦王朝在公元...
    Tracktree阅读 2,189评论 0 1