一、概念
資料結構就像是一個催化劑,如果沒有原料是無用的,單是有了演算法就能幫演算法更快的實現任務;
資料結構:是指相互之間存在一種或多種特定關係的資料元素的集合,簡單地說是資料之間的各種關係的集合。
程式設計=資料結構+演算法;
解釋:如果要寫一個程式,需要選擇一個良好的資料結構,加上良好的解決問題的演算法;
二、名詞解釋
資料是一個最廣泛的概念,資料中可以有多個資料對象,資料對象中可以有多個資料元素,資料元素中可以有多個資料項目;
資料:能夠輸入到電腦並且能夠被電腦處理的符號;
資料對象:一個類的事物;
資料元素:一個記錄;
資料項目:一個記錄的屬性;
比如: class Person{ String name; int age; } 則資料對象為Person,資料元素為Person的執行個體,比如Person a,Person b,資料項目為name、age屬性; |
抽象資料類型(ADT):類比於類,自訂類型;
三、資料結構介紹
資料結構:資料元素之間的相互關係,那上面的例子來說,就是a和b的關係;
資料結構分為:
(1)邏輯結構:資料元素之間的相互關係,比如a和b的關係;
-集合結構:資料元素之間沒有關係;
-線性結構:資料元素之間一對一關聯性,例如鏈表;
-樹結構:資料元素之間一對多關聯性,比如二叉樹;
-圖解構:資料元素之間多對多關係,比如無向圖、有向圖;
(2)物理結構:資料元素在電腦中的儲存關係;
-順序儲存:資料元素連續儲存,資料存放區在連續的記憶體中;
-鏈表格儲存體:資料元素用鏈表串連,儲存不連續;
一、演算法和資料結構的關係
演算法和資料結構是密不可分的,因為如果資料結構是一個靜態東西,如果不去應用它,則只是一個很死的東西,因此我們需要演算法;
比如 鄰接表,只介紹他可能只是瞭解他的概念,但是如果我們學了DFS、BFS就知道他的用途;
二、演算法概念
演算法:演算法是解決特定問題求解步驟的描述,指令的有限序列;
解決一個問題可能有多種演算法,但是好的演算法是唯一的;
空間複雜度和時間複雜度需要權衡;
演算法的特性(演算法的基本要求)
(1)輸入輸出:演算法需要有輸入和輸出;
(2)有窮性:執行有限時間後完畢,此處的有限時間指的是你期望的時間;
(3)確定性:在輸入相同的前提下,輸出要唯一;
(4)可行性:能夠運行出結果;
演算法的設計要求(演算法的理想要求)
(1)正確性:對於合法輸入能夠得到正確答案,對於非法輸入能夠得到非法提示;
(2)可讀性:便於閱讀,別人拿到也能夠很容易的看懂;
(3)健壯性:對於非法輸入,需要得到足夠的提示,而不是異常;
(4)執行速度快、佔用儲存空間少;
度量演算法效率的方法
(1)事後統計法:編寫好演算法後測試,一般不用,因為外部的環境會極大的影響演算法的速度,比如機器的好壞、輸入的規模;
(2)事先統計法:編寫好演算法前先估計;
判斷f(n)和g(n)哪個效率高的方法:如果存在N,使得n>N時,f(n)>g(n),則f(n)劣於g(n);
演算法中最壞情況是一種底線,一般我們都需要保證最壞情況小於某個時間;
大O標記法
給定已耗用時間,去除加法常數、只保留最高階項、去掉最高階項的常數,就得到大O標記法;
比如4n^2+3n+2 = O(n^2)
高斯求和演算法
1+2+3+.....+99+100通過:
sum = 1 + 2 + 3 +.....+99+100
sum = 100+99+98 +.......+2 + 1
2*sum = 101*100
sum = 5050