日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构自学笔记(郝斌)

發布時間:2023/12/31 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构自学笔记(郝斌) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據結構概述(教材選用嚴蔚敏、吳偉民,該書程序是偽算法
具體的程序是高一凡,西電的,大牛,只有
程序。還有一本書,臺灣的黃國瑜自己寫的
只有思路,程序是另外一個合作的清華的寫
的,可惜很多錯的。)
學完數據結構之后會對面向過程的函數有一個更深的了解

定義
我們如何把現實中大量而復雜的問題以特定的數據類型(單
個數據怎樣存儲?)和特定的存儲結構(個體的關系)
保存到主存儲器(內存)中,以及在此基礎上為實現某個功能
(比如查找某個元素,刪除某個元素,對所有元素進行排序)
而執行的相應操作,這個相應的操作也叫算法。(比如班里有
15個人,其信息量也許一個數組就搞定了,但是假如10000個,
怎么辦?內存也許沒有這么多連續的空間,所以我們改用鏈表,
you see這就是與存儲有關系。又比如,人事管理系統的信息存儲,
因為存在著上下級的關系,所以數組和鏈表就無能為力了,
這時候我們用樹,再比如我們做的是交通圖,站和站之間肯定要連通,這
時候以上的存儲方式又無能為力了,所以我們又有了圖。圖
就是每個結點都可以和其他結點產生聯系。所以當我們要解決
問題時,首先要解決的是如何把這些問題轉換成數據,先保存
到我們的主存中,)

數據結構 = 個體的存儲 + 個體的關系的存儲算法 = 對存儲數據的操作

算法
解題的方法和步驟

衡量算法的標準1、時間復雜度大概程序要執行的次數,而非執行的時間。2、空間復雜度算法執行過程中大概所占用的最大內存3、難易程度(主要是應用方面看重)4、健壯性(不能別人給一個非法的輸入就掛掉)數據結構的地位數據結構是軟件中最核心的課程程序 = 數據的存儲+數據的操作+可以被計算機執行的語言(已經提供)

(學完數據結構,想用一種語言去實現它,必須有指針,數據結構java
版,就胡扯,變味,因為我們要講鏈表,就是通過指針鏈在一起的。比如
在java中A aa = new A();本質上,aa是個地址)
預備知識
指針
指針的重要性:(內存是可以被CPU直接訪問的,硬盤不行
主要靠地址總線,數據總線,控制總線。)
指針是C語言的靈魂
定義
地址
地址就是內存單元的編號
從0開始的非負整數
范圍:0–FFFFFFFF[0-4G-1](地址線是32位,剛好控制2的32次)
指針:
指針就是地址 地址就是指針
指針變量是存放內存單元地址的變量
指針的本質是一個操作受限的非負整數(不能加乘除,只能減)
分類:
1、基本類型的指針

2、指針和數組的關系結構體(C++中用類也能實現)為什么會出現結構體為了表示一些復雜的數據,而普通的基本類型變量無法滿足要求什么叫結構體結構體是用戶根據實際需要自己定義的復合數據類型如何使用結構體兩種方式:struct Student st = {1000, "zhangsan", 20}struct Student * pst = &st;1.st.sid2.pst->sidpst所指向的結構體變量中的sid這個成員注意事項:結構體變量不能加減乘除,但可以相互賦值普通結構體變量和結構體指針變量作為函數參數的傳遞

(病毒就是靠訪問正在運行的那些程序所占用的內存。Java中規定局部
變量必須初始化,因為這些變量一開始都是垃圾值,但是屬性不是必須
初始化的,因為已經默認初始化為0)
動態內存分配和釋放(動態分配的內存一定要手動釋放,否則造成內存
泄露。)
(java中A aa = new A();其實就是 A *p = (A *)malloc(sizeof(A)))

