算法圖解 - chapter 1~3(讀書筆記)

算法

算法簡介

算法是一組完成任務的指令。當數據量比較大的時候,算法的優劣對程序的性能好壞極爲重要python

衡量算法性能 - 大 O 表示法

  1. 算法的速度指的並不是時間,而是操做數的增速算法

  2. 談論算法的速度時,咱們說的是隨着輸入的增長,其運行時間將以什麼樣的速度增長數組

  3. 算法的運行時間用大 O 表示法表示數據結構

  4. 大 O 表示法指出了最糟狀況下的運行時間app

  5. O(logn) 比 O(n) 快,當須要搜索的元素越多時,前者比後者快得越多函數

數組與鏈表

數組:元素在內存中都是相連的性能

鏈表:元素可存儲在內存中任何地方,並不必定是相連的spa

數組擅長讀取,鏈表擅長插入與刪除(數組支持隨機訪問,而鏈表只能順序訪問)3d

數組 鏈表
讀取 O(1) O(n)
插入 O(n) O(1)
刪除 O(n) O(1)

遞歸

定義:函數本身調用本身code

基線條件和遞歸條件

遞歸條件:函數調用本身

基線條件:函數再也不調用本身,從而避免造成無限循環

基線條件和遞歸條件

元素 後進先出(LIFO) 的一種數據結構

調用棧

def greet2(name):
    print("how are you, " + name + "?")


def bye():
    print("ok, bye!")


def greet(name):
    print("hello, " + name + "!")
    greet2(name)
    print("getting ready to say bye...")
    bye()
複製代碼

調用 greet("maggie"),內存分配狀況:

調用棧

接下來,打印 hello, maggie! 再調用 greet2("maggie")

調用棧2

打印 hello are you, maggie? 而後從函數返回。棧頂內存塊被彈出。

調用棧3

調用另外一個函數時,當前函數暫停並處於未完成狀態。接下來,打印 getting ready to say bye...,調用函數 bye()

調用棧4

打印 ok bye! 從函數返回

調用棧5

用於存儲多個變量的棧就是調用棧

遞歸調用棧

遞歸函數使用調用棧,例如:

def fact(x):
    if x == 1:
        return 1
    else:
        return x * fact(x-1)
複製代碼

遞歸調用棧1

遞歸調用棧2

幾種重要算法

二分查找

只適用於有序元素列表

目的: 查找某個數是否存在於數組中

算法: 前提條件:a 爲數組,first 和 last 分別指向數組的頭尾,mid 指向數組的中間項,value 爲要查找的數

若是 first > last, 返回 None(沒有找到元素),不然循環執行如下程序: mid = (first + last) // 2

  1. 若是 a[mid] > value ,查找區間變爲[first, mid-1]
  2. 若是 a[mid] < value ,查找區間變爲[mid+1, last]
  3. 若是 a[mid] = value ,返回 mid

代碼:

def BinarySearch(a, value):
    first = 0
    last = len(a) - 1
    while first <= last:
        mid = (first + last) // 2
        guess = a[mid]
        if guess < value:
            first = mid + 1
        elif guess > value:
            last = mid - 1
        else:
            return mid
    return None
複製代碼

二分查找的時間複雜度:O(logn)

選擇排序

每次都找出數組中最小的元素,並添加到新數組中

代碼(找出最小值):

def findSmallest(arr):
    smallest = arr[0]
    smallest_index = 0
    for i in range(1, len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index
複製代碼

代碼(添加到新數組):

def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr)
        newArr.append(arr.pop(smallest))
    return newArr
複製代碼

選擇排序時間複雜度:O(n^2)

相關文章
相關標籤/搜索