zoukankan      html  css  js  c++  java
  • 算法

    一、算法复杂度

    #什么是算法复杂度:
        算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源
    #一个算法的评价  (衡量代码的好坏)  
      1、时间复杂度  (运行时间)
      2、空间复杂度  (占用空间 )     

    1.1时间复杂度

    1、时间频度,
        一个算法执行所消耗的时间,从理论上是不能算出来的,必须上机测试才知道,但我们不可能对每个算法都上机测试,只需要知道哪个算法花费的时间多,哪个算法花费的时间少就可以了,并且一个算法花费的时间与算法语句中语句执行数成正比,哪个算法中语句执行次数多,它花费的时间就多,
    #一个算法中语句执行次数称为语句频度或时间频度,记为T(n)
    #算法的时间复杂度是指,执行算法所需要的计算工作量
    
    2、时间复杂度
        在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。
        一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),存在一个正常数c使得fn*c>=T(n)恒成立。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
        在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n^2+3n+4与T(n)=4n^2+2n+1它们的频度不同,但时间复杂度相同,都为O(n^2)。
    时间频度与时间复杂度的关系
    #时间复杂度的计算
    看看有几重for循环,只有一重则时间复杂度为O(n),二重则为O(n^2),依此类推,如果有二分则为O(logn),二分例如快速幂、二分查找,如果一个for循环套一个二分,那么时间复杂度则为O(nlogn)。
    
    
    #分类
    #按数量级递增排列,常见的时间复杂度有:
    常数阶O(1),对数阶O(  ),线性阶O(n),
    线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),...,
    k次方阶O(n^k),指数阶O(2^n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

    空间复杂度

    #与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。
    #记作:S(n)=O(f(n))
    #算法执行期间所需要的存储空间包括3个部分:
        算法程序所占的空间;
        输入的初始数据所占的存储空间;
        算法执行过程中所需要的额外空间。
    在许多实际问题中,为了减少算法所占的存储空间,通常采用压缩存储技术。

    列表排序

    冒泡排序

    #冒泡排序
        从开头开始,第一个与第二个比,大的放后边,再让第二个(上次比的大值)和第三个比,大的放后边,依次类推,最大的就在最后边,     
        然后在从开头开始,继续比较 #循环到len(l)-1-i
    li =[7,5,4,6,3,8,2,9,1]
    
    def bubble_sort(li):
        for i in range(len(li)-1):   #如果i=0,下面的循环到最后
            for j in range(len(li)-1-i):   #如果i=1,循环到倒数第三个
                if li[j]>li[j+1]:
                    li[j],li[j+1] = li[j+1],li[j]
    bubble_sort(li)
    print(li)
    
    
    
    #完整版(如果本来都是有序的,没必要再进行排序)
    li =[7,5,4,6,3,8,2,9,1]
    
    def bubble_sort(li):
        for i in range(len(li)-1):
            #flag=False
            for j in range(len(li)-1-i):
                if li[j]>li[j+1]:      #一直都是后边的大,不会走下面的代码,flag不会改变
                    li[j],li[j+1] = li[j+1],li[j]
                    #flag=True
            #if not flag:
                return
    bubble_sort(li)
    print(li)
    冒泡排序

    选择排序

    #选择排序
        一趟遍历最小的数,放到第一个位置,
        再一趟遍历剩余列表中的最小数,放到第二个位置
        以此类推
    
    li =[7,5,4,6,3,8,2,9,1]
    
    def select_sort(li):
        for i in range(len(li)-1):
            minLoc = i      #假设第i个是最小值
            for j in range(i+1,len(li)):        #i+1,和后边的值比
                if li[minLoc]>li[j]:          #如果假设的值不是最小,交换位置
                    li[minLoc],li[j] = li[j],li[minLoc]
    select_sort(li)
    print(li)

    插入排序

    #拿出一个值,以此和前边的值比,如果大于小于前边的值,前边的值把当前位置覆盖,再往前比,等到
    
    def insert_sort(li):
        for i in range(1, len(li)):
            tmp = li[i]
            j = i - 1
            while j >= 0 and li[j]>tmp:
                li[j+1]=li[j]
                j=j-1
            li[j+1]=tmp
  • 相关阅读:
    CSS浏览器兼容性问题集()两
    HTML5 Introduction
    poj 2449 Remmarguts' Date 【SPFA+Astar】【古典】
    LwIP学习笔记——STM32 ENC28J60移植与入门
    在四川大学的第二个冠军游戏在线编程:Peter的X
    ArcEngine下一个TIN生成的轮廓
    精彩理发头盔
    UBUNTU如何改变mysql默认文件夹数据文件夹
    第一章 词汇陷阱
    LINUX2.4.x网络安全框架
  • 原文地址:https://www.cnblogs.com/pdun/p/11115507.html
Copyright © 2011-2022 走看看