模塊一:線性結構【把所有的結點用一根直線穿起來】
連續存儲【數組】
1、什么叫做數組
元素類型相同,大小相等(數組傳參,只要傳進去首地址和長度就行)
2、數組的優缺點:
優點:
存取速度快
缺點:
事先必須知道數組的長度
插入刪除元素很慢
空間通常是有限制的
需要大塊連續的內存塊
插入刪除元素的效率很低

離散存儲【鏈表】(我們搞底層的開發,類似于SUN公司的類)定義:n個節點離散分配彼此通過指針相連每個節點只有一個前驅節點,每個節點只有一個后續節點首節點沒有前驅節點,尾節點沒有后續節點。專業術語:首節點:第一個有效節點尾節點:最后一個有效節點頭節點:頭結點的數據類型和首節點的類型一樣沒有存放有效數據,最最前面的,是在首節點之前的,主要是為了方便對鏈表的操作。頭指針:(指向頭)指向頭節點的指針變量尾指針:指向尾節點的指針

(頭結點有可能很大,占的內存可能大,假設我想造一個函數
輸出所有鏈表的值,那你如果不用頭指針類型做形參,那由于
不同鏈表的頭節點不一樣大小,這樣就沒辦法找出形參)

確定一個鏈表需要幾個參數:(或者說如果期望一個函數對鏈表進行操作我們至少需要接收鏈表的那些信息???)只需要一個參數:頭指針,因為通過它我們可以推出鏈表的所有信息。

(鏈表的程序最好一定要自己敲出來)
分類:
單鏈表
雙鏈表:
每一個節點有兩個指針域

循環鏈表能通過任何一個節點找到其他所有的節點非循環鏈表

(java中變成垃圾內存則會自動釋放,但是C和C++則不會,所以要
手動釋放,否則會引起內存泄露。delete等于free)
算法:
遍歷
查找
清空
銷毀
求長度
排序
刪除節點
插入節點
算法:狹義的算法是與數據的存儲方式密切相關
廣義的算法是與數據的存儲方式無關
泛型:(給你一種假象,只不過牛人從內部都弄好了)
利用某種技術達到的效果就是:不同的存儲方式,執行的操作是一樣的

算法的真正學法:很多算法你根本解決不了!!!!!!因為很多都屬于
數學上的東西,所以我們把答案找出來,如果能看懂就
行,但是大部分人又看不懂,分三步,按照流程,語句,
試數。這個過程肯定會不斷地出錯,所以不斷出錯,不斷
改錯,這樣反復敲很多次,才能有個提高。實在看不懂
就先背會。

