數據結構與算法總結(上)

開發工具與關鍵技術:

作者:Mr_愷

撰寫時間:2020.5.6

 

1.1:即使是在廣泛採用可視化程序設計的今天,藉助於集成開發環境可以很快地生成程序,但要想成爲一個專業的程序開發人員,至少需要以下三個條件

(1)能夠熟練地選擇和設計各種業務邏輯的數據結構和算法

(2)至少能夠熟練地掌握一門程序設計語言

(3)熟知所涉及相關應用領域知識

  1. 算法+數據結構=程序

1.2:數據結構:

  1. 數據結構中,把數據結構從邏輯上分成線性結構和非線性結構。

一、邏輯結構

     (1)線性結構:結構中的數據元素之間存在着一對一的線性關係。

(除第一個和最後一個數據元素外,每個數據元素只有一個前驅和一個後續數據元素。)

     (2)樹結構:結構中的數據元素之間存在着一對多的層次關係。

(除根節點外,每個元素只有一個前驅數據元素,可有0個或若干個後續數據元素。)

        (3)圖結構:結構中的元素之間存在着多對多的任意關係。

(每個數據元素可有0個或若干個前驅數據元素和0個或若干個後續數據元素。)

二、邏輯結構的延伸基本算法

三、物理結構

四、運算集合(基本操作)

1.3:算法

算法是解決問題的方法,是程序設計的精髓,程序設計的實質就是構造解決問題的算法。算法的設計取決於數據的邏輯結構,算法的實現取決於數據的物理存儲結構。

  • 算法的概念

算法是對特定問題求解步驟的一種描述,它是指令的有限序列。

  • 特徵

五個特性(有窮性、確定性、可行性、輸入、輸出)

  • 設計要求

(正確性、可讀性、健壯性、效率與地存儲量需求)

四、算法分析

(1)算法效率的質量

(1.算法本身選用的策略、2.書寫程序的語言、

3.編譯產生的代碼質量、4.機器執行指令的速度、5.問題的規模)

(2)算法的時間複雜度

(1.常量階時間複雜度、2.線性階時間複雜度、3.平方階時間複雜度)

(3)算法的空間複雜度

2.1:線性表

一、特徵:

1.在非空的線性表,有且僅有一個開始結點a1,它內有直接前趨,而僅有一個直接後繼a2.

2.有且僅有一個終端結點an,它沒有直接後繼,而僅有一個直接前趨an-1;

3.其餘的內部結點ai(2≦i≧n-1)都有且僅有一個直接前趨ai-1和一個直接後繼ai+1。

 

二、線性表的基本運算:

  1. 求表長——求線性表中元素個數
  2. 遍歷——從左到右(或從右到左)掃描(或讀取)表中元素
  3. 按編號查找——找出表中第i個元素
  4. 按特徵查找——按某個特定值查找線性表
  5. 插入——在第i個位置上(即原第i個元素前)插入一個新元素
  6. 刪除——刪除原表中的第i個元素
  7. 排序——按元素某特徵值的遞增(或遞減)排序,重排表中各元素

2.2:線性表有兩種存儲方式

  1. 一種順序的形式
  2. 一種鏈序的形式

2.3:順序表

順序表一般表現爲數組,使用一組地址連續的存儲單元依次存儲數據元素

(1)長度固定,必須在分配內存之前確定數組的長度。

(2)存儲空間連續,即允許元素的隨機訪問。

(3)存儲密度大,內存中存儲的全部是數據元素。

(4)要訪問特定元素,可以使用索引訪問,時間複雜度爲O(1).

(5)要想在順序表中插入或刪除一個元素,都涉及到之後所有元素的移動,因此時間複雜度爲O(n).

 

2.3:單鏈表的結構:

    1. 單鏈表組成有兩個域:一個是數據域,一個是指針域。
    2. 單鏈表中構成鏈表的結點只有一個指向直接後繼結點的指針域。
    3. 其結構特點:邏輯上相鄰的數據元素在物理上不一定相鄰。
    4. 單鏈表是隻包含指向下一個節點的指針,只能單向遍歷。5
    5. 雙鏈表即包含指向下一個節點的指針,也包含指向前一個節點的指針,因此可以雙向遍歷。
    6. 循環單鏈表則是將尾節點與首節點鏈接起來,形成了一個環狀結構,在某些情況下會非常有用。
    7. 由於鏈表是使用指針將節點連起來,因此無需使用連續的空間,它具有以下特點:

(1)長度不固定,可以任意增刪。

(2)存儲空間不連續,數據元素之間使用指針相連,每個數據元素只能訪問周圍的一個元素(根據單鏈表還是雙鏈表有所不同)。

(3)存儲密度小,因爲每個數據元素,都需要額外存儲一個指向下一元素的指針(雙鏈表則需要兩個指針)。

(4)要訪問特定元素,只能從鏈表頭開始,遍歷到該元素,時間複雜度爲O(n) 

(5)在特定的數據元素之後插入或刪除元素,不涉及到其他元素的移動,因此時間複雜度爲O(1)

(6)雙鏈表還允許在特定的數據元素之前插入或刪除元素

 

3.1:棧

(一)棧的定義:

  1. 堆棧簡稱爲棧,是限定只能在表的一端進行插入和刪除操作的線性表。
  2. 堆棧的特點是」後進先出「。

(二)棧的基本運算:

  1. StackInit()初始化堆棧
  2. StackEmpty(S)判定棧是否爲空
  3. StackLength(s)求堆棧s的長度
  4. GetTop(S)獲取棧頂元素的值
  5. Push(s,e)將元素e進棧
  6. Pop(S),出棧(刪除棧頂元素)

(三)棧的存儲結構:

  1. 順序棧——採用順序結構存儲
  2. 鏈棧——採用鏈式結構存儲

3.2:隊列的定義:

  1. 隊列簡稱爲隊,是限定只能在表煩人一端作插入運算,在另一端做作刪除運算的線性表。
  2. 隊列的存儲結構:
  1. 順序隊列——採用順序結構存儲
  2. 鏈式隊列——採用鏈式結構存儲
  1. 判斷隊列爲空:

初始化時:fornt=rear=0

循環隊列爲空的條件是:fornt=rear

 

  1. 循環隊列爲滿的條件是:fornt==(rear+1)%MaxSize

 

 

4.1  串的定義

串是字符串的簡稱。在數據結構中,串是一種在數據元素的組成上具有一定約束條件的線性表,即要求組成線性表的所有數據元素都是字符,所以說串是一個有窮的字符序列

4.1.1  定義

串是由零個或多個字符組成的有限序列,記作s=s0s1sn-1(n0),其中s是串名,字符個數n稱作串的長度,雙撇號括起來的字符序列s0s1sn-1是串的值。每個字符可以是字母、數字或任何其它的符號。零個字符的串(即:」」)稱爲空串,空串不包含任何字符。值得注意的是:

(1)長度爲1的空格串" "不等同於空串""

(2)值爲單個字符的字符串不等同於單個字符,如"a"與′a′;

(3)串值不包含雙撇號,雙撇號是串的定界符。

串中任意個連續的字符組成的子序列稱爲該串的子串。包含子串的串則稱爲主串。通常將字符在串中的序號稱爲該字符在串中的位置。子串在主串鐘的位置則以該子串在主串中的第一個字符位置來表示。爲了讓大家更好的理解子串,舉個簡單的例子說明。如:

s="I am from Canada.";

s1="am.";

s2="am";

s3="I am";

s4="I am ";

s5="I am";

s2s3s4s5都是s的子串,或者說ss2s3s4s5的主串,而s1不是s的子串。s3等於s5s2不等於s4s的長度是17s3的長度是4s4的長度是5

 

4.1.2  串的基本算法

串的基本算法在串的應用中廣泛使用,這些基本算法不僅加深了對串的理解,更簡化了日後對串的應用。下面還是通過舉例介紹串的常用基本算法。

假設有以下串:s1="I am a student"s2="teacher"s3="student",常用的串的基本運算有下列幾種:

(1)Assign(s,t),將t的值賦給s

(2)Assign(s4,s3)Assign(s4,"student")後,s4"student"

(3)Length(s),求s的長度。

(4)Length(s1)14Length(s3)7

(5)Equal(s,t),判斷st是否相等。

(6)Equal(s2,s3)falseEqual("student",s3)true

(7)Concat(s,t),將t連接到s的末尾。如:Concat(s3, " number")= "student number"

(8)Substr(s,i,len),求子串。如:Substr(s1,7,7)= student」,Substr(s1,10,0)= 「」, Substr(s1,0,14)= "I am a student"

(9)Insert(s,i,t),在s的第i個位置之前插入串t。 Insert(s3,0,"good_")後,s3"good_student"

(10)Delete(s,i,len),刪除子串。ss=「good_student」,Delete (ss,0,5)後,ss"student"

(11)Replace(s,u,v),子串替換,即將s中的子串u替換爲串v。 Replace(s1,s3,s2)後,s1=I am a teacher」,Replace(s1,worker,s2)s1的值不變。 若ss=「abcbcbc」,則:Replace(ss,cbc,x)後,ss"abxbc"Replace(ss,"cb","z")後,ss"abzzc"

(12)index(s,t),子串定位,即求子串t在主串s中的位置。 index(s1,s3)=7index(s1,s2)=1index(s1, "I")=0