算法入门


算法

一个计算过程,解决问题的方法

“程序=数据结构+算法”

时间复杂度-小结
  • 时间复杂度用来估计算法运行时间的一个式子(单位)。
  • 一般来说,时间复杂度高的算法比复杂度低的算法慢
  • 常见的时间复杂度(按效率排序)
    • O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^2logn)<O(n^3)
  • 复杂问题的时间复杂度
    • O(n!) O(2^n) O(n^n)

如何简单快速地判断算法复杂度

  • 快速判断算法复杂度(适用绝大多数简单情况):\

    • 确定问题规模n
    • 循环减半过程——logn
    • k层关于n的循环——n^k
  • 复杂情况:根据算法执行过程判断

空间复杂度

  • 用来评估算法内存占用大小的式子
  • 空间复杂度的表示方式与时间复杂度完全一样
    • 算法使用几个变量:O(1)
    • 算法使用了长度为n的一堆列表:O(n)
    • 算法使用了m行n列的二维列表:O(mn)
  • ”空间换时间“:宁可占用多的空间来提升时间

1625539849122.png

查找算法

1625626707071.png

  • 顺序查找(线性查找):从第一个元素往下找,直到找到或者搜索到列表最后一个元素为止

  • 时间复杂度:O(n)

    def linear_search(data_set,value):
        '''
    
        :param data_set: 列表
        :param value: 要查的数据
        :return:循环找到需要的数据,返回下标
        '''
        for ind,v in enumerate(data_set):
            if v == value:
                return ind
        else:
            return None
    
  • 二分查找

  • 时间复杂度:O(logn)

    • 比O(n)也就是线性查找快得多
  • 1625625711331.png

    #二分查找
    def binary_search(li,val):
        '''
    
        :param li: 列表
        :param val: 需要查找的数
        :return:
        '''
        left = 0
        right = len(li) -1
    
        while left<=right:  # 候选区有值
            mid = (left+right) //2  # 找到候选区中间值
            if li[mid] == val:  # 如果直接找到要找的值,返回
                return mid
            elif li[mid] >val:  # 查找值在mid左侧
                right = mid-1
            else:  # li[mid]<val 带查找的值在mid右侧
                left = mid+1
        else:
            return None
    
    *python内置列表查找函数:index()运用线性查找,因为二分查找一大特点列表必须是有序列表

文章作者: Kexuan Shi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kexuan Shi !
评论
  目录