數據結構與算法

1、數據結構研究的內容:算法

1 邏輯結構:數據庫

  a、線性結構:結構中的數據元素之間存在着一對一的線性關係;數組

      b、樹型結構:數據元素之間存在着一對多的層次關係;數據結構

      c、圖狀結構:數據元素之間存在着多對多的任意關係。函數

2 數據結構的延伸及基本算法:操作系統

   a、串:字符串的簡稱;設計

   b、數組:數組是一種數據類型,它是一種順序存儲結構;指針

   c、查找:數據結構要跟算法結合起來纔有意義,查找算法是數據結構在算法中的應用,在現實生活中也常常用到查找;調試

3 存儲結構:對象

   存儲結構(物理結構)是邏輯結構在計算機中的存儲映像,是邏輯結構在計算機中的實現(存儲表示),他包含數據元素的表示和關係的表示。

   邏輯結構與存儲結構的關係爲:存儲結構式邏輯結構的映像與元素自己的映像。邏輯結構是抽象,存儲結構是實現,二者綜合起來創建了數據元素之間的結構關係。

   存儲結構通常有順序存儲和鏈表存儲兩種方式。

4 運算集合:

   討論數據結構是爲了在計算機中實現所需的操做,施加於數據元素之上的一組操做構成了數據的運算集合,所以與運算集合是數據結構很重要的組成部分。

2、數據結構的基本概念:

一、數據

    數據是描述客觀事物的數值、以及全部其餘能輸入到計算機中,且能被計算機處理的各類符號的集合。簡言之,數據就是存儲在計算機中的信息。

二、數據元素與數據項

     數據元素是組成數據的基本單位,是數據集合的個體,在計算機中一般做爲一個總體進行考慮和處理。一個數據元素可由一個或多個數據項組成,數據項是有獨立含義的最小單位(不可再分割)。如每個學生的信息是一個數據項,它包含的學號、姓名等多個數據項。

三、數據對象

    數據對象是性質相同的數據元素的集合,是數據的一個子集。例如:整數數據對象是集合N={0,1,2,...},字母字符數據對象是集合C={'A','B','C',...,'Z'}。

四、數據類型

    數據類型是一組性質相同的值集合以及定義在這個值集合上的一組操做的總稱。值集合肯定了該類型的取值範圍,操做集合肯定了該類型中容許使用的一組運算。

五、抽象數據類型

    抽象數據類型是指基於一類邏輯關係的數據類型。抽象數據類型的定義取決於客觀存在的一組邏輯特性,而與其在計算機內如何表示和實現無關。

3、算法及其描述

一、算法的概念和特性

    a、有窮性:一個算法在執行若干個步驟以後應該可以結束,並且每一步都在有限時間內完成;

    b、肯定性:算法中的每一步都必須有確切的含義,不能產生二義性;

    c、可行性:算法中的每個步驟都應該能有效地執行,並獲得肯定的結果;

    d、輸入:指算法執行時從外界取得的必要數據。一個算法能夠有零個或多個輸入。

    e、輸出:一個算法有一個或多個輸出,輸出時算法進行數據處理後的結果。沒有輸出的算法是毫無心義的。

二、算法設計的要求

    a、正確性:算法對於一切合法的輸入數據都可以獲得知足要求的結果;

    b、可讀性:算法的可讀性是指人對算法閱讀理解的難易程度,可讀性高的算法便於交流,有利於算法的調試和修改;

    c、健壯性:對於非法的輸入數據,算法能給出相應的響應而不是產生不可預料的後果;

    d、效率與低存儲量需求:效率指的是算法的執行時間。對於解決同一問題的多個算法,執行時間短的算法效率高。存儲量需求指算法執行過程當中所須要的最大存儲空間。存儲量需求越小的算法效率越高。

三、算法的分析

    a、算法的時間複雜度:一個算法的執行時間大體上等於全部語句執行時間的總和。

    b、算法的空間複雜度:採用空間複雜度做爲算法所需存儲空間的量度。

4、線性表

