開始資料結構與演算法之前,需要了解下比較重要的兩個概念,即時間複雜度和空間複雜度。而這兩個指標也是評價乙個演算法設計的是否優良的標準。對設計的某個演算法進行評價的時候,需要首先評價該演算法的時間複雜度,而進行演算法比較的時候,是優先考慮時間複雜度。換句話說,在滿足相同時間複雜度的情況下,哪個演算法使用最小的空間複雜度,則哪個演算法好。
知道了評價演算法的指標,那麼就需要了解下,時間複雜度和空間複雜度到底是什麼,下面對其進行分別介紹。
時間複雜度,是某個演算法執行時間的描述函式,一般是指該演算法的執行時間收斂於某個值,一般是使用o來表示,比如某個演算法的時間複雜度是o(n2),則說明該演算法的執行時間是收斂於n2,(n代表該演算法的輸入規模),下面舉例對其說明。
比如排序演算法,給定乙個輸入為n長度的陣列,需要將這個陣列的元素排好序。我們可以對該陣列進行遍歷一遍,將陣列下標在[0,n-1]上的最大值放到陣列的最後乙個位置,即下標為n-1位置處,將陣列下標在[0,n-2]位置上的最大值,放到下標為n-2位置處。
在這個演算法中,第一次遍歷n-1個元素,第二次遍歷n-2個元素,以此類推,一直到遍歷到1個元素,而每次遍歷的時候,要進行比較操作,比較操作是常數級別的操作,該操作花費的時間記為c。那麼進行這個排序演算法操作的所花費的時間是:(n-1)×c+(n-2)×c+……+c,等差數列求和,其必出現n2項,n項和常數項,假設該等差數列求和的結果為xc×n2+yc×n+zc(x,y,z,c都為常數),那麼該演算法的時間複雜度就是o(n2),時間複雜度即不要低階項,同時忽略到高階項的係數。
空間複雜度是演算法的另乙個評價指標。空間複雜度是指,為了使得該演算法的正常執行而所需要的額外的空間大小,輸入的空間是不算的,也是用o來表示。
舉個例子說明一下。若給定乙個陣列,傳入該陣列左半部和右半部的陣列個數,將該陣列的右半部和左半部交換並返回。比如陣列[2,3,1,8,4,5],左半部4個元素,即[2,3,1,8],右半部2個元素,即[4,5],要得到[4,5,2,3,1,8]的結果。
很容易想到的乙個演算法是,新建乙個陣列,長度大小與輸入陣列長度一致,將原陣列的右半部拷貝,再將原陣列的左半部拷貝,整體拷貝回原陣列。這裡這個演算法,為了完成相應的功能,引入了新的陣列,所以我們就說,該演算法的空間複雜度是o(n)。
以上就是時間複雜度和空間複雜度的概念,而判斷演算法的好壞是優先考慮時間複雜度的,比如演算法1的時間複雜度是o(n),空間複雜度是o(n2),而演算法2的時間複雜度是o(n2),空間複雜度是o(1),優先考慮時間複雜度,則演算法1優於演算法2,在時間複雜度相等的情況下,空間複雜度小的演算法更優。
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...