數據結構是問題的數學模型。 程序設計的實質是對實際問題選擇一種好的數據結構,加之設計一個好的算法。 算法(解決問題的方法)處理的對象就是數據。算法與數據的結構密切相關,算法無不依附於具體的數據結構,數據結構直 接關係到算法的選擇和效率。程序設計的實質是對實際問題選擇一種好的數據結構,加之設計一個好的算法。
一、基本概念
1、數據:是對信息的一種符號表示——人們利用文字符號、數字符號以及其他規定的符號對現實世界的事物及其活動所做的描述。
2、數據元素:是數據(集合)中的一個“個體”,是數據的基本單位,在計算機程序中通常作爲一個整體進行考慮和處理。
3、數據項(data item):是數據結構中討論的“最小單位”。
4、數據對象(Data Object):是性質相同的數據元素的集合,是數據的一個子集。
5、數據結構(Data Structure): 是相互之間存在一種或多種特定關係的數據元素的集合。
6、結構:數據元素之間的相互關係。
四種基本結構:集合,線性結構,樹型結構,圖狀結構或網狀結構。
二、好的算法的要求
1、算法的正確性:有窮性,確定性,可行性,輸入,輸出。
2、好的算法的要求目標:正確性,可讀性,健壯性,效率與低存儲要求。
三、好的算法的度量
與算法執行時間相關的因素有: 1)、算法選用的策略。2)、問題的規模
3)、編寫程序的語言。4)、編譯程序產生的機器代碼的質量。5)、計算機執行指令的速度。
一般認爲算法的效率只依賴於問題的規模。任何一個算法都是由一個控制結構和若干原操作組成的。控制結構:順序、分支和循環 3 種。原操作:指對固有數據類型(高級語言中的數據類型)的操作(如賦值操作、轉向操作、比較操作等等),顯然每個原操作的執行時間和算法無關,相對於問題的規模是常量。
算法的執行時間可看成是所有原操作的執行時間之和。
1、時間複雜度
算法中包含原操作次數的多少叫做算法的時間複雜度,用它來衡量一個算法的運行時間性能。
如果存在兩個正常數c和n0,對於所有的 n>=n0,有| f(n) |<=c | T(n)|則稱 f(n) 是 T(n) 的同數量級函數。把 T(n) 表示成數量級的形式爲:T(n)=O(f(n))。稱O(f(n)) 爲算法的漸近時間複雜度,簡稱時間複雜度。
有時候,算法中基本操作重複執行的次數還隨問題的輸入數據集不同而不同,如在冒泡排序中,輸入數據有序而無序,其結果是不一樣的。此時,我們計算平均值。
常見的算法的時間 複雜度之間的關係爲:
O(1)<O(log n)<O(n)<O(nlog n)<O(n2)<O(2n)<O(n!)<O(nn)
當 n 很大時,指數階算法和多項式階算法在所需時間上非常懸殊。因此,只要有人能將現有指數階算法中的任何一個算法化 簡爲多項式階算法,那就取得了一個偉大的成就。
2、空間複雜度
空間複雜度:算法所需存儲空間的度量,記作:
S(n)=O( f(n) )
其中 n 爲問題的規模。
一個算法所需存儲空間:算法本身的存儲空間、輸入數據的存儲空間、算法在運行過程中臨時佔用的存儲空間。 如果額外空間相對於輸入數據量來說是個常數,則稱此算法是原地工作。