目錄python
「數據結構是數據對象,以及存在於該對象的實例和組成實例的數據元素之間的各類聯繫。這些聯繫能夠經過定義相關的函數來給出。」——Sartaj Sahni,《數據結構、算法與應用》算法
「數據結構是ADT(抽象數據類型 Abstract DataType)的物理實現。」—— Clifford A.Shaffer,《數據結構與算法分析》編程
「數據結構(data structure)是計算機中存儲、組織數據的方式。一般狀況下,精心選擇的數據結構能夠帶來最優效率的算法。」
——中文維基百科數組
綜上:從上面的三種官方定義能夠看出,數據結構和算法一般是一塊兒出現的。數據結構
只有事先得知數據規模的問題,才能獲得處理數據的方法數據結構和算法
哪裏有空放哪裏,查找圖書困難編程語言
二分查找,經過書名的拼音字母不斷縮小查找圖書的範圍,新書來了插入會成爲一個問題函數
把書架劃分紅幾塊區域,每塊具區指定擺放各類類別的書;每塊區域內,按照書名的拼音字母順序排放,斟酌類的分法測試
綜上:解決問題方法的效率,和數據的組織方式有關spa
/* c語言實現 */ void PrintN (int N) {int i; for (i=1; i<=N; i++)( printf("%d\n", i); ) return; }
# python語言實現 def print_n(n: int): for i in range(n): print(n)
N過大,代碼會直接罷工
/* c語言實現 */ void PrintN (int N) {if (N){ PrintN(N - 1); printf("%d\n", N); } return; }
# python語言實現 def print_n(n: int): if n: print_n(n - 1) print(n)
綜上:解決問題方法的效率,和空間的利用效率有關
\[ f(x) = a_0+a_1x+\cdots+a_{n-1}x^{n-1}+a_nx^n \]
對於上述的多項式,咱們可使用如下代碼實現:
/* c語言實現 */ double f(int n, double a[], double x) {int i; double p = a[0] for (i=1; i<=n; i++) p += (a[i] * pow(x, i)); return p; }
# python語言實現 def f(n: int, a_list: list, x: float): p = a_list[0] for i in range(1, n): p += (a_list[i] * pow(x, i)) return p
可是上述的方法極其複雜,咱們能夠對多項式進行以下化簡:
\[ f(x) = a_0+x(a_1+(x(\cdots(a_{n-1}+x(a_n))\cdots)) \]
/* c語言實現 */ double f(int n, double a[], double x) {int i; double p = a[n]; for (i=n; i>0; i--) p = a[i-1] + x*p; return p }
# python語言實現 def f(n: int, a_list: list, x: float): p = a_list[n] for i in range(0,n,-1): p = a_list[i-1] + x*p return p
clock()
:捕捉從程序開始運行到clock()
被調用時所耗費的時間。這個時間單位是clock tick,即「時鐘打點」。
常數CLK_TCK:機器時鐘每秒所走的時鐘打點數。
/* c語言實現 */ #include <stdio.h> #include <time.h> clock_t start, stop; /* clock_t是clock()函數返回的變量類型 */ double duration; /* 記錄被測函數運行時間,以秒爲單位 */ int main() {/* 不在測試範圍內的準備工做寫在clock()調用以前*/ start = clock(); /* 開始計時 */ MyFunction(); /* 把被測函數加在這裏 */ stop = clock(); /* 中止計時 */ duration = ((double)(stop -start))/CLK_TCK; /* 計算運行時間 */ /* 其餘不在測試範圍的處理寫在後面,例如輸出duration的值 */ return 0; }
# python語言實現 import time def main(): start = time.clock() # start = time.process_time() my_function() stop = time.clock() # stop = time.process_time() t = stop - start # 以秒爲單位 return t
對於一個九項式的測試程序,運行一次,效果微乎其微,所以可讓被測函數重複運行充分屢次,使得測出的總的時鐘打點
間隔充分長,最後計算被測函數平均每次運行的時間便可!
綜上:解決問題方法的效率,和算法的巧妙程度有關
只描述數據對象集和相關操做集「是什麼」,並不涉及「如何作到」的問題,便可以理解爲僞代碼
Matrix Create( int M, int N )
:返回一個\(M×N\)的空矩陣;int GetMaxRow( Matrix A )
:返回矩陣\(A\)的總行數;int GetMaxCol( Matrix A )
:返回矩陣\(A\)的總列數;ElementType GetEntry( Matrix A, int i, int j )
:返回矩陣\(A\)的第\(i\)行、第\(j\)列的元素;Matrix Add( Matrix A, Matrix B )
:若是\(A\)和\(B\)的行、列數一致,則返回矩陣\(C=A+B\) (不考慮先按行加、先按列加、什麼語言實現),不然返回錯誤標誌;Matrix Multiply( Matrix A, Matrix B )
:若是A的列數等於B的行數,則返回矩陣\(C=AB\),不然返回錯誤標誌;綜上:抽象不須要關心具體的細節