算法分類 ,時間復雜度 ,空間復雜度,優化算法


算法

    今天給大家帶來一篇關於算法排序的分類,算法的時間復雜度,空間復雜度,還有怎么去優化算法的文章,喜歡的話,可以關注,有什么問題,可以評論區提問,可以與我私信,有什么好的意見,歡迎提出.

前言: 算法的復雜度分為時間復雜度與空間復雜度,時間復雜度指執行算法需要需要的計算工作量,空間復雜度值執行算法需要的內存量,可能在運行一些小數據的時候,大家體會不到算法的時間與空間帶來的體驗. 優化算法就是將算法的時間優化到最快,將空間優化到最小,假如你寫的mod能夠將百度游覽器的搜索時間提升0.5秒,那都是特別厲害的成績.

 

本章內容:   1,算法有哪些   2,時間復雜度,空間復雜度   3,優化算法   4,算法實例

一,算法有哪些

  常見的算法有冒泡排序,快排,歸並,希爾,插入,二分法,選擇排序,廣度優先搜索,貪婪算法,這些都是新手入門必須要了解的,你可以不會,但是你必須要知道他是怎么做到的,原理是什么,今天就給大家講一講我們常用的冒泡排序,選擇排序,這兩個排序算法,

 

 

1,冒泡排序(Bubble Sort), 為什么叫他冒泡排序呢? 因為他就像是從海底往海面升起的氣泡一樣,從小到大,將要排序的數從小到大排序,

冒泡的原理: 他會一次比較兩個數字,如果他們的順序錯誤,就將其調換位置,如果排序正確的話,就比較下一個,然后重復的進行,直到比較完畢,

這個算法的名字也是這樣由來的,越大的數字,就會慢慢的'浮'到最頂端. 好了該上代碼了,下面就是冒泡排序的代碼,冒泡相對於其他的排序算法來說,比較的簡單,比較好理解,運算起來也是比較迅速的,比較穩定,在工作中也會經常用到,推薦使用

 

# 冒泡排序
def bubble_sort(alist):
    n = len(alist)
    # 循環遍歷,找到當前列表中最大的數值
    for i in range(n-1):
        # 遍歷無序序列
        for j in range(n-1-i):
            # 判斷當前節點是否大於后續節點,如果大於后續節點則對調
            if alist[j] > alist[j+1]:
                alist[j], alist[j+1] = alist[j+1], alist[j]
if __name__ == '__main__':
    alist = [12,34,21,56,78,90,87,65,43,21]
    bubble_sort(alist)
    print(alist)
# 最壞時間復雜度: O(n^2)
# 最優時間復雜度: O(n)
# # 算法穩定性:穩定

   

 

2,選擇排序(selection sort)

    選擇排序(selection sort)是一種簡單直觀的排序方法, 他的原理是在要排序的數列中找到最 大 或者最 小 的 元素,放在列表的起始位置,然后從其他里找到第二大,然后第三大,依次排序,

依次類,直到排完,

    選擇排序的優點是數據移動, 在排序中,每個元素交換時,至少有一個元素移動,因此N個元素進行排序,就會移動 1--N 次,在所有依靠移動元素來排序的算法中,選擇排序是比較優秀的一種

 

選擇排序時間復雜度與穩定性:

最優時間復雜度: O(n2)

最壞時間復雜度:O(n2)

算法穩定性 :不穩定(考慮每次升序選擇最大的時候)

#             if alist[j] < alist[min_index]:
#                 min_index = j
#
#         # 判斷min_index索引是否相同,不相同,做數值交換
#         if i != min_index:
#             alist[i],alist[min_index] = alist[min_index],alist[i]
#
#
# if __name__ == '__main__':
#     alist = [12,34,56,78,90,87,65,43,21]
#     # alist = [1,2,3,4,5,6,7,8,9]
#     select_sort(alist)
#     print(alist)

# O(n^2)
# 不穩定


def select_sort(alist):
    """選擇排序"""
    n = len(alist)
    for i in range(n - 1):
        min_index = i  # 最小值位置索引、下標
        for j in range(i+1, n):
            if  alist[j] < alist[min_index]:
                min_index = j
        # 判斷min_index ,如果和初始值不相同,作數值交換
        if min_index != i:
            alist[i], alist[min_index] = alist[min_index],alist[i]


