數據結構學習筆記(一)

1、c/c++ 雜談

特殊類型

1.結構型
用戶本身製做的數據類型c++

typedef struct{
    int a;
    char b;
    float c;
} TypeA;

2.指針型
若是a是個指針型變量,且指向變量b,則a中存放了變量b所在的地址。*a就是取變量b的內容(x=*a;等價於x=b;),&b就是取變量b的地址,語句a=&b;就是將變量b的地址存於a中,即指針a指向b。算法

typeof 和 #define

  • typeof:給現有的數據類型起新名字
  • #define: 宏定義,用一個指定的標識符表明一個字符串,通常大寫以區別變量名

結點構造

指針與結構體結合segmentfault

1.鏈表結點

包含數據域(存數據)、指針域(存放下一結點的地址)數組

clipboard.png

鏈表的結構型定義以下:數據結構

typedef struct Node {
    int data; 
    //這裏默認的是int型,如需其餘類型可直接修改。 
    structNode*next;
    //指向Node型變量的指針
} Node;

注意:凡是結構型(假設名爲a)內部有這樣的指針型(假設名爲b),即b是用來存放和a類型相同的結構體變量地址的指針型(如圖1.2中,結點A的指針next,next所指的結點B與結點A是屬於同一結構型的),則在定義a的typedef struct語句以後都要加上a這個結構型的名字。與以前定義的結構型TypeA進行比較,會發現這裏的結構型Node在定義方法上的不一樣。函數

2.二叉樹節點的定義

在鏈表結點結構型的基礎上,再加上一個指向本身同一類型變量的指針域即爲二叉樹結點結構型:spa

typedef struct BTNode {
    intdata;
    structBTNode *lchild;
    structBTNode *rchild;
} BTNode;

製做新結點的方法,以二叉樹結點的製做爲例,有如下兩種寫法:
方法一:設計

BTNode BT;

方法二(經常使用):指針

BTNode *BT; 
BT = (BTNode*)malloc(sizeof(BTNode));

clipboard.png

方法二句中的BT是個指針型變量,用它來存儲剛製做好的結點的地址。因BT是變量,雖然如今BT指向了剛生成的結點,可是在之後必要的時候BT能夠離開這個結點轉而指向其餘結點。而方法一句則不行,方法一中的BT就是某個結點的名字,一旦定義好,它就不能脫離這個結點。從這裏就看到方法二比方法一更靈活,所以方法二用的多,而且方法二徹底能夠取代方法一(方法二中BT的值不改變的話就至關於方法一)。code

拓展:取BT指針的值:(*BT).data;BT->data

2、時間複雜度 和 空間複雜度

時間複雜度

將算法中基本操做的執行次數做爲算法的時間複雜度。時間複雜度不是執行完一段程序的總時間,而是其中基本操做的總次數。

計算一個算法時間複雜度的步驟以下:
1.肯定算法中的基本操做,以及問題的規模。
2.根據基本操做執行狀況計算出規模n的函數f(n),並肯定時間複雜度爲T(n)=O(f(n)中增加最快的項/此項的係數)。

經常使用的各類時間複雜度大小的比較關係以下:

$$O(1) ≤ O({log_{2}}^{n}) ≤ O(n) ≤ O(n{log_{2}}^{n}) ≤ O(n^{2}) ≤ O(n^{3}) ≤ …… ≤ O(n^{k}) ≤ O(2^{n})$$

空間複雜度

算法的空間複雜度指算法在運行時所需存儲空間的度量,主要考慮在算法運行過程當中臨時佔用的存儲空間的大小(和時間複雜度同樣,以數量級的形式給出)。

3、數據結構的一些概念

數據元素

數據元素是數據的基本單位,在計算機程序中一般將其做爲一個總體進行考慮和處理。

數據項

數據項是數據結構中討論的最小單位,是數據記錄中最基本的,不可分的數據單位。

數據結構

數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。數據結構包括3方面的內容:邏輯結構,存儲結構和對數據的運算

數據的邏輯結構

數據的邏輯結構是對數據之間關係的描述,它與數據的存儲結構無關,同一種邏輯結構能夠有多種存儲結構。概括起來數據的邏輯結構主要有兩大類。

1.線性結構 簡單地說,線性結構是一個數據元素的有序(次序)集合。它有四個基本特徵:

  • 集合中必存在惟一的一個「第一個元素」。
  • 集合中必存在惟一的一個「最後的元素」。
  • 除最後元素以外,其它數據元素均有惟一的「後繼」。
  • 除第一元素以外,其它數據元素均有惟一的「前驅」。

數據據結構中線性結構指的是數據元素之間存在着「一對一」的線性關係的數據結構。如(a1,a2,a3,.....,an),a1爲第一個元素,an爲最後一個元素,此集合即爲一個線性結構的集合。

2.非線性結構 與線性結構不一樣,非線性結構中的結點存在着一對多的關係,它又能夠細分爲樹形結構和圖形結構。

數據的物理結構

數據的物理結構又稱爲存儲結構,是數據的邏輯結構在計算機中的表示(又稱映像)。它包括數據元素的表示和關係的表示。當數據元素是由若干數據項構成的時候,數據項的表示稱爲數據域;好比一個鏈表結點,結點包含值域和指針域,這裏結點能夠看作一個數據元素,其中的值域和指針域都是這個數據元素的數據域。

數據元素之間的關係在計算機中有兩種不一樣的表示方法:順序映像和非順序映像。對應的兩種不一樣的存儲結構分別是順序存儲結構和鏈式存儲結構。順序映像是藉助數據元素在存儲器中的相對位置來表示數據元素之間的邏輯關係;非順序映像是藉助指針表示數據元素之間的邏輯關係。

實際上,在數據結構中有如下4種經常使用的存儲方法。

1.順序存儲方法 順序存儲結構是存儲結構類型中的一種,該結構是把邏輯上相鄰的結點存儲在物理位置上相鄰的存儲單元中,結點之間的邏輯關係由存儲單元的鄰接關係來體現。由此獲得的存儲結構爲順序存儲結構,一般順序存儲結構式藉助於計算機程序設計語言(例如C/C++)的數組來描述的。

2.鏈式存儲方法 該方法不要求邏輯上相鄰的結點在物理位置上亦相鄰,結點間的邏輯關係是由附加的指針字段表示的。由此獲得的存儲表示稱爲鏈式存儲結構,一般藉助於計算機程序設計語言(例如C/C++)的指針類型來描述它。

3.索引存儲方法 該方法在存儲結點信息時除創建存儲結點信息外,還創建附加的索引表來標識結點的地址。索引項的通常形式通常是<關鍵字,地址>。關鍵字標識惟一一個結點:地址做爲指向結點的指針。

4.散列(或哈希)存儲方法 該方法的基本思想是根據結點的關鍵字經過哈希函數直接計算出該結點的存儲地址。這種存儲方法本質上是順序存儲方法的擴展。

本文地址 kidsama的小博客

相關文章
相關標籤/搜索