學習演算法和刷題的框架思維
阿新 • • 發佈:2022-03-26
短暫記錄下對於《演算法小抄》的學習,因為對於文章的學習遇到瓶頸,決定暫時暫停,對於前面所有文章進行復習
一、資料結構的儲存方式
資料結構的儲存方式只有兩種:陣列(順序儲存)和連結串列(鏈式儲存)
對於問題的分析一定要有遞迴的思想,自頂向下,從抽象到具體 。對於散列表、棧、樹堆等等資料結構其實都屬於【上層建築】,而陣列和連結串列才是【結構基礎 】。對於所有多樣化的資料結構,究其源頭,都是在連結串列和陣列上的特殊操作,只不過存在API不同罷了。
而對於一些上層建築的解釋,不在進行敘述,可以自己去學習演算法和刷題的框架思維 :: labuladong的演算法小抄 (gitee.io)進行檢視。
二、資料結構的基本操作
對於任何資料結構,基本的操作其實就是遍歷+訪問,也就是常說的CRUD(增刪改查)。
資料結構存在的目的就是在不同的應用場景,儘可能高效的增刪改查
資料結構遍歷可分為:線性和非線性
陣列遍歷框架,典型的線性迭代結構:
void traver(int[] arr){
for(int i=0;i<arr.size();i++){
//迭代訪問arr[i]
}
}
連結串列遍歷框架,兼具迭代和遞迴結構:
/*基本的單鏈表節點*/ class ListNode{ int val; ListNode* next; } void traverse(ListNode* head){ for(ListNode* p=head;p!=nullprt;p=p->next){ //迭代訪問p->val } } void traverse(ListNode* head){ //遞迴訪問head->val traverse(head->next); }
二叉樹遍歷框架 ,典型的非線性遞迴遍歷結構:
/*基本的二叉樹節點*/
class TreeNode{
int val;
TreeNode* left,right;
}
void traverse(TreeNode* root){
traverse(root->left);
traverse(root->right);
}
仔細觀察會發現二叉樹的遞迴遍歷和連結串列的遞迴遍歷方式十分相似,二叉樹結構和單鏈表結構也十分相似。
二叉樹框架可以擴充套件為N叉樹的便利框架
/*基本的二叉樹節點*/ class TreeNode{ int val; vector<TreeNode*>children; } void traverse(TreeNode root){ for(TreeNode* child:root->children){ traverse(child); } }
N
叉樹的遍歷又可以擴充套件為圖的遍歷,因為圖就是好幾 N
叉棵樹的結合體。你說圖是可能出現環的?這個很好辦,用個布林陣列 visited
做標記就行了,這裡就不寫程式碼了。