直擊資訊本質 資料結構總結篇

2021-10-07 01:43:10 字數 1472 閱讀 9403

傳送門在資料結構系列文章中講到了三種基礎的資料結構陣列、鍊錶、字典。基本也是最常用的三種資料結構。資料結構可以理解為資料的某種組合方式,某種理解方式。事實上,一樣的資料,不一樣的理解方式,也會帶來完全不一樣的結果。

在整個系列的文章中,重點是圍繞著資訊開展的與排序篇構成了姐妹篇。

陣列的出現直接原因是因為,物理現實,同時也因為知識、技術體系,只可製造有界且有限的儲存實體。而陣列的快速定址,正是建立在這些基本的條件上才得以實現的,這裡應用了已知獲取(整個儲存區域中最小儲存單元位址均勻分配。實際上在物理上記憶體區域是可能斷開的,但是這個問題是作業系統或者是硬體會解決,在應用程式中可以簡單認為,記憶體是完全連續的)

鍊錶解決陣列的浪費問題,同時解決了陣列增、刪慢的問題。但也因為只是記錄了中間資訊導致了需要計算才能得到其他關聯元素的資訊。事實上一般設計嚴謹的鍊錶,並不會直接提供,下標定址這種方法或者方式。一般遇到的情況都是不知道資料總量,但是查詢操作都是總量確定的情況下才開展的,這種情況,一般採用先使用鍊錶新增所有元素,最後把鍊錶轉換成陣列,然後在開展查詢等其他操作。

在實際使用中,基本上都是增、刪、查的需求都需要滿足,同時還需要滿足工程效能(開發速度)的需求, 所以在一般陣列都提供這三個方法。實際上一些高階語言中一般使用的陣列並不是單純的陣列,而是陣列和鍊錶兩種資料結構的集合,這種東西資料結構類似於雙向列隊。如果說鍊錶是把最小儲存單元之間「鏈」起來,那麼高階語言中的陣列是把陣列之間「鏈」起來。內部實現是由多個陣列構成,陣列之間的鏈結使用鍊錶的方式鏈結,這樣會讓陣列與鍊錶中的元素都不會過多,從而讓效能綜合最佳。

在字典設計中發現實際上還是將key對映到了下標才開始的操作,在程式語言中一般,存在兩種基本的資料結構,動態與靜態object。實質上動態object它就是乙個字典,因為它要動態的增加屬性,因為屬性的數量以及key的不確定,所以只能採用字典這種方式。而靜態object實際上是編譯時就會計算它的屬性對應的下標,在使用時直接通過下標進行定址。(靜態object可以看做乙個陣列,陣列的大小就是屬性的數量,其中每乙個元素對應每乙個屬性的位址,這也解釋了為什麼靜態object不可動態新增屬性的原因。)

c/c++與其他主流語言最大的區別之一就在於,c/c++使用了大量的靜態結構,核心目標追求效能,而靜態結構實際上就是已知獲取,而已知獲取,事實上就是讓人進行大量預設。同時因為靜態優先的原則,所以導致動態複雜化,也正應為如此,引出了最大問題,記憶體需要自己管理。而其他語言主要追求綜合性能,其中包括計算效能,也包括工程效能,設計時靜態和動態進行綜合使用。即:c/c++追求,執行高效、邏輯嚴謹。其他主流語言追求,開發高效、邏輯容錯。那麼:只有最適用的演算法,且也只有最適用的語言。

在資料庫的設計中,建索引的操作其實就是解決字典**現的問題。字典在面對超大資料量時也是不適用的,且如果是大量查詢,少量增刪操作時也是不適用的。如果儲存空間夠大實際上是可以通過預先分配且設計對應的hashkey,來解決這個問題。當然這種操作也是有犧牲的。

演算法與資料結構不分家。

在資訊方面,陣列應用了已知獲取,鍊錶應用了計算獲取,字典應用了假設獲取。

最小儲存單元、陣列、鍊錶、字典、排序總結。

直擊資訊的本質 陣列

後語傳送門 陣列指多個連續的最小儲存單元所構成的集合,且每個單元只可被乙個陣列使用。陣列會記錄起始最小儲存單元的下標 start 與陣列長度 len 在計算機系統中,可以把記憶體看做乙個超大的陣列 實際上陣列是由,最小儲存單元這個概念規定自然產生的一種資料結構,即多個連續的最小儲存單元稱之為陣列。實...

筆試總結 資料結構篇 持續更新

1.單鏈表的沒個節點都具有唯一的前驅節點和唯一的後繼節點,所以當兩個單鏈表存在相交的節點時,這兩個鍊錶則同時擁有這個節點,以及這個節點的所有後繼節點,當這個公共節點是尾節點時,他們則只含有公共乙個節點 尾節點。2.快慢指標是判斷單鏈表是否有環的一種方法 兩個指標,每次移動的步長為2叫做快指標,每次移...

資料結構中的各種排序 總結篇

乙個月沒有寫文章,原因是一直在忙碌著,但是其實是有收穫的,下面就是我這前半個月最大的收穫 對於資料結構中排序演算法的總結,在我找工作的道路上幫助了我好多。如有錯誤,歡迎指正!一 基本概念 1 排序 按照一定的關鍵字,將乙個序列排列成想要得到的乙個新的序列。2 內部排序和外部排序 整個排序過程完全在記...