Python系列之簡單算法分析

時間複雜度與空間複雜度

算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表着用系統的方法描述解決問題的策略機制。

  • 時間複雜度

    時間複雜度是指執行算法所需要的計算工作量

    • 計算時間複雜度的方法:

      1、用常數1代替運行時間中的所有加法常數
      2、修改後的運行次數函數中,只保留最高階項
      3、去除最高階項的係數

按數量級遞增排列,常見的時間複雜度有:

O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n2log2n)<O(n3)

不常見的時間複雜度有:
O(n!)<O(2n)<O(nn)

常見時間複雜度實例:

O(1)
第一種:
    print("Hello")
第二種:
    sum = (sum+2)/3

O(log2n)
def a(n):
    while n > 1:
        n = n // 2
        print(n)
    return n
print(a(10))

O(n)
for i in range(n):
    print(i)

O(n2)
for i in range(n):
    for j in range(n):
        print(j)

O(n3)
for i in range(n):
    for j in range(n):
        for k in range(n):
            print(j)

如何一眼就看出時間複雜度呢?

- 循環減半的過程一般包含:  O(logn)
- 幾次循環就是n的幾次方複雜度
  • 常見算法複雜度
算法名稱 最差時間複雜度 平均時間複雜度 是否穩定 空間複雜度
冒泡排序
O(n2)
O(n2)
穩定
O(1)
快速排序
O(n2)
O(nlog2n)
不穩定
O(log2n)|O(1)
選擇排序
O(n2)
O(n2)
穩定
O(1)
二叉樹排序
O(n2)
O(nlog2n)
不穩定
O(n)
插入排序
O(n2)
O(n2)
穩定
O(1)
堆排序
O(nlog2n)
O(nlog2n)
穩定
O(1)
  • 空間複雜度

    空間複雜度是指執行算法所需的內存空間

  • 只有變量

    O(1)
  • 有一個列表

    O(n)
  • N維列表

    O(nn)

算法實例

  • 二分查找
    條件:必須是有序集合
import time

def org(func):
    def te(*args, **kwargs):
        t1 = time.time()
        x = func(*args, **kwargs)
        t2 = time.time()
        print  "The time: %s, %s "% (func.__name__, t2-t1)
        return x
    return te

@org
def datas(data_list, val):

    low = 0
    high = len(data_list) - 1

    mid = high // 2

    while low <= high:
        mid = (high + low) // 2
        if data_list[mid] == val:
            return mid
        elif data_list[mid] > val:
            high = mid - 1
        else:
            low = mid + 1
    return

a = list(range(10000))

print(datas(a, 1234))
  • 冒泡排序
import random
import time

def org(func):
    def te(*args, **kwargs):
        t1 = time.time()
        x = func(*args, **kwargs)
        t2 = time.time()
        print  "The time: %s, %s "% (func.__name__, t2-t1)
        return x
    return te

@org
def bubble_sort(bubble_list):
    n = len(bubble_list)
    for i in range(n-1):
        exchange = False
        for j in range(n-1-i):
            if bubble_list[j] < bubble_list[j+1]:
                bubble_list[j],bubble_list[j+1] = bubble_list[j+1],bubble_list[j]
                exchange = True
        if not exchange:
            break


a = list(range(10000))

random.shuffle(a)

bubble_sort(a)
  • 選擇排序
import random
import time

def org(func):
    def te(*args, **kwargs):
        t1 = time.time()
        x = func(*args, **kwargs)
        t2 = time.time()
        print  "The time: %s, %s "% (func.__name__, t2-t1)
        return x
    return te

@org
def select_sort(bubble_list):
    for i in range(len(bubble_list) - 1):
        min_loc = i
        for j in range(i, len(bubble_list)):
            if bubble_list[j] < bubble_list[min_loc]:
                min_loc = j

        bubble_list[i],bubble_list[min_loc] = bubble_list[min_loc], bubble_list[i]

a = list(range(10000))

random.shuffle(a)

select_sort(a)
  • 插入排序
import random
import time

def org(func):
    def te(*args, **kwargs):
        t1 = time.time()
        x = func(*args, **kwargs)
        t2 = time.time()
        print  "The time: %s, %s "% (func.__name__, t2-t1)
        return x
    return te

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

a = list(range(1000))

random.shuffle(a)

insert_sort(a)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章