zoukankan      html  css  js  c++  java
  • 【算法导论】第1、2章,算法入门

    【1】算法简介

    1.1 

    排序的重要问题:

    1、排序项数

    2、已经排序的程度、

    3、项值的可能限制

    4、计算机体系结构

    5、储存设备的种类

    1.2 

    衡量算法的主要标准:时间 & 空间

    【2】算法入门

    2.1 插入排序

    循环不变式:前i个总是排好顺序的。增量法

    插入排序python代码

    def insertSorted(xList):
        n = len(xList)
        for sortIdx in range(1, n):
            cache = xList[sortIdx]
            idx = sortIdx - 1
            while idx >= 0 and xList[idx] > cache:
                xList[idx+1] = xList[idx]
                idx -= 1
            xList[idx+1] = cache
        return xList
    
    if __name__ == '__main__':
        print insertSorted([1, ])
        print insertSorted([2, 1])
        print insertSorted([2, 2, 1])
        print insertSorted([2, 3, 4, 1])
        print insertSorted([1, 2, 4, 3])
        randomList = range(10)
        random.shuffle(randomList)
        print 'random:', randomList
        print insertSorted(randomList)
    

    2.2 算法简单分析

    在分析算法之前,要建立实现技术的模型:单处理器,随机存取机(RAM): 无法并行,不包含层次存储。

    算法的有效性:通常是时间

    常见的常数时间指令:算术指令(加减乘除、取余、向上下取整),数据移动指令(装入、储存、复制),控制指令(转移,子程序调用与返回),2^k

    插入排序的平均情况O(n^2), 

    2.3 另外的算法设计方法

    分治法:递归解决问题

    D(n)为分解问题需要的时间

    C(n)是子问题合成为原问题的时间

    对于本问题,每一层代价都是cn,总共有lg(n)层

    合并排序Python代码

    def merge(originList, start, mid, end):
        xList = originList[start:mid] + [np.inf]
        yList = originList[mid:end] + [np.inf]
        zList = []
        idxX, idxY = 0, 0
        for i in range(len(xList + yList) - 2):
            x, y = xList[idxX], yList[idxY]
            if x < y:
                zList.append(x)
                idxX += 1
            else:
                zList.append(y)
                idxY += 1
        originList[start:end] = zList
        return originList
    
    def mergeSort(xList, start=0, end=None):
        if end is None:
            end = len(xList)
        if start < end - 1:
            mid = int((start + end) / 2.)
            mergeSort(xList, start, mid)
            mergeSort(xList, mid, end)
            xList = merge(xList, start, mid, end)
        return xList
    
    
    if __name__ == '__main__':
        print mergeSort([1, ])
        print mergeSort([2, 1])
        print mergeSort([2, 2, 1])
        print mergeSort([2, 3, 4, 1])
        print mergeSort([1, 2, 4, 3])
        randomList = range(10)
        random.shuffle(randomList)
        print 'random:', randomList
        print mergeSort(randomList)
    

      

  • 相关阅读:
    sudo命令 sudoers文件
    sscanf函数
    printf格式化输出
    c文件操作
    string和char*
    c去除空格 小写转大写
    主机序和网络序转换
    ulimit用法
    mysql基础(附具体操作代码)
    ES6 class
  • 原文地址:https://www.cnblogs.com/yesuuu/p/7226253.html
Copyright © 2011-2022 走看看