美文网首页
算法设计与分析——2.渐进分析与Python计算模型

算法设计与分析——2.渐进分析与Python计算模型

作者: 米妮爱分享 | 来源:发表于2020-12-22 16:36 被阅读0次

    2.1引言

    求解问题的算法往往并不唯一,为了量化不同算法的效率,需要通过渐近分析方法来计算算法的时间复杂度。前一章的例子可知,通过巧妙得设计可以缩短寻找到局部高点得时间,算法的时间复杂度可以从O(n)提高到O(logn).
    渐进分析简化算法时间复杂度的计算,在渐进分析下,并不需要精确计算算法的执行时间,而只需要计算时间函数在输入规模n增长时增长趋势。也就是说,算法执行的时间函数中,n的低次项和高次项前的常数项均可略去。n在变大时,n的高次项决定了函数的增长趋势。

    2.2 计算模式


    代码2.1

    def compare_num(i,j):
        k = 3
        if i>j:
            return i
        else:
            return k
    

    2.3 算法的渐进分析



    2.4 Python 计算模型

    学习的算法设计和分析所有的算法描述均采用 Python

    2.4.1 控制流语句

    条件语句


    代码2.2 条件语句的示例

    def num_verify(num):
        if num<0:
            num = 0
            print('非负数转换为 0!')
        elif num == 0:
            print('零)
        elif num ==1:
            print('等于1')
        else:
            print('大于1')
        return num
    

    循环语句

    代码2.3 循环语句示例

    def sum_nums(low,high):
        if high<low:
            print("error")
            return 
        sumnum = 0
        for i in range(low,high+1)
            sumnum += i
        return sumnum
    

    2.4.2 数据结构




    x**2 for x in range(10)

    代码 2.5 列表推导生成随机数组
    import random
    def generate_rand_array(num=10,maxnum=1000):
        arrary = [random.randint(1,maxnum) for in in range(num)]
        random.shuffle(array) # 随机打乱array 中的元素
        random.shuffle(array)
        return array
    

    在序列中循环时,索引位置和对应值可以使用enumerate()函数同时得到:
    for i,v in enumerate(['tic','tac','toe']):



    2.5 算法分析实例

    2.5.1 求最大值

    2.5.2 二分搜索

    代码 2.8 二分搜索

    def binary_search(A,K):
        first = 0
        last = len(A)-1
        found = False
        while first <= last:
            midpoint = (first + last)//2
            if k== A[midpoint]:
                found = True
            else:
                if k<A[midpoint]:
                    last = midpoint-1
                else:
                    first = midpoit+1
        return found 
    

    2.5.3 子集求和问题


    代码2.9 求子集和

    def subset_sum(lst,target):
        for i in range(2**len(lst)):
            pick  = list(mark(lst,bin(i)[2:]))  
            if sum(pick) == target:
                return pick
    def mark(lst,m):  # 产生由m(二进制数)决定的 lit的子集
        m = m.zfill(len(lst))  # 按照lst 的位数扩展m 和lst长度一致的数
        return map(lambda x:x[0],filter(lambda x: x[1] != '0',zip(lst,m))) #通过zip 组成一个元组数据(lst中的数,m中的数),过滤掉每个元组数组中m为0的数,剩下的取lst中的数 
    


    相关文章

      网友评论

          本文标题:算法设计与分析——2.渐进分析与Python计算模型

          本文链接:https://www.haomeiwen.com/subject/aetrnktx.html