一、定義:線性表示一個含有n個節點的有限序列,表示爲:(a1,a2,a3...,an);

二、特徵:線性表具備均勻性和有序性兩大特色:對於均勻性,同一線性表的各個數據元素一定具備相同的數據類型和長度;而有序性體如今各個數據元素在線性表中的位置只取決於他們的序號,數據元素之間的相對位置是線性的。

一個非空線性表有如下幾個特徵:

             a、有且僅有一個開始結點a1,沒有直接前趨,並且僅有一個直接後繼a2;

             b、有切僅有一個終端結點an,沒有直接後繼,並且僅有一個直接前趨an-1;  

             c、其他的內部結點都有切僅有一個直接前趨和一個直接後繼。

三、基本運算

    a、求表長:線性表中的元素個數;

    b、遍歷:從左到右(或反向)掃描(讀取)表中的各元素;

    c、按編號查找:找出表中的第i個元素;

    d、按特徵查找:按某個特定值查找線性表;

    e、插入:在第i個位置上(原第i個元素前)插入一新元素;

    f、刪除:刪除原表中的第i個元素;

    g、排序:按元素某特徵值的遞增(遞減)排序,重排表中各元素。

5、棧和隊列

    棧和隊列都是特殊形式的線性表。

一、棧:棧是一種特殊的線性表,且僅在表的一端容許插入和刪除,這就是棧的概念。容許插入的一端叫棧頂,另外一端叫棧底,將元素插入棧頂的操做稱爲」進棧「,稱刪除棧頂元素的操做叫」出棧「。棧也被稱爲一種後進先出表(LIFO)。能夠類比考生交試卷,後交的試卷老師會優先批閱;

     棧的基本運算:

     a、棧初始化:置棧爲空棧;

     b、判斷是否爲空:若棧爲空,則返回true,不然返回false;

     c、求棧的長度:返回棧的元素個數;

     d、進棧:將一個元素下推動棧;

     c、出棧:將棧頂的元素托出棧;

     e、讀棧頂:返回棧頂元素。

二、隊列:與棧同樣,隊列也是一種特殊的線性表,它僅容許在隊首出隊運算,在隊尾進行入隊操做,由於出隊時先入隊的元素先出,因此隊列又被稱爲是一種「先進先出」表,簡稱爲FIFO(First IN First Out)。

      隊列的基本運算:

      a、隊列初始化:置隊列爲空隊;

      b、判斷隊列是否爲空:若隊列爲空,則返回true,反之返回false;

      c、求隊列的長度:返回隊列的元素個數;

      d、讀隊首:返回隊列元素之值;

      e、入隊:將一個元素插入隊尾;

      f、出隊:將隊首元素從隊列中刪除。

6、樹

  樹型結構的數據元素之間呈現分支、分層的特色。樹型結構在客觀世界中普遍存在,如家族的家譜,各類社會組織結構均可以用樹形象地表示。在計算機領域中,操做系統中的目錄樹,數據庫中信息的組織形式也用到樹型結構。

一、樹的基本概念:

    樹由n個結點構成的有限集合T,當n=0時T爲空樹,不然在任一非空樹T中都具有如下兩個特色:

    a、有且僅有一個特定的結點,它沒有前驅結點,稱其爲跟結點(root結點);

    b、剩下的結點可分爲m個互不相交的子集T1,T2,...Tm,其中每一個子集自己又是一顆樹,並稱其爲跟的字樹;

二、樹的表示方法:

    a、直觀表示法:樹形;

    b、嵌套集合(文氏圖)表示法:如圖6.3(a)所示;

    c、凹入(鎖進)表示法:如圖6.3(b)所示;

    d、廣義表(嵌套括號)表示法:如圖6.3(c)所示。

  

