一、常用的資料結構
(1)線性資料結構:元素之間一般存在元素之間存在一對一關係,是最常用的一類資料結構,典型的有:陣列、棧、佇列和線性表
(2)樹形結構:結點間具有層次關係,每一層的乙個結點能且只能和上一層的乙個結點相關,但同時可以和下一層的多個結點相關,稱為「一對多」關係,常見型別有:樹、堆
(3)圖形結構:在圖形結構中,允許多個結點之間相關,稱為「多對多」關係
1、線性資料結構:典型的有:陣列、棧、佇列和線性表
(1)陣列和鍊錶
a、陣列:存放著一組相同型別的資料,需要預先指定陣列的長度,有一維陣列、二維陣列、多維陣列等
b、鍊錶:鍊錶是c語言中一種應用廣泛的結構,它採用動態分配記憶體的形式實現,用一組任意的儲存單元存放資料元素鍊錶的,一般為每個元素增設指標域,用來指向後繼元素
c、陣列和鍊錶的區別:
從邏輯結構來看:陣列必須事先定義固定的長度,不能適應資料動態地增減的情況;鍊錶動態地進行儲存分配,可以適應資料動態地增減的情況,且可以方便地插入、刪除資料項(陣列中插入、刪除資料項時,需要移動其它資料項)
從記憶體儲存來看:(靜態)陣列從棧中分配空間(用new建立的在堆中), 對於程式設計師方便快速,但是自由度小;鍊錶從堆中分配空間, 自由度大但是申請管理比較麻煩
從訪問方式來看:陣列在記憶體中是連續儲存的,因此,可以利用下標索引進行隨機訪問;鍊錶是鏈式儲存結構,在訪問元素的時候只能通過線性的方式由前到後順序訪問,所以訪問效率比陣列要低
(2)棧、佇列和線性表:可採用順序儲存和鏈式儲存的方法進行儲存
順序儲存:借助資料元素在儲存空間中的相對位置來表示元素之間的邏輯關係
鏈式儲存:借助表示資料元素儲存位址的指標表示元素之間的邏輯關係
a、棧:只允許在序列末端進行操作,棧的操作只能在棧頂進行,一般棧又被稱為後進先出或先進後出的線性結構
鏈棧:採用鏈式儲存結構的棧稱為鏈棧:
佇列:只允許在序列兩端進行操作,一般佇列也被稱為先進先出的線性結構
迴圈佇列:採用順序儲存結構的佇列,需要按佇列可能的最大長度分配儲存空空
鏈佇列:採用鏈式儲存結構的佇列稱為鏈佇列,一般需要設定頭尾指標只是鍊錶的頭尾結點
樹形結構:結點間具有層次關係,每一層的乙個結點能且只能和上一層的乙個結點相關,但同時可以和下一層的多個結點相關,稱為「一對多」關係,常見型別有:樹、堆
(1)二叉樹:二叉樹是一種遞迴資料結構,是含有n(n>=0)個結點的有限集合,二叉樹具有以下特點:
二叉樹可以是空樹;二叉樹的每個結點都恰好有兩棵子樹,其中乙個或兩個可能為空;二叉樹中每個結點的左、右子樹的位置不能顛倒,若改變兩者的位置,就成為另一棵二叉樹
(2)完全二叉樹:從根起,自上而下,自左而右,給滿二叉樹的每個結點從1到n連續編號,如果每個結點都與深度為k的滿二叉樹中編號從1至n的結點一一對應,則稱為完全二叉樹
a、採用順序儲存結構:用一維陣列儲存完全二叉樹,結點的編號對於與結點的下標(如根為1,則根的左孩子為2*i=2*1=2,右孩子為2*i+1=2*1+1=2)
3、圖形結構:在圖形結構中,允許多個結點之間相關,稱為「多對多」關係,可分為有向圖和無向圖
陣列與鍊錶的優缺點和區別
概述
陣列 是將元素在記憶體中
連續存放
,由於每個元素占用記憶體相同,可以通過下標迅速訪問陣列中任何元素。但是如果要在陣列中增加乙個元素,需要移動大量元素,在記憶體中空出乙個元素的空間,然後將要增加的元素放在其中。同樣的道理,如果想刪除乙個元素,同樣需要移動大量元素去填掉被移動的元素。如果應用需要
快速訪問資料,很少插入和刪除元素,就應該用陣列。
鍊錶 中的元素在記憶體中不是順序儲存的,而是通過存在元素中的指標聯絡到一起,每個結點包括兩個部分:乙個是儲存 資料元素 的 資料域,另乙個是儲存下乙個結點位址的 指標。
如果要訪問鍊錶中乙個元素,需要從第乙個元素開始,一直找到需要的元素位置。但是增加和刪除乙個元素對於鍊錶
資料結構
就非常簡單了,只要修改元素中的指標就可以了。如果應用需要
經常插入和刪除元素你就需要用鍊錶。
記憶體儲存區別
陣列從棧
中分配空間, 對於程式設計師方便快速,但自由度小。
鍊錶從堆
中分配空間, 自由度大但申請管理比較麻煩.
邏輯結構區別
陣列必須事先定義
固定的長度
(元素個數),不能適應資料動態地增減的情況。當資料增加時,可能超出原先定義的元素個數;當資料減少時,造成記憶體浪費。
鍊錶動態地進行儲存分配,可以適應資料動態地增減的情況,且可以方便地插入、刪除資料項。(陣列中插入、刪除資料項時,需要移動其它資料項)
陣列與鍊錶總結
1、訪問方式上,陣列可以順序訪問或者隨機訪問,而鍊錶只能順序訪問;
2、儲存位置上,陣列邏輯上相鄰的元素在物理儲存位置上也相鄰,而鍊錶不一定;
3、儲存空間上,鍊錶由於帶有指標域,儲存密度不如陣列大;
4、按序號查詢時,陣列可以隨機訪問,時間複雜度為o(1),而鍊錶不支援隨機訪問,平均需要o(n);
5、按值查詢時,若陣列無序,陣列和鍊錶時間複雜度均為o(1),但是當陣列有序時,可以採用折半查詢將時間複雜度降為o(logn);
6、插入和刪除時,陣列平均需要移動n/2個元素,而鍊錶只需修改指標即可;
7、空間分配方面:
陣列在靜態儲存分配情形下,儲存元素數量受限制,動態儲存分配情形下,雖然儲存空間可以擴充,但需要移動大量元素,導致操作效率降低,而且如果記憶體中沒有更大塊連續儲存空間將導致分配失敗;
鍊錶儲存的節點空間只在需要的時候申請分配,只要記憶體中有空間就可以分配,操作比較靈活高效
學習筆記 資料結構 堆結構
堆結構 實質是陣列 特點 以陣列的形式去儲存完全二叉樹 原理 以前序遍歷完全二叉樹,得出結點的前序序列,以陣列的形式儲存該序列。查詢父,子結點通過陣列下標id間的轉換關係實現。優點 節省儲存空間,查詢效率高 缺點 1 只能表示完全二叉樹 更廣泛的可以說是完全n叉樹 2 對樹的插入,刪除操作執行效率低...
學習筆記 資料結構 雜湊
雜湊表的特點 什麼是完全雜湊 雜湊方式 直接定址表的特點 雜湊表的特點,可以解決什麼問題 什麼是衝突 如何避免衝突 鏈結法的特點,插入,刪除,查詢的時間複雜度是多少 開放定址方法的原理 什麼是裝載因子 雜湊函式有什麼 同義詞的概念 聚集 堆積 現象 單向雜湊表的特徵 如何提高雜湊表的查詢效率 通過一...
學習筆記 資料結構 遞迴
1 遞迴定義 方法或函式呼叫自身的方式成為遞迴呼叫 去的過程叫 遞 回來的過程叫 歸 2 遞迴需要滿足的條件 1 乙個問題可以分解為資料規模更小的問題。比如階乘,只需要計算本身的值和前乙個數的乘積 2 分解後的子問題,除資料規模不一樣,求解思路完全相同。3 存在遞迴終止條件。一般用 if retur...