程序员程序猿阵线联盟-汇总各类技术干货

算法分析基础

2018-02-07  本文已影响0人  持墨

算法分析基础

大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

常见的大O数量级函数 image

“变位词”判断问题

  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中出现的字母进行全排列再查看字符二是否出现在全排列列表中
  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

以上四种算法的算法分析

python数据结构的性能

使用timeit模块对函数计时

from timeit import Timer
t=Timer("test()","from __main__ import test")
print "cincat %f seconds" % t.timeit(number=1000)#运行1000次
上一篇 下一篇

猜你喜欢

热点阅读