if __name__ == '__main__':
    alist = [8,10,15,30,25,90,66,2,999]
    select_sort(alist)
    print(alist)

 

 這是一些算法的時間復雜度與穩定性

    

時間復雜度,空間復雜度

 

    接下來就要來說說時間復雜度與空間復雜度: 時間復雜度就是假如你 泡茶,從開始泡,到你喝完茶,一共用了多長時間,你中間要執行很多步驟,取茶葉,燒水,上廁所,接電話,這些都是要花時間的,

在算法中,時間復雜度分為  O(1)最快 , O(nn)最慢,

O(1) < O(logn) <O(n)<O(n2)<O(n3)<O(2n) <O(nn)    一般游覽器的速度都在O(n),做我們這一行,要注意客戶體驗,如果你程序的運行特別慢,估計別人來一次,以后再也不會來了      

 

 

下面給大家找了張如何計算 時間復雜度的圖片:

 

 

 

    空間復雜度(space complexity) ,執行時所需要占的儲存空間,記做 s(n)=O(f(n)),其中n是為算法的大小, 空間復雜度 絕對是效率的殺手,曾經看過一遍用插入算法的代碼,來解釋空間復雜度的,

覺得特別厲害,我就比較low了,只能給大家簡單的總結一下我遇到的空間復雜度了,

  一般來說,算法的空間復雜度值得是輔助空間,比如:一組數字,時間復雜度O(n),二維數組a[n][m]   :那么他的空間復雜度就是O(n*m)     ,因為變量的內存是自動分配的,第一個的定義是循環里面的,所以是n*O(1)   ,如果第二個循環在外邊,那么就是1*O(1)     ,這里也只是一個了解性的東西,如果你的工作中很少用到,那么沒有必要深究,因為用的真的很少

 

 

 

優化算法

 

這邊帶來了代碼,你們在復制下來了python上運行一下,看一下用的時間與不同, 自然就懂了,

這是未優化的算法  

 

''
已知有a,b,c三個數,都是0-1000之內的數,
且: a+b+c=1000 而且 a**2+b**2=c**2  ,求a,b,c一共有多少種組合
'''
# 在這里加一個時間模塊,待會好計算出結果
import time
# 記錄開頭時間
start_time=time.time()
# 把a,b,c循環出來
for  a in range(1001):
    for b in range(1001):
        for c in range(100):
            #  判斷他  主公式  第一次,並未優化
            if a+b+c==1000 and a**2 + b**2 == c**2 :
                # 打印
                print("a=" ,a)
                print("b=" ,b)
                print("c=" ,c)
            else:
                pass
stop_time = time.time()
print('一共耗時: %f'%(stop_time-start_time))
# 一共耗時 156.875001秒

 

 

 

這是第一次優化

import time
# 記錄開頭時間
start_time=time.time()
# 把a,b,c循環出來
for  a in range(1001):
    # 這里改成1001-a之后,他就不用再循環b了
    for b in range(1001-a):
        for c in range(100):
            #  判斷他  主公式  第二次,優化了b,
            if a+b+c==1000 and a**2 + b**2 == c**2 :
                print("a=" ,a)
                print("b=" ,b)
                print("c=" ,c)
            else:
                pass
stop_time = time.time()
print('一共耗時: %f'%(stop_time-start_time))
# 一共耗時 50.557070秒

 

最后一次優化

import time
# 記錄開頭時間
start_time=time.time()
# 把a,b,c循環出來
for  a in range(1001):
    for b in range(1001-a):
            c=1000 - a - b
            #  判斷他  主公式  第三次,優化了b和c
            if a+b+c==1000 and a**2 + b**2 == c**2 :
                print("a=" ,a)
                print("b=" ,b)
                print("c=" ,c)
            else:
                pass
stop_time = time.time()
print('一共耗時: %f'%(stop_time-start_time))
# 一共耗時 2.551449秒

 

從156秒優化到l2秒,    基本運算總數 * 基本運算耗時  = 運算時間    這之間的耗時和你的機器有着很大的關系

 

今天是12月30日,明天就要跨年了,祝大家2019年事業有成,工資直線上升,早日脫單,

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM