資料結構筆記

2021-10-22 04:42:21 字數 3730 閱讀 1830

int a = ;

1、稀疏矩陣的儲存方法是三元組或十字鍊錶。三元組可以大大節省空間,但是做矩陣運算時需要大量移動元素,十字鍊錶可以避免大量移動元素。對於三元組來說是將非零元素所在的行、列以及它的值構成乙個三元組(i,j,v),如果乙個稀疏矩陣是以三元組的形式儲存的,那麼要對這個矩陣轉置時,需要將三元組的行列互換,然後按行排列即可。

2、在c++中,定義陣列,必須有行。

3、陣列和鍊錶的區別

陣列是將元素在記憶體中連續存放,由於每個元素占用的記憶體相同,可以通過下標迅速訪問陣列中的任何元素。陣列的插入資料和刪除資料效率低。但是陣列隨機讀取效率很高,陣列需要預留空間,在使用前要先申請佔記憶體的大小,可能會浪費記憶體空間,陣列不利於擴充套件。

鍊錶中的元素在記憶體中不是順序儲存的,如果要訪問鍊錶中的乙個元素比較低效,刪除和插入比較高效。鍊錶不指定大小,擴充套件方便,資料隨意增刪,記憶體利用率比較高。

string num=『hello』

num.substr(0, i + 1)為』hell『

1、帶頭結點單向鍊錶的判空條件是head.next= =null; 帶頭結點的單向迴圈鍊錶的判空條件是head.next==head;

2、(例題)設單迴圈鍊錶中節點的結構為(data,next),且rear是指向非空的帶頭節點的單迴圈鍊錶的尾節點的指標。若想刪除鍊錶第乙個資料元素(首元節點),則應執行下列哪乙個操作?

注意第乙個rear的位置,指的是那部分。

3、什麼是單向鍊錶,如何判斷兩個單向鍊錶是否相交

單向鍊錶是鍊錶的一種,其特點是鍊錶的連線方向是單向的,對鍊錶的訪問要通過順序讀取從頭部開始;鍊錶是使用指標進行構造的列表,鍊錶是有乙個個節點組裝起來的;其中每個節點都有指標成員變數指向列表中的下乙個節點。

//定義乙個結點模板

template

<

typename

t>

struct

node

node

(const t &d)

:data

(d),

next

(nullptr)}

;//刪除 p 結點後面的元素

template

<

typename

t>

void

remove

(node

*p)auto tmp = p->next->next;

delete p->next;

p->next = tmp;

}//在 p 結點後面插入元素

template

<

typename

t>

void

insert

(node

*p,const t &data)

//遍歷鍊錶

template

<

typenamet,

typename

v>

void

walk

(node

*p,const v &vistor)

}int

main()

);cout << sum << endl;

remove

(p);

sum =0;

walk

(p,[

&sum]

(const node<

int>

*p)->

void);

cout << sum << endl;

return0;

}1、在棧中、棧頂的動態變化決定棧中元素的個數;棧具有記憶功能。

2、stack overflow,舉個簡單例子導致棧溢位

棧一處指的是程式向棧中某個變數中寫入的位元組數超過了這個變數本身所申請的位元組數,因而導致棧中與其相鄰的變數的值被改變。棧溢位的原因:

樹是有乙個集合以及在該集合上定義的一種關係構成的。節點的度意為乙個節點所含有的子樹的個數。

二叉樹:二叉樹的每個節點至多只有兩顆子樹,有左右之分。、

滿二叉樹:

完全二叉樹:

對一顆具有n個節點的二叉樹按層次從左到右編序,二叉樹某個節點的編序與同樣位置的滿二叉樹節點的編序一一對應時,這個二叉樹成為完全二叉樹。滿二叉樹一定是完全二叉樹,完全二叉樹不一定是滿二叉樹。

二叉搜尋樹:

如果他的左子樹不為空,則左子樹上所有節點的值都小於根節點的值;如果他的右子樹不為空,那麼右子樹上所有節點的值都大於根節點的值,他的左右子樹都是二叉搜尋樹。這樣的特性便於進行查詢刪除插入等一系列操作,時間複雜度為o(log(n))。二叉搜尋樹的中序遍歷就是順序遍歷

//recursive

class

solution1

private

:void

inorderhelper

(vector<

int>

& ret,treenode* root)

};

平衡二叉樹紅黑樹:紅黑樹是一顆二叉搜尋樹,它在每個節點增加了乙個儲存位記錄節點的顏色,可以是紅可以是黑,紅黑樹保證最長路徑不超過最短路徑的二倍。

具體性質:根節點是黑色的;沒有連續的紅節點;對於每個節點,從該節點到其後代葉節點的簡單路徑上,均包含相同數目的黑節點。

哈夫曼編碼:

哈夫曼編碼是哈曼夫樹的一種應用,廣泛用於資料檔案壓縮。哈夫曼編碼演算法用字元在檔案**現的頻率來建立使用0,1表示每個字元的最優表示方式,具體演算法如下:

map的底層是用紅黑樹實現的,查詢的時間複雜度為log(n);hash_map的底層是hash表儲存的,查詢時間複雜度為o(1),hash表把資料查詢所消耗的時間大大降低,而代價是消耗更多的記憶體,它的基本原理是:使用乙個下標範圍比較大的陣列來儲存元素,可以設計乙個函式(雜湊函式)使得每個元素的關鍵字都與乙個函式值相對應,於是用這個陣列單元來儲存這個元素,但是不能保證每個元素的關鍵字與函式值是一一對應的,因此極有可能出現對於不同的元素,卻計算出了相同的函式值,這樣就產生了衝突,換句話就是把不同的元素分在了相同的類之中,一般來說,直接定址和解決衝突是雜湊表的兩大特點。在選擇上,hash_map的查詢速度比map快,屬於常數級別,但是還有hash函式的耗時,因此如果在資料量比較大,需要考慮效率時,可以使用hash_map,但如果對記憶體要求嚴格,則可以選擇記憶體消耗較小的map。

雜湊衝突的解決方法:

1、堆(heap)是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質:堆中某個結點的值總是不大於或不小於其父結點的值;堆總是一棵完全二叉樹。

資料結構筆記

程式效率與組織方式有關 圖書館擺書 二分查詢 程式效率與操作有關 迴圈和遞迴 遞迴雖簡單不過耗費大量空間 程式效率與演算法有關 多項式求和 秦九韶要比普通演算法快乙個數量級 測試兩種演算法的 include include include define max 101 define maxl 1e7...

資料結構筆記

一 鄰接矩陣 鄰接矩陣儲存使用2個陣列儲存圖的資訊 1個以為陣列儲存頂點,乙個二維陣列儲存邊的資訊 1 二維陣列中的對角線為0,以為不存在頂點到自身的邊 2 要知道某個點的出度,就是頂點vi在第i行的元素之和,入度就是該頂點所在列的元素之和 3 頂點vi的所有鄰接點就是吧矩陣中第i行元素掃瞄一遍 4...

資料結構筆記

二叉樹的遍歷操作 二叉樹的遍歷是指從根結點出發,按照某種次序 訪問二叉樹中的所有結點,使得每個結點被訪問一 次且僅被訪問一次。抽象操作,可以是對結點進行的各種 處理,這裡簡化為輸出結點的資料。前序遍歷 中序遍歷 後序遍歷 層序遍歷 查詢的基本概念 靜態查詢適用於 查詢集合一經生成,便只對其進行 查詢...