之前有讀過《Java資料結構和演算法》,當時簡單的寫了一些筆記和實現的例項,現對其進行一個系統的整理,以作為分享和備忘。
本篇主要是一些簡要的介紹和一些專業詞彙的定義:
1. 什麼是資料結構和演算法資料結構:對計算機記憶體/磁碟中資料的一種安排,資料結構包括陣列,棧,二叉樹,雜湊表等待演算法:對這些結構中的資料進行各種處理,如查詢,排序等2. 可以解決哪些問題?大體可以分為三類情況:
現實世界的資料儲存如我們平時的手機電腦等電子產品中的儲存的檔案是如何進行儲存的。使用什麼結構,基於哪些演算法可以更安全高效,更便於使用修改,查詢等程式設計師的工具如我們平時所說的堆疊,佇列,經常使用的陣列,java中提供的集合類,Arrays和Collections中提供的一些工具方法等建模將現實中的問題對映成資料結構(比如之後要學到的圖)或使用一些資料結構和演算法進行組合分析等3. 常用資料結構的優缺點陣列:優點:插入快,如果知道下標,可以非常快速的存取;缺點:查詢慢,刪除慢,大小固定有序陣列查詢比無需陣列快插入慢,刪除慢,大小固定棧提供後進先出方式的存取存取其他項很慢佇列提供先進先出方式的存取存取其他項很慢連結串列插入快,刪除快查詢慢二叉樹插入,查詢,刪除都很快刪除演算法複雜紅黑樹插入,查詢,刪除都很快,樹總是平衡的演算法複雜234樹插入,查詢,刪除都很快,樹總是平衡的,演算法複雜雜湊表插入快,如果關鍵字已知則存取極快刪除慢,如果關鍵字未知則存取很慢,對儲存空間使用不充分堆插入,刪除快,對最大資料項的存取快對其他資料項的存取慢圖對現實世界建模有些演算法慢且複雜以上除陣列外,都可以被認為是抽象資料結構 ;這些資料結構後面都會有單獨的篇章去進行具體的講解,現在不用去糾結它們是什麼。
面向物件程式語言的產生的原因1. 是由於面向過程語言在處理大型的複雜問題時的力不從心
2. 程式與現實世界缺乏對應關係(對現實世界建模的無能為力)
3. 程式內部的結構出現了問題
抽象資料型別:Abstract Data Type ,簡稱ADT,用於指定邏輯特性而不指定實現細節的資料結構 ,簡單來說就是 著重於它做了什麼,而忽略它是怎麼做的。例如,棧和佇列都是屬於ADT,用陣列或者連結串列都可以實現棧和佇列,拿棧來說,它的精髓在於後進先出,在於push,pop,以及如何使用它,而不是它的內在實現,用陣列還是連結串列實現關鍵就在於,能否精確的預測棧或佇列需要容納的資料量,以及增刪改查的時間複雜度(效率)的差別。
演算法的時間複雜度(大O表示法)定義:如果一個問題的規模是n,解這一問題的某一演算法所需要的時間為T(n),它是n的某一函式。T(n)稱為這一演算法的“時間複雜度”。
這個定義來自百度百科,感覺並不容易看懂,不過並不重要,下面舉幾個例子就好了:
1. 交換i,j的時間複雜度是 O(1)
2. 單層for迴圈的時間複雜度是O(n)
3. 雙重for迴圈的時間複雜度是O(n^2)
後面講到其他資料結構和演算法還會多次提及這個感念,例如下一篇的陣列,線性查詢(fori)的時間複雜度是O(n),而有序陣列的二分查詢的時間複雜度是O(logN)。
最新評論