資料結構的本質就在於:如何將現實世界中各種各樣的資料放入到記憶體中,並且如何在記憶體中操作這些資料,如何評價這些儲存方案和操作方法。
知乎原回答鏈結 ——————對您有用的話一定要給這位答主點贊啊!!!
資料結構難學嗎?是難學。
為什麼難學?一開始上來就講空間複雜度、時間複雜度,就講抽象資料,當然難學了。
1、生活、生產等現實世界的資料有各種各樣的組成形式。例如乙個課程的所有學生的成績(一組資料),乙個班全部學生的所有課程的成績(一張表)、乙個單位的人員結構(樹)等等。
2、這些資料都要先載入到記憶體中,再送到cpu中進行計算。
3、記憶體的最基本單位叫做儲存單元,乙個位元組(不討論理論中的、個別情況的)。儲存單元相當於乙個空盒子,可以放置資料。為了便於管理,盒子會給乙個編號,當然儲存單元也會有編號,其實就是位址。理論上位址的方案可以有多種(計算機組成原理和作業系統的任務),不過對於程式設計師來說,這些都跟我們無關,為了簡單起見,我們把儲存單元的編號(位址)都編成0、1、2、3、4,……這樣的,於是這些編號或位址的取值範圍,我們就稱位址空間。這個位址空間,跟一維座標軸一樣,所以是一維線性空間。
4、很明顯,資料就是乙個個放入到這些儲存單元中,就象我們把乙個單位的物品放入盒子一樣。現在,假設乙個盒子只能裝入乙個單位的物品。因而,乙個儲存單元也只能放入乙個單位的資料。
5、接下來,假設說,我們有很多很多的空盒子(x個)。有一天,我們要將若干單位物品(n個)放入盒子中,那麼我們可以在乙個盒子放入乙個單位物品。依此類推,我們可以在乙個儲存單元中放置乙個單位的資料。
6、再接下來,我們有兩種放置方案:乙個挨乙個地連續地放置物品;當然,也可以不連續地放置物品。依此類推,在記憶體當中放置資料,也有兩種方案,連續地放置資料,或者不連續地放置資料。為什麼會有不連續的放置方案呢?原因很簡單,乙個主要的原因是,記憶體的空間利用率高,碎片少(作業系統的儲存管理的知識,且不用理會),刪除舊有的資料很容易(這個是資料結構的內容)。
7、現在,可以把這兩個將資料放入到儲存單元的方案叫做物理儲存。對連續物理儲存方案來說,事情比較好辦,通過編號(索引、下標)就可以找到物品,對於不連續的方案,那麼我們就要在乙個物品上面標記下乙個物品的位置,這個標記就是下乙個物品的位址(指標)。當然,在計算機中,指標的記錄本身也要占用記憶體的儲存單元,所以我們在c語言中用結構體把資料和指標組織成為乙個單位。通過這個指向關係,我們可以在不連續的放置方案中依次地查詢我們所需要的東西(物品或資料)。
8、接下來,就象我們經常進行從盒子當中查詢物品、取用物品或增加物品等操作一樣,我們也要進行從記憶體當中查詢資料、取用(刪除)資料或增加資料等操作。那麼,對於不同的物理儲存方案來說,其方法是不一樣的。這個想一想,我們如何對付真實的物品,我們就如何對付記憶體中的資料。這就是資料的物理儲存方案的資料操作。
9、好了,搞懂這些,字串之類的知識點就不難了。
10、記住一點,只有兩種物理儲存結構:連續的和不連續的,因為記憶體的儲存單元的位址(編號)是0、1、2、3……(一維位址空間、或者線性位址空間)。
11、是不是只有物理儲存結構(方案)就可以了呢?在第1條中說過,現實當中的資料是有各種各樣的結構的。而在第10條,我們強調了物理放置方案只有2種:連續的和不連續的。
12、於是就產生乙個問題,如何將現實世界當中的關係各種各樣的資料放入到記憶體之中。
13、解決第12條中的問題,我們可以分兩步走,第1步是將現實世界的資料組織成為邏輯結構,第2步再把邏輯結構的資料對映到物理結構中。
14、顯然,在第1步中,我們拋去資料的其它屬性,只留下資料的兩個屬性就可以了:乙個屬性是資料的值,另乙個屬性就是資料之間的關係。這兩個屬性就得到乙個邏輯結構:graph(圖),這就是離散數學中的圖論。那麼,這就是科學家的事情,他們負責針對具體的問題,將現實世界的資料構造出對應的graph(圖)。
15、在第2步中,我們要做的事情,把這個graph對映到物理儲存結構中,這就是資料結構要做的事情了。顯然,我們可以用陣列來儲存,也可以用鍊錶來儲存,回憶一下最短路徑演算法的兩個做法。ps.,二維陣列、三維陣列也是乙個連續儲存的結構,在c語言debug下,看看位址就知道了。那麼,不連續的儲存結構,也就是鍊錶,當然有很多的衍生:雙向鍊錶、十字鍊錶、等等。
16、顯然,不管現實世界中的資料之間的關係如何,我們都可以用graph來描述,只不過是,不同的資料關係有不同的結構而已,比如:樹、森林、mesh,等等。
17、當然,我們要掌握一些常見的graph的操作方法,最主要就是搜尋方法。而且還要注意,這些方法是分兩個層次的,乙個物理儲存結構這個層次,乙個是邏輯儲存結構這個層次的。那麼現在,深度優先搜尋、廣度優先搜尋是哪個層次呢?
18、當然,我們還要掌握一下儲存結構的壓縮。
19、到了這個時候,我們還要問一下,各種方案的優劣性質如何,也就是空間複雜度和時間複雜度了。
20、當然,我們這個時候,還要進一步的問一問,能不能將這些邏輯結構給出乙個統一的描述,那麼,就是抽象資料了。
21、當然,我們還要掌握邏輯儲存結構的各種樹的優化,特別是針對不同的應用,比如紅黑樹、b樹。
22、當然,我們最後還要學習一下外存的儲存結構。
23、當然,實驗是少不了的。自己debug一下記憶體單元的位址,並且在紙上手工的畫一下是最好了。
mysql 死鎖 知乎 事務的本質和死鎖的原理
原文 僅以mysql和spring為例,本文不介紹事務和鎖的概念。本文使用偽 表示方法 僅僅表達方法的意義及事務註解。事務的形狀 在我心中,事務一直是這個樣子的 x軸是上鎖的資源,y軸是消耗的時間,事務方塊隨著時間的流逝向下移動,當碰觸x軸時資源加鎖,越過x軸時資源解鎖 上圖是對於方法a的事務形狀,...
知乎小白關於ctf競賽訓練 積累的資料
乙個巧合的機會,成為了ctf奪旗愛好者,乙個ctf小白。從12年開始國內大大小小的ctf比賽我都看過,那會還沒有統一叫ctf,都是叫 網路攻防賽 資訊保安賽之類的,目的就是為了通過技術手段找到最終的key 現在的ctf中叫做flag 只是到了後來慢慢的可能受到defcon ctf的影響國內所有的安全...
矩陣乘法的本質(線性空間篇,知乎 馬同學)
1.線性空間 1.1概念 在一片混沌的空白空間,假裝自己不知道座標系的概念 隨便選個點作為原點,以此原點做兩個單位正交的向量,然後平面上的某個點可以這樣表示 因為是單位向量所以簡化後 整個二維平面上的點,顯然都可以通過 的方式來表示。所張成的線性空間。那麼如果 不正交,長度也不相等呢?構成的空間是什...