資料結構是資料元素相互之間的關係,是相互之間存在一種或多種特定關係的資料元素的集合。乙個資料結構包含了以下三個方面的內容:
資料元素之間的邏輯關係,也就是邏輯結構(就是給人看的、能畫出來的)。
資料元素及其關係在計算機記憶體中的表示,成為資料的儲存結構(就是給計算機看的、具體實現相關的)。
資料的運算和實現,即對資料元素可以施加的操作以及這些操作在相應儲存結構上的實現(就是資料結構對外提供的操作介面)。
邏輯結構可以分為線性結構和非線性結構:
儲存結構可以分為順序儲存結構、鏈式儲存結構、索引儲存結構和雜湊儲存結構:
演算法效率通過以下兩個方面來考慮:
時間效率與空間效率有時是矛盾的,二者往往不可兼得。
演算法時間效率可以用依據該演算法編制的程式在計算機上執行時消耗的時間來度量。
由於事後統計法需要花費大量的時間編寫程式,並且其執行結果很大程度上取決於具體的測試平台,所以事前分析法往往是更有效的評估方法,具體方法是:
\[t = \sum_^n f_it_i
\]其中t
表示演算法的執行時間,f
表示每種語句的執行頻率,t
表示該種語句執行一次所需的時間。
由於每條語句執行的時間與演算法無關,所以我們可以假定執行每條指令所需的時間均為單位時間,此時上式就可簡化為每種語句的執行頻率之和,即:
\[t = \sum_^n f_i
\]為了便於比較不同演算法的時間效率,我們僅比較它們的數量級。定義演算法時間複雜度的漸進表示如下:
\[\exists f(n),s.t \lim_ \frac = k \neq 0
\]則稱t(n) = o(f(n))
為演算法的時間複雜度。演算法時間複雜度表示隨著問題規模n
的增大,演算法執行時間的增長率與f(n)
的增長率相同。例如,若有演算法的耗費時間為:t(n)=2n^3+3n^2+2n+1
,則有:
\[\exists f(n)=n^3, s.t \lim_\frac = 2 \neq 0
\]所以t(n)=o(n^3)
,即此演算法的時間複雜度為o(n^3)
。由此可見,演算法的時間複雜度實際上是借助於無窮大來定義的,並且這個值越小,表示演算法執行得越快。
有的情況下,演算法中基本操作重複執行的次數還與輸入資料集的特性有關。例如,如果氣泡排序演算法的輸入為乙個有序陣列,那麼演算法可以直接退出,時間複雜度為o(1)
;如果輸入為乙個逆序陣列,那麼演算法需要交換所有元素才能保證陣列有序,時間複雜度為o(n^2)
。因此,演算法的時間複雜度又分為:
一般情況下總是會考慮最壞時間複雜度,這樣可以保證演算法的執行時間不會比這種情況更長。
當演算法的輸入規模n
很大時,不同時間複雜度演算法的執行時間差距非常大。下面的**列出了一些常見時間複雜度的演算法的執行時間隨著輸入規模增加的增長率:
$$n$$
$$o(1)$$
$$o(\log_2)$$
$$f(n)$$
$$o(n\log_2)$$
$$f(n^2)$$
$$f(n^3)$$
$$f(2^n)$$
$$f(n!)$$11
0101
1212
1122
4842
4124
8166416248
13824
64512
25640320161
41664256
4096
65536
2.0923e+13321
5321601024
32768
4.295e+9
2.6313e+35
演算法的空間效率使用空間複雜度來度量。空間複雜度就是演算法執行所需的儲存空間的度量,記作:
\[s(n) = o(f(n))
\]演算法要佔據的空間包括:
資料結構與演算法Javascript描述(一)棧
棧的特點 後入先出。stack類 function stack function push element function pop function peek function clear function length 使用舉例 1 數制間的相互轉換 此演算法只針對基數為2 9 的情況。可以利用...
資料結構與演算法的js描述總結
1.兩種判斷結構 if語句和switch語句。js中的switch語句和其他程式語言的區別 在js中,用來判斷的表示式可以是任意型別,而不限於整型。2.注意引數傳遞和引用傳遞 3.204 not content 該http響應的意思是僅向客戶端傳送http報標頭檔案,而不傳送http內容體。4.在e...
資料結構與演算法分析 C語言描述
第一種方法,先進行排序,再返回位置k上的元素。簡單排序問題 第二種方法,先將前k個元素讀入,再將剩下的元素逐個讀入,如果新元素大於陣列中第k個元素就找到他合適的位置並將陣列中的乙個元素擠出。第三種方法,利用快排的特點 假設預設公升序排序 每一次快排操作都能確定乙個數在排序結果中的最終固定位置,即該位...