鏈表的優缺點:優點:空間沒有限制插入刪除元素很快缺點:存取速度很慢。線性結構的兩種常見應用之一 棧 (存儲數據的結構)定義一種可以實現“先進后出” 的存儲結構棧類似于箱子分類靜態棧 (類似于用數組實現)動態棧 (類似于用鏈表實現)算法(往里放,從里取)出棧壓棧(參看Java中線程的例子,成產消費的例子)應用函數調用中斷表達式求值(用兩個棧,一個存放數字,一個存放符號)內存分配緩沖處理迷宮線性結構的兩種常見應用之二 隊列定義:一種可是實現“先進先出”的存儲結構分類:鏈式隊列:用鏈表實現靜態隊列:用數組實現靜態對流通常都必須是循環隊列,為了減少內存浪費。循環隊列的講解:1、 靜態隊列為什么必須是循環隊列2、 循環隊列需要幾個參數來確定 及其含義需要2個參數來確定frontrear3、 循環隊列各個參數的含義2個參數不同場合不同的含義? 建議初學者先記住,然后慢慢體會1)隊列初始化front和rear的值都是零2)隊列非空front代表隊列的第一個元素rear代表了最后一個有效元素的下一個元素3)隊列空front和rear的值相等,但是不一定是零4、 循環隊列入隊偽算法講解兩步完成:1)將值存入r所代表的位置2)將r后移,正確寫法是 rear = (rear+1)%數組長度錯誤寫法:rear=rear+1;5、 循環隊列出隊偽算法講解front = (front+1) % 數組長度6、 如何判斷循環隊列是否為空如果front與rear的值相等,則隊列一定為空7、 如何判斷循環隊列是否已滿預備知識:front的值和rear的值沒有規律,即可以大,小,等。兩種方式:1、多增加一個表標識的參數2、少用一個隊列中的元素(才一個,不影響的)通常使用第二種方法如果r和f的值緊挨著,則隊列已滿用C語言偽算法表示就是:if( (r+1)%數組長度 == f )已滿else不滿隊列算法:入隊出隊隊列的具體應用:所有和事件有關的操作都有隊列的影子。(例如操作系統認為先進來的先處理)專題:遞歸【這對你的編碼能力是個質的飛躍,如果你想成為一個很厲害的 程序員,數據結構是必須要掌握的,因為計算機專業的本科生也達不到這水 平!計算機特別適合用遞歸的思想來解決問題,但是我們人類用遞歸的思想 來考慮問題就會感到十分困擾,這也是很多學過遞歸的人一直都搞不明白的 地方!那是不是遞歸可以隨便寫,當然不是,有些同學一用遞歸程序就死翹 翹了。遞歸的思想是軟件思想的基本思想之一,在樹和圖論上面,幾乎全是 用遞歸來實現的,最簡單,像求階乘這種沒有明確執行次數的問題,都是用 遞歸來解決】定義:一個函數自己直接或間接調用自己(一個函數調用另外一個函數和他調用自己是一模一樣的,都是那三步,只不過在人看來有點詭異。)遞歸滿足的三個條件:1、遞歸必須得有一個明確的終止條件2、該函數處理的數據規模必須在遞減3、這個轉化必須是可解的。循環和遞歸:理論上循環能解決的,肯定可以轉化為遞歸,但是這個過程是復雜的數學轉化過程,遞歸能解決不一定能轉化為循環,我們初學者只要把經典的遞歸算法看懂就行,至于有沒有能力運用看個人。 遞歸:易于理解速度慢存儲空間大循環不易于理解速度快存儲空間小舉例: 1.求階乘2.1+2+3+4+。。。+100的和3.漢諾塔【漢諾塔】這不是線性遞歸,這是非線性遞歸!n=1 1n=2 3n=3 7..................n=64 2的64次方減1【這是個天文數字,就算世界上最快的計算機也解決不了,漢諾塔的負責度是2的n次方減1】問題很復雜,但真正解決問題的編碼只有三句。4.走迷宮(CS的實現)遞歸的運用:樹和森林就是以遞歸的方式定義的樹和圖的很多算法都是以遞歸來實現的很多數學公式就是以遞歸的方式定義的斐波拉契序列1 2 3 5 8 13 21 34。。。

為何數據結構難學:因為計算機內存是線性一維的,而我們要處理的數據
都是比較復雜的,那么怎么把這么多復雜的數據保存在計算機中來保存本
身就是一個難題,而計算機在保存線性結構的時候比較好理解,尤其是數
組和鏈表只不過是連續和離散的問題,線性結構是我們學習的重點,因為
線性算法比較成熟,無論C++還是Java中都有相關的工具例如Arraylist.
Linkedlist,但是在Java中沒有樹和圖,因為非線性結構太復雜了,他的
操作遠遠大于線性結構的操作。即使SUN公司也沒造出來。
小復習一下:_
邏輯結構:(就是在你大腦里面能產生的,不考慮在計算機中存儲)
線性(用一根直線穿)
在計算機中存儲用:
數組
鏈表
棧和隊列是一種特殊的線性結構,是具體應用。
(操作受限的線性結構,不受限的應該是在任何地方可以增刪改查
可以用數組和鏈表實現。只要把鏈表學會,棧和隊列都能搞定,數
組稍微復雜一些。)
非線性:


物理結構:
數組
鏈表

模塊二:非線性結構(現在人類還沒有造出一個容器,能把樹和圖
都裝進去的,因為他們確實是太復雜了)
(都要靠鏈表去實現)

樹定義
專業定義:
1、有且只有一個稱為根的節點
2、有若干個互不相交的子樹,這些子樹本身也是一棵樹

通俗定義:1、樹是由節點和邊組成2、每個節點只有一個父節點但可以有多個子節點3、但有一個節點例外,該節點沒有根節點,此節點稱為根節點專業術語節點 父節點 子節點子孫 堂兄弟 深度:從根節點到最底層節點的層數稱之為深度根節點是第一層葉子節點;(葉子就不能劈叉了)沒有子節點的節點非終端節點:實際就是非葉子節點。根節點既可以是葉子也可以是非葉子節點度:子節點的個數稱為度。(一棵樹看最大的) 樹分類:一般樹任意一個節點的子節點的個數都不受限制二叉樹(有序樹)任意一個節點的子節點的個數最多兩個,且子節點的位置不可更改。分類:一般二叉樹滿二叉樹在不增加樹的層數的前提下。無法再多添加一個節點的二叉樹就是滿二叉樹。完全二叉樹如果只是刪除了滿二叉樹最底層最右邊的連續若干個節點,這樣形成的二叉樹就是完全二叉樹。森林n個互不相交的樹的集合

一般的二叉樹要以數組的方式存儲,要先轉化成完全二叉樹,因為如果你
只存有效節點(無論先序,中序,后序),則無法知道這個樹的組成方式
是什么樣子的。

樹的存儲(都是轉化成二叉樹來存儲)二叉樹的存儲連續存儲【完全二叉樹】優點:查找某個節點的父節點和子節點(也包括判斷有咩有)速度很快缺點:耗用內存空間過大鏈式存儲一般樹的存儲雙親表示法求父節點方便孩子表示法求子節點方便雙親孩子表示法求父節點和子節點都很方便二叉樹表示法把一個普通樹轉化成二叉樹來存儲具體轉換方法:設法保證任意一個節點的左指針域指向它的第一個孩子有指針域指向它的下一個兄弟只要能滿足此條件,就可以把一個普通樹轉化成二叉樹一個普通樹轉化成的二叉樹一定沒有右子樹森林的存儲先把森林轉化為二叉樹,再存儲二叉樹,具體方式為:根節點之間可以當成是兄弟來看待二叉樹操作遍歷先序遍歷【先訪問根節點】先訪問根節點再先序訪問左子樹再先序訪問右子樹中序遍歷【中間訪問根節點】中序遍歷左子樹再訪問根節點再中序遍歷右子樹后序遍歷【最后訪問根節點】先后序遍歷左子樹再后序遍歷右子樹再訪問根節點已知兩種遍歷序列求原始二叉樹 通過先序和中序 或者 中序和后續我們可以還原出原始的二叉樹但是通過先序和后續是無法還原出原始的二叉樹的換種說法:只有通過先序和中序, 或通過中序和后序我們才可以唯一的確定一個二叉樹 應用樹是數據庫中數據組織的一種重要形式(例如圖書館的圖書分類一層一層往下分。)操作系統子父進程的關系本身就是一棵樹面向對象語言中類的繼承關系本身就是一棵樹赫夫曼樹(樹的一個特例)圖

模塊三:查找和排序
折半查找

排序:冒泡插入選擇快速排序歸并排序排序和查找的關系排序是查找的前提排序是重點

Java中容器和數據結構相關知識
Iterator接口
Map
哈希表(與Java關系比較大)

再次討論什么是數據結構:
數據結構研究是數據結構的存儲和數據的操作的一門學問
數據的存儲分為兩部分:
個體的存儲
個體關系的存儲
從某個角度而言,數據的存儲最核心的就是個體關系
的存儲,個體的存儲可以忽略不計。

再次討論到底什么是泛型:
同一種邏輯結構,無論該邏輯結構物理存儲是什么樣子的
我們都可以對它執行相同的操作(例如都是線性結構或者
用數組實現的樹和用鏈表實現的樹。利用重載技術。)

總結

以上是生活随笔為你收集整理的数据结构自学笔记(郝斌)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。