1. 程式人生 > >數據結構學習之一緒論和基本概念

數據結構學習之一緒論和基本概念

源碼 day01 常用 進制數 區域 如果 比較 端午 棧和隊列

結束了常用設計模式的學習,有空的話我會把剩下的幾個模式發布上來,下一步計劃就是關於數據結構方面和源碼的學習,每天給自己安排了計劃,希望自己能如期執行

這一篇文章全部是關於我對數據結構理論的整理和個人見解,參考的是資料是<數據結構(Java語言描述)>,清華大學出版社 的教科書,我不是科班畢業,這本書是我今年端午節在南師大附近淘到的,感覺還不錯

言歸正傳,上正式內容

package com.hola.data.structure;
/**
 * 
 * @author Dougest 2017年7月31日    下午9:57:25
 *
 */
public class Day01 {
    
/******************1.緒論*********************/ /** * 從表面上來看,程序的設計和編寫主要是實現某類數據的處理 * 實質上,更為重要的是考慮如何在計算機中組織這些數據,以支持後續高效的處理過程 * * 程序 = 算法 + 數據結構 * 程序:計算機指令的組合,用來控制計算機的工作流程,完成一定的邏輯功能以及實現某種任務 * 算法:程序的邏輯抽象,解決牟寫客觀問題的策略 * 數據結構:現實世界中的數據以及之間的關系反應 * *利用計算機解決實際的問題,需要完成一個從問題到程序的實現過程: * (1)確定問題求解的數學模型(邏輯結構) * (2)確定存儲結構 * (3)設計算法 * (4)變成並測試結果 * * 由此可見,程序設計的本質在於解決兩個主要的問題: * 1)根據實際問題選擇一種好的數據結構 * 2)設計一個好的算法 * 後者的好壞很大程度上取決於前者 * * * * 問題1: * 假設有N個數,需求找出N個數中從大到小的第k個數 * 思路1: * 解決: * 將這些數字讀入數組,冒泡排序取第k個數字 * 缺點: * 消耗內存 * 思路2: * 解決: * 將N個數的前k個數讀入一個數組,遞減排序 * 將剩下的數字逐個讀入,與數組中的第k個數對比 * 如果->不大於第k個數字則忽略 * 如果->大於就插入數組中合適的位置,這時數組仍然保持有序,數組最後一個數被排除 * 對比結束,數組中第k個數字就是我們想要的數字 * 缺點: * 思路較復雜
*/ /** * 問題2: * 有訂單數據如下描述 * 編號(遞增) 負責人(中文) * 1 張三 * 2 張三 * 3 李四 * 4 李四 * 5 張三 * 6 李四 * 找出屬於張三的所有訂單 * 思路: * 將訂單數據映射到計算機的存儲結構中去 * 思路1: * 將數據順序的存儲到計算機 * 查找從表中第一個訂單到最後一個訂單 * 依次核對"負責人"字段是否為"張三" * 思路2: * 將數據順序存放 * 按"負責人"的姓氏簡歷一張索引表 * 查找時首先查找在索引表中核對姓氏 * 根據索引表中的地址到訂單表中核對姓名 * * 總結: * 思路2比思路1更為高效 * 內存占用/效率
*/ /** * 問題3: * 為小區之間鋪設網絡線路(任意兩個小區之間都可以鋪設) * 可如下鋪設 * * a * * b c * * d e * * a,b,c,d,e互聯共可連10條線路 * * 生成最小樹: * b-a,a-c,a-d,d-e * */ /** * 總結: * 用計算機解決一個問題,總是圍繞著一下3個步驟進行: * 1.抽象出問題中需要處理的數據對象的邏輯結構 * 2.根據問題 完成的功能特性 實現對抽象對象數據結構的存儲結構表述 * 3.確定為求解問題而需要進行的 操作 或者 運算 * * --------------------------------------- * | 方面 | | | * |過程 | 數據表示 | 數據處理 | * |---------------------------------------| * |抽象 | 邏輯結構 | 基本運算 | * |---------------------------------------| * |評價 |不同數據結構的比較和算法性能的分析 | * ----------------------------------------- */ /**********************************2.基本概念和術語*************************************************/ /** * 數據(Data): * 數據是信息的載體,是對客觀存在的事物的符號表示,他能夠被計算機程序識別/存儲/加工/處理 * *數據是所有能夠有效的輸入到計算機中並且能夠被計算機處理的符號總稱 * *也是計算機程序處理對象的集合,是計算機程序加工的"原材料" * 如: * 一個編譯程序或者文字處理程序的對象就是字符串 * 數據還包括圖像,聲音等非數值數據 * * 數據元素(Data Element): * *數據中的一個"個體",是數據的基本組織單位 * 在計算機程序中一般將他作為一個整體進行考慮和處理 * 不同條件下數據元素又可以稱為 結點/頂點/記錄 * * 數據項(Data Item) * *數據項是數據元素的組成部分,是有獨立含義的標識單位,也是數據元素的組織單位 * 數據項一般分為兩種 * 1.簡單數據項 如:姓名/性別等 * 2.組合數據項 如:出生如期 可進一步分為: 年/月/日/時/分/秒 * * 數據對象: * 性質相同的數據元素的集合 * 一般來說,數據對象中的數據元素是不會孤立的,而是彼此相關,這種彼此之間的關系叫做"結構" * * 數據結構: * 相互之間存在一種或者多種特定關系的數據元素的集合 * 對於數據結構的理解都離不開對數據的邏輯結構,數據的存儲結構,數據的操作3個方面 * * 1)邏輯結構: * 指各個數據元素之間的邏輯關系,是呈現在用戶面前的,能感知帶的數據元素的組織形式 * 按照數據元素之間的邏輯關系的特性來分,可以將數據結構歸納為以下4類: * * (1)集合結構: * 數據元素之間除了"*同屬於一個集合"的特性以外,無其他關系,他們的關系是松散的 * (2)線性結構: * 數據元素之間存在"*一對一"的關系 * 即:若結構非空,則他有一個且只有一個開始結點和終端結點 * 開始結點沒有前驅但是有一個後繼 * 終端沒有後繼但是有前驅 * 其他結點只有一個前驅和一個後繼 * (3)樹形結構: * 數據元素之間存在"*一對多"的關系 * 即:若結構非空,則他有一個稱為"根"的結點,此結點無前驅結點 * 其余結點僅僅有一個前驅結點但是有若幹個後繼結點 * (4)圖形結構: * 數據元素之間存在"*多對多"的關系 * 即:若結構非空,則在這種數據結構中任何結點都可以有多個前驅和後繼 * * 有時也將邏輯結構分為兩大類: * 線性結構: 線性 * 非線性節後: 樹/圖/集合 * * 數據結構的表現可以通過一個二元組來定義,定義形式為: * Data_Structure = (D,R) * 其中,D是數據元素的有限集,R是D上關系的有限集 * R中的關系描述了D中數據元素之間的邏輯關系,也叫數據元素之間的關聯方式(或者鄰接方式) * * 設R1 ∈ R ,則 R1是一個D*D的關系子集 * 若a1,a2∈ D,<a1,a2>∈ R1,則稱a1是a2的前驅,a2是a1的後繼,對R1而言,a1,a2是相鄰的結點 * 沒有前驅的結點就是開始結點(根結點),沒有後繼的結點就是終端結點(葉子結點) * * 例: * B = (D,R),其中D={a1,a2,...,a9} * R = {<a1,a2>,<a1,a3>,<a3,a4>,<a3,a6>,<a4,a5>,<a6,a8>,<a6,a7>,<a7,a9>} * 結構如下 * a1 * / * a2 a3 * / * a6 a4 * /\ * a7 a8 a5 * * a9 * * 例: * 矩陣如下: * * | a1 a2 a3 | * | a4 a5 a6 | * | a7 a8 a9 | * * 他們9個元素之間存在兩種關系,一種是行關系,一種是列關系 * 用二元組表達他們的邏輯結構 * B = (D,R) * 其中: * D = {a1,a2,...,a9} * ROW = {<a1,a2>,<a2,a3>,<a4,a5>,<a5,a6>,<a7,a8>,<a8,a9>} * COL = {<a1,14>,<a2,a5>,<a3,a6>,<a4,a7>,<a5,a8>,<a6,a9>} * * 數據的邏輯結構是從數據元素之間的邏輯關系來觀察數據,他與數據的存儲無關,是獨立於計算機之外的 * * 2)存儲結構 * 數據的存儲結構(物理結構)是數據的邏輯結構在計算機中的實現,是依賴計算機的,他包括數據元素值的表示 * 和邏輯關系的表示兩部分組成 * 計算機最小數據表示單位是二進制數的一位(bit),*通常用一個由若幹位組合起來的位串來表示一個數據元素 * 當數據元素由若幹個數據項組成時,位串中對應於各個數據項的子位串成為數據域 * 所以數據元素值在數據域中是以二進制的存儲形式表示 * 而數據元素之間的邏輯關系的存儲表示通常以以下4種形式: * (1)順序存儲方式: * 將所有的數據元素存放在一片連續的存儲空間中,*使用邏輯上相鄰的數據元素其對應的物理位置也相鄰 * 即數據元素的邏輯位置關系與物理位置關系保持一致 * 實現形式 ===> 數組 * (2)鏈式存儲方式: * 不要求將邏輯上相鄰的數據元素存儲在物理相鄰的位置,即*數據元素可以存儲在任意的物理位置上 * 每一個數據元素對應的存儲表示由兩部分組成,一部分存放數據元素值本身,另外一部分存放表示邏輯關系 * 的指針 * 即數據元素之間的邏輯關系是由附加的指針來表示的 * (3)索引存儲方式: * 在存儲元素時添加了一個索引表 * 索引表中每一項包括關鍵字和地址 * 其中,關鍵字是能夠唯一標識一個數據元素的數據項 * 地址是指數據元素的存儲地址或者存儲區域的首地址 * 案例如上問題2訂單表 * (4)散列存儲方式: * 也稱為哈希存儲, * 將數據元素存儲在一片連續的區域內,每一個元素的具體存儲地址是根據該數據元素的關鍵字值 * 通過散列(哈希)函數直接計算出來的 * * 以上4種存儲方式中,順序存儲和鏈式存儲是最基本的,最常用的兩種方式 * 索引和散列是為了提高查找效率而常常采用的兩種存儲方式 * * 3)數據的操作: * 對數據進行某種方法的處理,也稱數據的運算 * 數據的操作也被認定為是定義在數據邏輯結構上的操作,但是操作的實現卻要考慮數據的存儲結構 * 創建 * 銷毀 * 插入 * 刪除 * 查找 * 修改 * 遍歷 * * 總結: * 順序表和單鏈表具有相同的邏輯結構,但是存儲結構不同,所以賦予不同的數據結構名 * 線性表,棧和隊列具有相同的數據結構和存儲結構,但是由於插入和刪除操作允許位置不同而分類 * =>限制在表的一端進行的成為棧 * =>插入在表的一端,刪除在表的另外一端成為隊列 * */ /**********************************3.數據類型 略*************************************************/ }

數據結構學習之一緒論和基本概念