zoukankan      html  css  js  c++  java
  • 算法基础

    一、时间复杂度

    1.时间复杂度是用来估算算法运行时间的一个式子。(单位)

    2.一般来说,时间复杂度高的算法比复杂度低的算法慢。

    3.常见的时间复杂度(按效率排序):

    O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n²logn)<O(n³)

    如何一眼判断时间复杂度:(大部分情况下)

    1.循环减半的过程——O(logn)

    2.几次循环就是n的几次方的复杂度

    二、空间复杂度

    1.空间复杂度:用来评估算法内存占用大小的一个式子。

    ——空间换时间

    三、常见算法

    1.查找

    二分查找:

    1.1(代码复杂度O(logn))

    def search_l(data_set,value):
        low = 0
        high = len(data_set) - 1
        while low <= high:
            mid = (low + high) // 2
            if data_set[mid] == value:
                return mid
            elif data_set[mid] < value:
                low = mid+1
            else:
                high = mid -1
        return None
    

      

    1.2 递归版本(代码复杂度O(n))

    def search_li(data_set,value,low,high):
        while low <= high:
            mid = (low + high) // 2
            if data_set[mid] == value:
                return mid
            elif data_set[mid] < value:
                return search_li(data_set,value,low+1,high)
            else:
                return search_li(data_set, value, low, high-1)
        return None
    

      

     2.排序:

    2.1 lowB三人组(冒泡、选择、插入)

    冒泡(O(n²),速度慢):用for循环遍历,相邻的2个数进行对比,大的总是往上推。遍历一趟有序区增加一个数,第一趟完成最大数永远在最上(最后),有几个数则遍历几趟,最后一个数时不需要再做调整,所以真实为len(li)-1趟。

    def bubble_sort(li):
        for i in range(len(li)-1):  #i 指的是第几趟
            for j in range(len(li)-i-1): #j是指针,range中为每一趟指针最后指到的位置
                if li[j] > li[j + 1]:
                    li[j],li[j+1] = li[j+1],li[j]
    

      

    选择排序(O(n²)):

    思路:一趟遍历记录最小的数,放到第一个位置;

    在一趟遍历记录剩余列表中最小的数,继续放置;......

    问题:如何选出最小的数?

    关键点:无序区,最小数的位置

    def select_sort(li):
        for i in range(len(li) - 1):
            min_loc = i
            for j in range(i+1,len(li)):
                if li[j] < li[min_loc]:
                    min_loc = j
            if min_loc != i:
                li[i],li[min_loc] = li[min_loc],li[i]
    

      

    插入排序(O(n²):

    思路:列表被分为有序区和无序区两个部分。最初有序区只有一个元素。

    每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。

    关键点:摸到的牌   手里的牌

    def insert_sort(li):
        for i in range(1,len(li)):
            tmp = li[i]
            j = i - 1
            while j >= 0 and tmp < li[j]:
                li[j + 1] = li[j]
                j -= 1
            li[j + 1] = tmp
    

      

    2.2 快速排序:

    好写的排序算法里最快的,快的排序算法里最好写的。

    思路:取一个元素p(第一个元素),使元素p归位;

    列表被p分成两部分,左边的都比p小,右边的都比p大;

    递归完成排序。

    第一步:def quick_sort(data,left,right):

        if left < right:
    mid = partition(data,left,right)
    quick_sort(data,left,mid - 1)
    quick_sort(data,mid + 1,right)

    最终:
    def partition(data,left,right):
        tmp = data[left]
        while left < right:
            while left < right and data[right] >= tmp:
                right -= 1
            data[left] = data[right]
            while left < right and data[left] <= tmp:
                left += 1
            data[right] = data[left]
        data[left] = tmp
        return left
    
    def quick_sort(data,left,right):
        if left < right:
            mid = partition(data,left,right)
            quick_sort(data,left,mid - 1)
            quick_sort(data,mid + 1,right)
    

      

     
  • 相关阅读:
    10,EasyNetQ-发布确认
    9,EasyNetQ-版本化消息
    一个小程序云开发的项目,图书借还系统
    利用canvas对图片进行切割
    微信小程序添加卡券到微信卡包,使用wx.addCard()方法传参及整体流程
    git合并时忽略某个文件
    小程序接入云通信IM
    小程序插件使用wx.createSelectorQuery()获取不到节点信息
    小程序插件开发流程及注意事项
    小米6使用charles抓包https
  • 原文地址:https://www.cnblogs.com/mitsui/p/7683582.html
Copyright © 2011-2022 走看看