本文主要記錄我自學資料結構時的一些重點筆記以便日後複習
data structure visualizations視覺化資料結構
@單鏈表的快速建立、反向輸出、刪除
完全二叉樹和堆的定義
演算法複雜度分析重要性
typedef
struct node
node;
typedef
struct btnode
btnode;
typedef
struct btnode
btnode,
*btnode;
可以看到在最後又多了個*btnode,其實在定義乙個結點指標p的時候,btnode *p;等價於btnode p;
對於定義結點指標,btnode *p;這種寫法是順理成章的
,因為它繼承了之前int *a, char *b;的寫法這些指標定義的一般規律,使我們記憶起來非常方便,不必再加個btnode p;來增加記憶負擔
,因此定義時最好不要用*btnode
,統一乙個btnode解決所有問題
malloc函式用法——c語言
new運算子用法——c++語言
new速度快於malloc()
// 結構體指標的定義方法
typedef struct stu *linklist;
linklist head; // head是乙個指向結構體stu的指標
等價於struct stu *head;
本質:struct stu *
簡寫為linklist
,類似pair
簡寫為pii
有兩種寫法
法1:
btnode bt;
// 製作乙個結點
法2:(最常用)
btnode *bt;
bt =
(btnode *
)malloc
(sizeof
(btnode));
// 此句要熟練記憶
法2』:
int
*p;p =
new element[n]
;delete p;
法2先定義了乙個結點的指標bt,然後用函式malloc()來申請乙個結點的記憶體空間,最後讓指標bt指向這片記憶體空間,這樣就完成了乙個結點的製作,考研中所有型別的結點的記憶體分配都可用函式malloc()來完成,模式固定,方便記憶
leetcode上面的鍊錶都是它事先建立好的,那如果我想自己建立乙個鍊錶,然後再去試驗各種鍊錶操作函式,則可以用如下**模版
#include
#include
#include
using
namespace std;
// 定義鍊錶結點
typedef
struct listnode
} listnode;
// 建立單鏈表(返回頭結點)
listnode *
create_linkedlist
(initializer_list<
int> lst)
// 單鏈表反向輸出(遞迴)
void
printreverse
(listnode *head)
// 刪除單鏈表
void
clear
(listnode *head)
}int
main()
);printreverse
(head)
;clear
(head)
;}
完全二叉樹定義:若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊
堆的定義:堆是乙個完全二叉樹
,每個節點與其子節點位置相對。父節點總是大於或等於子節點,這種情況下被叫作大頂堆,或者父節點總是小於或等於子節點,這種情況下叫作小頂堆。注意,給定父節點的子節點不一定按順序排列
堆(堆像一棵倒過來的樹):是一種經過排序的樹形資料結構,每個結點都有乙個值。通常所說的堆的資料結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是乙個堆。由於堆的這個特性,常用來實現優先佇列
很多學生,學了四年計算機專業,很多程式設計師,做了很長時間的程式設計工作,卻始終都弄不明白演算法的時間複雜度的估算,這是很可悲的一件事。因為弄不清楚,所以也就從不深究自己寫**是否效率低下,是不是可以通過優化讓計算機更加快速高效。
他們通常的藉口是,現在cpu越來越快,根本不用考慮演算法的優劣,實現功能即可,使用者感覺不到演算法好壞造成的快慢。可事實真是這樣嗎?即使cpu短短幾年速度提高了100倍,但乙個本可以是o(n)時間複雜度的演算法,卻寫出了o(n
2n^2
n2)的程式,僅僅因為容易想到,也容易寫。很明顯效率更高的會是o(n)的演算法,即使不提高cpu速度。愚公移山固然可敬,但發明炸藥和推土機,可能更加實在和聰明
——摘自《大話資料結構》
資料結構筆記
程式效率與組織方式有關 圖書館擺書 二分查詢 程式效率與操作有關 迴圈和遞迴 遞迴雖簡單不過耗費大量空間 程式效率與演算法有關 多項式求和 秦九韶要比普通演算法快乙個數量級 測試兩種演算法的 include include include define max 101 define maxl 1e7...
資料結構筆記
一 鄰接矩陣 鄰接矩陣儲存使用2個陣列儲存圖的資訊 1個以為陣列儲存頂點,乙個二維陣列儲存邊的資訊 1 二維陣列中的對角線為0,以為不存在頂點到自身的邊 2 要知道某個點的出度,就是頂點vi在第i行的元素之和,入度就是該頂點所在列的元素之和 3 頂點vi的所有鄰接點就是吧矩陣中第i行元素掃瞄一遍 4...
資料結構筆記
二叉樹的遍歷操作 二叉樹的遍歷是指從根結點出發,按照某種次序 訪問二叉樹中的所有結點,使得每個結點被訪問一 次且僅被訪問一次。抽象操作,可以是對結點進行的各種 處理,這裡簡化為輸出結點的資料。前序遍歷 中序遍歷 後序遍歷 層序遍歷 查詢的基本概念 靜態查詢適用於 查詢集合一經生成,便只對其進行 查詢...