數據結構與算法解析(一)——數據結構與算法簡介
數據結構與算法解析(一)——數據結構與算法簡介
本系列博客為學習狄泰學院《數據結構實戰開發教程》筆記並根據網絡資料總結而來。
一、數據結構簡介
數據結構是相互間存在特定關系的數據的集合,分為邏輯結構和物理結構。
1、邏輯結構
集合結構:數據元素之間沒有特別的關系,僅同屬相同集合。
線性結構:數據元素間是一對一的關系
樹形結構:數據元素間存在一對多的層次關系
圖形結構:數據元素之間是多對多的關系
2、物理結構
物理結構是邏輯結構在計算機中存儲形式,分為順序存儲結構和鏈式存儲結構。
順序存儲結構將數據存儲在地址連續的存儲單元裏。
鏈式存儲結構將數據存儲在任意的存儲單元裏,通過保存地址的方式找到相關聯的數據元素。
二、算法簡介
算法是特定問題求解步驟的描述,是獨立存在的一種解決問題的方法和思想。
1、算法的特性
輸入:有0個或多個輸入
輸出:至少有1個或多個輸出
有窮性:算法在有限的步驟後應該自動結束而不會無限循環。
確定性:算法中的每個步驟都有確定的含義,不會出現二義性
可行性:算法的每一步都是可行的
正確性:算法對於合法數據能夠得到滿足要求的結果,能夠處理非法輸入,並得到合理的結果。
可讀性:算法要便於閱讀、理解和交流
健壯性:算法不應該得到莫名其妙的結果
性價比:利用最少的資源得到滿足要求的結果
2、算法效率的度量
效率評估是工程中算法最重要的附加特性。
(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。
判斷算法的效率時,操作數量中的常數項和其他次階項常常可以忽略,只需要關註最高階項。
3、算法的復雜度
(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)。
通常情況下,算法的時間復雜度更受關註。可以通過增加額外空間降低時間復雜度。
算法是解決具體問題的步驟,數據結構是算法解決問題的載體。
4、算法實例
一個數組中存儲著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)。
本文出自 “生命不息,奮鬥不止” 博客,謝絕轉載!
數據結構與算法解析(一)——數據結構與算法簡介