• 20200407 算法与数据结构


    算法与数据结构

    1. 算法

    衡量一个算法好坏的指标

    时间复杂度 O

    衡量一个算法执行效率快慢的指标

    • 问:有两个程序,哪个程序执行的效率更快?怎么比较?
      答:使用time模块来进行比较。
    • 问:使用time模块比较的前提是啥?
      答:两个程序运行的硬件环境都要一样

    因此,使用time模块来进行比较,就不太合适了。所以,我们使用程序执行的大概次数来表示时间复杂度,使用O()记

    如何一眼判断时间复杂度?

    • 循环减半的过程O(logn)
    • 几次循环就是n的几次方的复杂度

    空间复杂度

    当前程序运行的时候, 是否需要向操作系统额外的申请内存空间

    现阶段,由于内存非常的便宜。所以写程序的时候,也不是特别的要考虑是否节省内存。微博,内存最大 196G

    算法

    冒泡排序

    #### 最坏时间复杂度是:O(n^2)  最优的时间复杂度是:O(n)
    def bubble_sort(li):
        for i in range(len(li)-1):
            flag = True
            for j in range(len(li) - i - 1):
                if li[j] > li[j+1]:
                    li[j], li[j+1] = li[j+1], li[j]
                    flag = False
            if flag:
                return
    

    选择排序

    #### 时间复杂度:O(n^2)
    def select_sort(li):
        for i in range(len(li)):
            minLoc = i
            for j in range(i+1, len(li)):
                if li[j] < li[minLoc]:
                    li[j], li[minLoc] = li[minLoc], li[j]
    

    插入排序

    ###  时间复杂度:O(n^2)
    def insert_sort(li):
        for i in range(1, len(li)):
            tmp = li[i]  #i=2 tmp=4
            j = i - 1    #j=1 li[j]=7
    
            while j>=0 and li[j] > tmp:
                li[j+1] = li[j] ### li[2] = li[1]=7  [5,7,7,6,3,1,2,9,8]
                j = j - 1 ## j=0
    
            li[j+1] = tmp
    

    快速排序

    #### 时间复杂度:O(nlogn)
    def partition(li, left, right):  #### O(n)
        tmp = li[left]
        while left < right:
            while left < right and li[right] >= tmp:
                right = right - 1
            li[left] = li[right]
    
            while left < right and li[left] <= tmp:
                left = left + 1
            li[right] = li[left]
    
        li[left] = tmp
    
        return left
    
    
    
    def quick_sort(li, left, right):
    
        if left < right:
    
            mid = partition(li, left, right)
    
            quick_sort(li, left, mid-1)  ### O(logn)
            quick_sort(li, mid+1, right)
    

    查找

    • 顺序查找
    • 二分查找 (字节跳动)

    数据结构

    • 线性结构
      • 数组 (列表)
      • 链表
      • 线性结构的应用
        • 队列
    • 非线性结构
        • 一般树
        • 二叉树
          • 完全二叉树
          • 满二叉树
        • 森林
  • 相关阅读:
    英语语法学习笔记之名词
    2016年回顾2017年目标之流水账
    英语单词词性
    本机tomcat的server.xml被还原的问题及解决办法
    关闭英文拼写检查,关闭xml验证
    eclipse运行速度优化(解决狂读盘、发布慢、CPU100%等问题)
    mysql中,通过脚本设置表的自增列,及自增步长
    Eclipse调试 : step into,step over,step return 说明
    几个分布方法及距离方法
    国内其他的maven库
  • 原文地址:https://www.cnblogs.com/fwzzz/p/12734636.html
Copyright © 2020-2023  润新知