本系列博客爲學習狄泰學院《數據結構實戰開發教程》筆記並根據網絡資料總結而來。算法
狄泰學院:https://dt4sw.ke.qq.com/數組
數據結構是相互間存在特定關係的數據的集合,分爲邏輯結構和物理結構。網絡
集合結構:數據元素之間沒有特別的關係,僅同屬相同集合。數據結構
線性結構:數據元素間是一對一的關係ide
樹形結構:數據元素間存在一對多的層次關係學習
圖形結構:數據元素之間是多對多的關係測試
物理結構是邏輯結構在計算機中存儲形式,分爲順序存儲結構和鏈式存儲結構。spa
順序存儲結構將數據存儲在地址連續的存儲單元裏。3d
鏈式存儲結構將數據存儲在任意的存儲單元裏,經過保存地址的方式找到相關聯的數據元素。blog
算法是特定問題求解步驟的描述,是獨立存在的一種解決問題的方法和思想。
輸入:有0個或多個輸入
輸出:至少有1個或多個輸出
有窮性:算法在有限的步驟後應該自動結束而不會無限循環。
肯定性:算法中的每一個步驟都有肯定的含義,不會出現二義性
可行性:算法的每一步都是可行的
正確性:算法對於合法數據可以獲得知足要求的結果,可以處理非法輸入,並獲得合理的結果。
可讀性:算法要便於閱讀、理解和交流
健壯性:算法不該該獲得莫名其妙的結果
性價比:利用最少的資源獲得知足要求的結果
效率評估是工程中算法最重要的附加特性。
(1)、過後統計法
比較不一樣算法對同一組輸入數據的運行處理時間。
缺點:
A、爲了得到不一樣算法的運行處理時間必須編寫相應程序
B、運行處理時間嚴重依賴硬件以及運行時環境
C、算法的測試數據選取困難
(2)、事前分析統計
依據統計的方法對算法效率進行評估
影響算法效率的主要因素:
A、算法採用的策略和方法
B、問題的輸入規模
C、編譯器產生的代碼
D、計算機的執行速度
算法效率的簡單估算:
三種求和算法的關鍵部分的操做數量分別爲2n,n,1。隨着問題規模的增大,操做數量的差別會愈來愈大,效率差別也會愈來愈大。
不一樣算法操做數量的對比
算法操做數量對比的實例一:
n<=3時,算法B優於算法A。隨着n的規模增大,算法A優點比較明顯。
算法操做數量對比的實例二:
n=1時,算法C與算法D效率相同。隨着n規模的增大,算法C優點明顯優於算法D。
判斷算法的效率時,操做數量中的常數項和其餘次階項經常能夠忽略,只須要關注最高階項。
(1)算法的時間複雜度
算法時間複雜度是算法運行後對時間需求量的定性描述。
因爲主要關注算法的效率問題,所以主要討論算法的時間複雜度。
O表示法
算法的效率嚴重依賴於操做(Operations)數量,操做數量的估算能夠做爲時間複雜度的估算,在判斷時首先關注操做數量的最高階項。
O(2)==>O(1)
O(3n+3)==> O(3n)==>O(n)
O(3n^2+n+4)==>O(n^2)
常見的時間複雜度:
(2)算法的空間複雜度
算法空間複雜度是算法運行後對空間需求量的定性描述。
一般使用S(n)表示算法的空間複雜度。使用時間複雜度的推導方法推導空間複雜度。
當算法所需的內存空間大小爲常數時,算法的空間複雜度爲S(1)。
一般狀況下,算法的時間複雜度更受關注。能夠經過增長額外空間下降時間複雜度。
算法是解決具體問題的步驟,數據結構是算法解決問題的載體。
一個數組中存儲着1——1000的數字,每一個數字可能出現屢次或者不出現,找出出現次數最多的數字。
void search(int array[], int len)
{
//總計可能出現1000種可能值
int sp[1000] = {0};
int max = 0;
for(int i = 0; i < len; i++)
{
//遍歷數組,數組中某個數組出現一次增長統計1次
sp[array[i] - 1]++;
}
for(int i = 0; i < 1000; i++)
{
if(max < sp[i])
{
max = sp[i];
}
}
for(int i = 0; i< 1000; i++)
{
if(max == sp[i])
{
cout << "Number:" << i + 1 << endl;
cout << "Count:" << max << endl;
}
}
}
使用空間換時間,算法的時間效率爲O(n)。