算法与数据结构
算法的概念
算法是計算機處理信息的本質,因為計算機程序本質上是一個算法來告訴計算機確切的步驟來執行一個指定的任務,一般,當算法在處理信息時,會從輸入設備或數據的存儲地址讀取數據,把結果寫入輸出設備或某個存儲地址供以后再調用。
算法重要的是其的思想,而不是其所實現的某種語言,它是獨立存在的一種解決問題的方法和思想。
算法的特性
輸入:算法具有0個或多個輸入
輸出:算法至少有1個或多個輸出
有窮性:算法在有限的步驟之后會自動結束,而不會無限循環,并且每一個步驟可以在可接受的時間內完成
確定性:算法中的每一步都有確定的含義,不會出現二義性
可行性:算法的每一步都是可行的,也就是說每一步都能夠執行有限的次數完成
算法的效率
執行時間反應算法效率,實現算法程序的執行時間可以反應出算法的效率,也就是算法的優劣
但是單純的依靠運行時間來比較算法的優劣并不一定是客觀準確的,程序的運行,還依靠了運行環境等客觀條件,所以并不能單純的從運行時間來分別算法的好壞。
時間復雜度
假定計算機執行算法每一個基本操作的時間是一個固定的時間單位,那么有多少個基本操作就代表會花費多少時間單位,即使對于不同的程序運行環境來說,確切的程序運行時間是不同的,但是對于算法運行所花費的時間單位的數量級是相同的,所以可以忽略機器環境的影響而客觀的反應算法的時間效率。我們采用“大O記法來表示”
大O記法
“大O記法”:對于單調的整數函數f,如果存在一個整數函數g和實常數c>0,使得對于充分大的n總有f(n)<=c*g(n),就說函數g是f的一個漸近函數(忽略常數),記為f(n)=O(g(n))。也就是說,在趨向無窮的極限意義下,函數f的增長速度受到函數g的約束,亦即函數f與函數g的特征相似。
時間復雜度:假設存在函數g,使得算法A處理規模為n的問題示例所用時間為T(n)=O(g(n)),則稱O(g(n))為算法A的漸近時間復雜度,簡稱時間復雜度,記為T(n).
算法完成工作最少需要多少時間單位,就是最優時間復雜度
算法完成工作最多需要所少時間單位,就是最壞時間復雜度
算法完成工作平均需要多少基本操作,就是平均時間復雜度
時間復雜度的基本計算規則
基本操作,即只有常數項,認為其時間復雜度為O(1)
順序結構,時間復雜度按加法進行計算
循環結構,時間復雜度按乘法進行計算
分支結構,時間復雜度取最大值
判斷一個算法的效率時,往往只要關注操作數量的最高次項,其它次要項和常數項可以忽略
在沒有特殊說明時,我們往往分析的算法時間復雜度是指最壞時間復雜度
常見時間復雜度
常見時間復雜度之間的關系
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
數據結構
為了解決問題,將數據保存下來,然后根據數據的存儲方式來設計算法實現進行處理,那么數據的存儲方式不同就會導致需要不同的算法進行處理,我們希望算法解決問題的效率越快越好,所以就需要思考如何保存數據,這就是數據結構。換句話說,數據結構指數據對象中數據元素之間的關系。高效的程序需要在數據結構的基礎上設計和選擇算法。也可以說程序是數據結構和算法之和。
抽象數據類型(Abstract Data Type)
ADT的含義是指一個數據模型以及定義在此模型上的一組操作。即把數據類型和數據類型上的運算聯合在一起,進行封裝。引入抽象數據類型的目的是把數據類型的表示和數據類型上的運算實現與這些數據類型和運算在程序中的引用隔開,使其相互獨立。
最常用的數據運算類型有:插入、刪除、修改、查找、排序
總結
- 上一篇: 嵌入式DM(data matrix)码检
- 下一篇: BCH编码