發現有個網友總結的蠻好的,在學習前先看下這個大白話版本介紹,有個初始的印象,再去系統的學習那些概念的時候就好理解了。
文章如下:
不邀自來。
這個問題提得很好,好就好在「本質」兩個字。
資料結構的本質就在於:如何將現實世界中各種各樣的資料放入到記憶體中,並且如何在記憶體中操作這些資料,如何評價這些儲存方案和操作方法。
資料結構難學嗎?是難學。
為什麼難學?一開始上來就講空間複雜度、時間複雜度,就講抽象資料,當然難學了。
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一下記憶體單元的位址,並且在紙上手工的畫一下是最好了。
24、最後,有了這些基礎,剩下也就好辦了。
資料結構開場白
資料結構不難學,當時學的時候感覺很難,但是考研複習的時候就感覺不是這麼難了,現在為了找工作,重新撿起資料結構,用最快的時間把大話資料結構這本書給消化道,加油!是描述客觀事物的符號是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。資料元素 是組成資料的,有一定意義的單位,在計算...
資料結構開場白
是描述客觀事物的符號是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。資料元素 是組成資料的,有一定意義的單位,在計算機中通常作為整體處理。也被稱為記錄。乙個資料元素可以由若干個資料項組成,資料項是資料不可分割的最小單位。性質相同的資料元素的集合,是資料的子集。相互之間存在一...
資料結構 二
字串處理 strlen 用來計算字元的長度,並不包括結束字元 0 空字元長度為0 1 include 2 3 int strlen char string 4 10 int main 11 strcpy char str1,char str2 用來拷貝字串,把str2每個字元都拷貝到str1中,直到...