數據結構複習

數據結構

數組、字符串、鏈表、樹、棧、隊列。c++

1.數組

數組佔着一段連續的內存進行存儲的數據結構。在建立數組時,須要指定數組的容量大小,先爲其分配內存。即時只在數組中存放一個數字,也要爲其預先分配全部的內存。數組

因爲內存連續,能夠在O(1)的時間直接進行讀寫,時間效率高。能夠利用這個優勢來建立哈希表。數組下標做爲key,下標對應的內容做爲value,組成了健值對的配對。數據結構

動態數組能夠解決數組空間效率不高的問題,如c++的stl中的vector。先開闢較小的空間,當空間不足時,從新分配一塊原來空間兩倍的空間。將數據轉移到新數組中,將以前的數組內存釋放。可是這樣也對時間性能有負面影響。因此動態數組要儘可能少改變容量大小的次數函數

建立一個數組時,數組名其實就是一個指針,指向數組的第一個元素。一樣也能夠經過指針來訪問數組,前提要注意確保不要超出數組的邊界。
(在c/c++中,將數組做爲函數參數傳遞時,會退化爲同類型的指針。)
練習:二維數組查詢性能

2.字符串

C/C++中每一個字符串都是以‘\0’結束,要注意是否形成了字符串的越界。
爲了節省內存,c/c++把常量字符串存放到一個單獨的內存區域,當指針賦值給相同的字符串時,他們其實會指向同一個地址。spa

char str1[] = "hello";
char str2[] = "hello";
//str1和str2是兩個字符串數組,分別開闢了不一樣的空間,因此str1和str2不一樣

char* str3 = "hello";
char* str4 = "hello";
//str3和str4是兩個指針,無需分配內存以存儲字符串內容,只要將其指向「hello」的地址便可。

String對象一旦被建立就是固定不變的了,對String對象的任何改變都不影響到原對象,相關的任何change操做都會生成新的對象。線程

 

字符串常量池:指針

每當咱們建立字符串常量時,JVM會首先檢查字符串常量池,若是該字符串已經存在常量池中,那麼就直接返回常量池中的實例引用。若是字符串不存在常量池中,就會實例化該字符串而且將其放到常量池中。因爲String字符串的不可變性咱們能夠十分確定常量池中必定不存在兩個相同的字符串。code

String a = "chenssy";
String b = "chenssy";

String c = new String("chenssy");

a、b和字面上的chenssy都是指向JVM字符串常量池中的"chenssy"對象,他們指向同一個對象。
new關鍵字必定會產生一個對象chenssy(注意這個chenssy和上面的chenssy不一樣),同時這個對象是存儲在堆中。因此上面應該產生了兩個對象:保存在棧中的c和保存堆中chenssy。可是在Java中根本就不存在兩個徹底如出一轍的字符串對象。故堆中的chenssy應該是引用字符串常量池中chenssy。因此c、chenssy、池chenssy的關係應該是:c--->chenssy--->池chenssy。整個關係以下:對象

 

練習:替換空格(合併數組等須要屢次更改大量數據位置的問題,能夠考慮使用指針從後向前查找。

3.鏈表

鏈表是一種動態數據結構,在建立時不須要將所有的內存進行分配。空間效率比數組高。
練習:單鏈表的插入刪除,鏈表倒序輸出。

4.樹

根節點沒有父節點,其餘都有惟一父節點。葉節點沒有子節點,其餘都有一個或者多個子節點。父節點和子節點以前用指針鏈接。

二叉樹

二叉樹的遍歷:前序遍歷,中序遍歷,後序遍歷(以訪問根節點的順序決定。)
二叉搜索樹:根節點總比左節點大,而右節點總比根節點大。
堆:最大堆中,根節點的值最大。最小堆中根節點的值最小。

5.棧和隊列

棧是一種先進後出的結構,系統爲每一個線程通常都會建立一個棧用來存放函數調用時候都各個函數的參數、返回地址和零時變量等等。
一般棧不考慮排序,尋找時候都須要花費O(n)的時間複雜度。

隊列是一種先進先出的結構。寬度遍歷樹的時候,能夠利用隊列的結構,用來存放每一層的子節點,而後下一層依次遍歷子節點。

相關文章
相關標籤/搜索