郝斌_数据结构入门笔记
生活随笔
收集整理的這篇文章主要介紹了
郝斌_数据结构入门笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
郝斌《數據結構》筆記
該筆記與視頻課程相同
用者自取,自由分享
《數據結構》書目:嚴蔚敏 吳偉民(偽算法)高一凡(程序實現)***黃國瑜(程序是錯的)數據結構概述定義我們如何把現實中大量而復雜的問題以特定的數據類型和特定的存儲結構保存到主存儲器(內存)中,以及在此基礎上為實現某個功能而執行的相應操作(比附查找,刪除,排序元素),這個相應的操作也叫算法數據結構時專門研究數據存儲的問題數據的存儲包含兩方面:個體的存儲+個體關系的存儲算法是對存儲數據的操作數據結構:個體 + 個體的關系算法 = 對存儲數據的操作算法解題的方法和步驟衡量算法的標準1.時間復雜度大概程序要執行的次數,而非執行的時間2.空間復雜度算法執行過程中大概所占用的最大內存3.難易程度4.健壯性數據結構的地位數據結構是軟件中最核心的課程程序 = 數據的存儲 + 數據的操作 + 可以被計算機執行的語言預備知識 指針指針的重要性:指針式C語言的靈魂定義地址內存單元的編號結構體為什么會出現結構體為了表示復雜的數據,而普通的基本類型變量無法滿足需求什么叫結構體結構體是根據用戶的實際需要自己定義的復合數據類型如何使用結構體兩種方式:struct Student st = {1000, "zhangshan", 20};struct Student * pst = &st;1.st.sid2.pst->sidpst所指向的結構體變量中的sid這個成員 注意事項:1.結構體變量不能加減乘除但可以相互賦值2.普通結構體變量和結構體指針變量作為函數傳參的問題動態內存的分配和釋放模塊一:線性結構[把所有結點都用一條直線穿起來]連續存儲[數組]1.什么叫數組元素類型相同,大小相等2.數組的優缺點:優點存取速度很快缺點插入刪除元素很慢(需要移動其他元素)空間通常是有限制的事先必須知道數組的長度需要大塊連續的內存塊離散存儲[鏈表]定義:n個節點離散分配彼此通過指針相連每個節點只有一個前驅節點,每個節點只有一個后續節點首節點沒有前驅節點,尾節點沒有后續節點專業術語:首節點:第一個有效節點尾節點:最后一個有效節點頭節點:頭節點的數據類型和首節點類型一樣首節點前的那個節點頭節點并不存放有效數據加頭節點的目的主要是為了方便對鏈表的操作頭指針:指向頭節點的指針變量尾指針:指向尾節點的指針變量確定一個鏈表最少需要幾個參數:只需要一個參數:頭指針因為通過頭指針可以推算出鏈表的其他所有信息分類:單鏈表雙鏈表:每一個結點有兩個指針域循環鏈表能通過任何一個節點找到其他所有的結點非循環鏈表算法:遍歷查找清空銷毀求長度排序刪除結點把p所指向的結點的后一個結點刪除偽算法:1.p->pNext = p->pNext->pNext; //會導致內存泄露,C/C++需要手動釋放,該方式找不到被刪除節點的地址,故不能手動釋放2.r = p->pNext;p->pNext = P->pNext->pNext;free(r);插入結點在p所指向的結點后插入q所指向的結點偽算法:1.r = p->pNext; p->pNext = q; q->pNext = r;2.q->pNext = p->pNext; p->pNext = q;算法:狹義的算法時與數據的存儲方式密切相關廣義的算法與數據的存儲方式無關泛型:利用某種技術達到的效果:不同的存儲方式,執行的操作是一樣的鏈表的優缺點:優點空間沒有限制插入刪除元素的速度很快缺點存取速度很慢線性結構的兩種產檢應用之一 棧定義一種可以實現"先進后出"的存儲結構棧類似于箱子分類靜態棧動態棧算法出棧壓棧應用函數調用中斷表達式求值內存分配緩沖處理迷宮線性結構的兩種產檢應用之二 隊列定義:一種可以實現“先進先出”的存儲結構分類:鏈式隊列 ——用鏈表實現靜態隊列 ——用數組實現靜態隊列通常都必須是循環隊列循環隊列的講解:1.靜態隊列為什么必須是循環隊列2.循環隊列需要幾個參數來確定兩個,front和rear3.循環隊列各個參數的含義2個參數不同場合有不同含義建議初學者先記住,然后慢慢體會1).隊列初始化front和rear的值都是零2).隊列非空front代表的是隊列的第一個元素rear代表的是隊列的最后一個有效元素的下一個元素3).隊列空front和rear的值相等,但不一定是零4.循環隊列入隊偽算法講解1).將值存入r所代表的位置2).錯誤的寫法:r = r + 1;正確的寫法:r = (r+1)%(數組的長度);//例如://r = 3,數組長度為6,則r = 4即實現了r"上移"//r = 5,數組長度為6,則r = 0即實現了r"上移"后的循環5.循環隊列出隊偽算法講解1).將front代表的值保存(可不保存)2).front = (front + 1) % (數組長度)6.如何判斷循環隊列是否為空如果front和rear的值相等,則該數列就一定為空7.如何判斷循環隊列是否已滿預備知識:front的值可能比rear大front的值也可能比rear小當然也可能兩者相等兩種方式:1.多增加一個標志參數2.少用一個元素[通常用第二種方式]用C語言偽算法表示就是:if((r+1) % (數組長度) == f)已滿else不滿隊列算法:入隊出隊隊列的具體應用:所有和時間有關的操作都有隊列的影子專題:遞歸定義:一個函數自己直接或間接調用自己嚴書:(函數的調用)通常,當在一個函數的運行期間調用另一個函數時,在運行被調用函數之前,系統需先完成3件事:1)將所有的實參、返回地址等信息傳遞給被調用函數保存2)為被調用函數的局部變量分配儲存區3)將控制轉移到被調函數的入口。而從被調用函數返回調用函數之前,系統也應完成3件工作:1)保存被調函數的計算結果2)釋放被調函數的數據區3)依照被調函數保存的返回地址將控制轉移到調用函數當有多個函數構成嵌套調用時,按照"后調用先返回"的原則,上述函數之間的信息傳遞和控制轉移必須通過"棧"來實現,即系統將整個程序運行時所需的數據空間安排在一個棧中,每當調用一個函數時,就為它在棧頂分配一個存儲區,每當從一個函數退出時,就釋放它的存儲區,則當前正運行的函數的數據區必在棧頂。A函數調用A函數和A哈桑農戶調用B函數在計算機看來是沒有任何區別的,只不過用我們日常的思維方式理解比較怪異而已遞歸滿足三個條件:1.遞歸必須得有一個明確的終止條件2.該函數所處理的數據規模必須在遞減3.這個轉化必須是可解的循環和遞歸(所有的循環都能用遞歸解決,所有的遞歸不一定能用循環解決)遞歸:易于理解速度慢存儲空間大循環:不易理解速度快存儲空間小舉例:1.1+2+3+..+100的和2.求階乘3.漢諾塔偽算法:if(n - 1){1.先把A柱子上的前n-1個盤子從A借助C移到B2.將A柱子上的第n個盤子直接移到C3.再將B柱子上的n-1個盤子借助A移到C}4.走迷宮遞歸的應用:樹和森林就是以遞歸的方式定義的樹和圖的很多算法都是以遞歸來實現的很多數學公式就是以遞歸的方式定義的模塊二:非線性結構樹定義:專業定義:1.有且只有一個稱為根的節點2.有若干個互不相交的子樹,這些子樹本身也是一顆樹通俗定義:1.樹是由節點和邊組成2.每一個節點只有一個父節點但可以有多個子節點3.但有一個節點例外,該節點沒有父節點,此節點稱為根節點專業術語:節點 父節點 子節點子孫 堂兄弟 深度:樹中結點的最大層次從根節點到最底層結點的層數被稱之為深度,根節點是第一層葉子結點:沒有子節點的結點非終端節點:非葉子結點度子節點的個數稱為度樹的分類:一般樹任意一個節點的子節點的個數都不受限制二叉樹任意一個節點的子節點的個數最多是兩個,且子節點的位置不可更改二叉樹的分類:一般二叉樹滿二叉樹在不增加樹的層數的前提下,無法再多添加一個結點的二叉樹完全二叉樹(很重要)如果只是刪除了滿二叉樹最底層最右邊的連續若干個結點,這樣形成的二叉樹就是完全二叉樹滿二叉樹是完全二叉樹的特例,一個不刪森林n個互不相交的樹的集合樹的存儲(我的理解:將樹的邏輯結構保存在計算機內存的物理結構中)樹的存儲二叉樹的存儲連續存儲[完全二叉樹]優點:查找某個結點的父節點和子節點(也包括判斷有沒有子節點)速度快缺點:耗用內存空間過大鏈式存儲一般樹的存儲雙親表示法求父節點方便孩子表示法求子節點方便雙親孩子表示法求父節點和子節點都比較方便二叉樹表示法把一個普通書轉化成二叉樹來存儲具體轉換方法:設法保證任意一個結點的左指針域指向它的第一個孩子右指針域指向它的兄弟只要能滿足此條件,就可以把一個普通樹轉化成二叉樹一個普通樹轉化成的二叉樹一定沒有右子樹森林的存儲先把森林轉化為二叉樹,再存儲二叉樹操作遍歷先序遍歷[先訪問根節點]先訪問根節點再先序訪問左子樹再先序訪問右子樹中序遍歷[中間訪問根節點]中序遍歷左子樹再訪問根節點再中序遍歷右子樹后序遍歷[最后訪問根節點]后序遍歷左子樹后序遍歷右子樹再訪問根節點已知兩種遍歷求原始二叉樹已知一種序列不能夠推出原始二叉樹,已知先序和后序也不能推出原始二叉樹通過先序和中序 或者 中序和后序我們可以還原出原始得到二叉樹換種說法:只有通過先序和中序或通過中序和后序我們才可以唯一的確定一個二叉樹應用樹是數據庫中數據組織一種重要形式操作系統子父進程的關系本身就是一棵樹面向對象語言中類的繼承關系赫夫曼樹圖模塊三:查找和排序折半查找排序:冒泡冒泡升序: void sort(int * a, int n) {int i, j;int t;for(i = 0; i < n-1; i++){for(j = 0; n-i-1; j++){if( a[j] > a[j+1] ){t = a[j];a[j] = a[j+1];a[j+1] = t;}}} }快速排序插入選擇直接選擇排序 void sort(int *a, int len) {int i, j, min, t;for(i = 0; i < len-1; ++i){for(min = i, j = i+1; i < len; ++j){if(a[min] > a[j]){min = j;}}if(min != i){t = a[i];a[i] = a[min];a[min] = t;}} }歸并排序排序和查找的關系排序是查找的前提排序是重點Java中容器和數據結構相關知識Iterator接口Map哈希表再次討論什么是數據結構數據結構研究的是數據的存儲和數據的操作的一門學問數據的存儲分為兩部分:個體的存儲個體關系的存儲從某個角度而言,數據最核心的就是個體關系的存儲個體的存儲可以忽略不計再次討論什么是泛型同一種邏輯結構,無論該邏輯結構物理存儲是什么樣子的我們可以對它執行相同的操作總結
以上是生活随笔為你收集整理的郝斌_数据结构入门笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 幅频特性曲线的绘制(2)
- 下一篇: php跨域处理