三、樹的經常使用術語:

   a、結點:A、B、C、D等;

   b、結點的度:結點的度指一個結點擁有的字樹個數(A的度爲3,C的度爲1);

   c、樹的度:樹中結點的最大度樹。

   d、葉子:度爲零的結點稱爲葉子(E、F、K、L、H、I、J);

   e、分支結點:度不爲零的結點,通常除了葉子結點外,其餘都是分支結點;

   f、孩子和雙親:結點的子樹稱爲該結點的孩子,相應地,該結點稱爲孩子的雙親。

   g、兄弟:同一個雙親的孩子之間互稱爲兄弟。

   h、祖先和子孫:結點的祖先是指從根到該結點所經分支上的全部結點。相應地,以某一結點爲根的子樹中的任一結點稱爲該結點的子孫。

   i、結點的層次:結點的層次從根開始定義,跟結點的層次爲1,其海次結點的層次爲2,以此類推,任意結點的層次爲雙親結點層次加1。

   j、堂兄弟:雙親在同一層的結點互爲堂兄弟。

   k、樹的深度:樹中結點的最大層次稱爲樹的深度。6.2(b)所示的樹的深度爲4。

   l、有序樹和無序樹:將樹中每一個結點的各子樹當作是從左到右有次序的,則稱該樹爲有序樹,不然爲無序樹;

   m、森林:森林是m顆互不相交的樹的有限集合。對樹中每一個結點而言,其子樹的集合即爲森林;反之,若給森林中的每顆樹的跟結點都賦予同一個雙親結點,便獲得一顆樹。

四、樹的基本操做:

   a、初始化:將樹T初始化爲一顆樹;

   b、判斷樹空:判斷一顆樹是否爲空,爲空返回true,不然返回false;

   c、求根結點:返回樹的根結點;

   d、求雙親結點:返回x的雙親結點,若是x爲根結點,返回空;

   e、求孩子結點:求結點x的第i各孩子結點,若結點x是葉子結點,活着無第i各孩子結點,則返回空;

   f、插入子樹:將根爲y的子樹置爲樹T中結點x的第i顆子樹;

   g、刪除子樹:刪除樹T中結點x的第i顆子樹;

   h、遍歷樹:從根結點開始,按照必定的次序訪問樹中的全部結點;

五、樹的存儲結構

   爲了要存儲樹中各結點自己的數據信息,還要能惟一地反映樹中各結點之間的邏輯關係。經常使用的數組存儲樹的方式:雙親(數組)表示法。

   雙親(數組)表示法是樹的一種順序存儲結構,這種表示法用一維數組來存儲樹的相關信息,將樹中的結點按照從上到下、從左到右的順序存放在一個一維數組中,每一個數組元素中存放一個結點的信息,包含該結點自己的信息和該結點雙親的位置信息,即雙親的下標值。

   a、二叉樹:n個結點的有限集合,它或者是空寂,或者由一個根結點和兩顆分別爲左子樹和右子樹的互不相交的二叉樹組成;

       其特色是每一個結點至多有兩顆子樹(度<=2),二叉樹的子樹有左右之分,次數不能顛倒。

       二叉樹的基本操做:初始化、判斷二叉樹是否爲空、求根結點、求雙親結點、求二叉樹的高度、求結點的左孩子、求結點的右孩子、遍歷二叉樹;

       二叉樹的存儲結構:可用一維數組實現,即將徹底二叉樹上編號爲i的結點元素存儲在一位數組下標爲i的元素中。

       二叉樹的遍歷:先跟次數(前序、先序)遍歷【DLR】,中跟次序(中序)遍歷【LDR】和後跟次序(後序)遍歷【LRD】。

  c、二叉樹應用---哈夫曼樹:

      哈夫曼樹又稱爲最優二叉樹,是一類帶權路徑長度最短的二叉樹。

      相關算法的效率不只取決於元素在二叉樹中的位置,還與元素的訪問頻率有關。若能使訪問頻率高的元素右較少的比較次數,則可提升算法的效率,這正是哈夫曼樹要解決的問題。

      幾個基本概念:

      一、路徑:樹中一個結點到另外一個結點之間的分支構成的兩個結點的路徑。並非樹中全部結點都有路徑,如兄弟結點之間就沒有路徑,但從根結點到任意一個結點之間都有一條路徑;

      二、路徑長度:路徑上的分支數目稱爲兩結點之間的路徑長度;

      三、樹的路徑長度:從根結點到樹中每一結點的路徑長度之和;

      四、結點的權:給樹中結點賦予了一個有某種意義的數,稱爲該結點的權;

      五、結點的帶權路徑長度:從該結點到樹根之間的路徑長度與結點上權的乘積;

      六、樹的帶權路徑長度:樹中全部葉子結點的帶權路徑長度之和;

      七、哈夫曼樹(最優二叉樹):在權爲w1,w2,...,wn的n個葉子結點的全部二叉樹中,帶權路徑長度WPL最小的二叉樹稱爲最優二叉樹或哈夫曼樹;

7、查找

     查找算法:順序查找,折半查找,分塊查找,二叉樹排序樹查找,哈希表查找。

     一、順序查找算法:時間複查度爲O(n);

     二、折半查找算法:也叫二分查找。最大特色:被查找表是一個有序的表,程序每次均可以排除一半不符合條件的數據。時間複雜度:O(log2n),折半查找的效率比順序查找高不少;

     三、分塊查找算法:又稱索引順序查找,是介於順序查找和折半查找之間的一種折中的查找方法,它不要求表中全部記錄有序,但要求表中記錄分塊有序,基本思想是:首先從查找索引表,索引表是有序表,可採用二分查找或順序查找,以肯定待查的結點在哪一塊,而後在已肯定的塊中進行順序查找,因爲塊內無序因此只能用順序查找。分塊查找的效率介於順序查找和折半查找之間。

     四、哈希表的查找:哈希表查找是經過在數據與其內存地址之間創建的關係進行查找的方法。哈希函數是指將數據和物理地址之間創建的對應關係,利用這樣的函數可以使查找次數大大減小,提升查找效率。

         構造哈希函數原則:a、函數自己計算簡單;b、對關鍵字集合中的任意一個關鍵字k,H(k)對應不一樣地址的機率是相等的,即任意一個記錄的關鍵字經過哈希函數的計算獲得的存儲地址的分佈要儘可能均勻,目的是爲了儘量減小衝突。

         哈希查找必須解決兩個主要問題:a、構造一個計算簡單並且衝突儘可能少的哈希函數;b、給出處理衝突的方法。

         哈希函數的構造方法:

         a、直接定址法;

         b、平方取中法;

         c、數子分析法;

         d、除留餘數法;

         e、隨機數法。

         處理衝突的方法:

         a、開放定址法;

         b、拉鍊法。

8、排序

     插入排序:直接插入排序和希爾排序;

     交換排序:冒泡排序和快速排序;

     選擇排序:直接選擇排序

     歸併排序。

    1 直接插入排序:將關鍵字插入有序序列後依然有序,時間複雜度:O(n2);

    2 折半插入排序:能夠減小關鍵字的比較次數,關鍵字的比較次數最多n/2次,移動記錄的次數和直接插入排序相同,故時間複雜度仍爲O(n2);

    3 希爾排序:分組後進行插入排序。時間複雜度爲O(n1.3);

    4 冒泡排序:對排序序列的相鄰記錄的關鍵字進行比較,使較小的關鍵字的記錄往前移,二較大關鍵字的記錄日後移。時間複雜度爲O(n2);

    5 快速排序:i,j兩個指針,以第一個數字爲基準,j指針從右至左快速掃描序列,掃描到小於基準的前移到i指針位置,而後換i指針從左至右快速掃描碰到大於基準的移動到j指針所在位置,如此交替,直到i=j爲止,此時i左邊的都小於基準,i右邊的都大於基準,而後將基準放入i位置,完成排序,時間複雜度:O(nlog2n);

    6 直接選擇排序:在n個記錄中找到最小的與第一個記錄交換位置,而後在剩下的n-1個記錄中找出一個關鍵字最小的記錄與第2個記錄交換位置,時間複雜度:O(n2);

    7 歸併排序:將n個有序子序列合併爲一個有序序列,算法的時間複雜度爲:O(nlog2n)。 

相關文章
相關標籤/搜索