數據結構-第零章-緒論

數據結構與算法

第一章:數據結構與算法綜述

​ 綜述:本章主要回答如下問題java

​ 一、什麼是數據結構?以及數據結構是如何產生的?c++

​ 二、什麼是算法?以及如何衡量算法的好壞?算法

​ 三、學習數據結構所須要哪些預備知識?編程

問題1:什麼是數據結構?以及數據結構是如何產生的?

​ 都說數據結構是計算機科學中最核心的一門課程,那麼數據結構爲什麼會成爲最重要的一環呢?提到計算機,咱們都知道計算機是爲處理數據而生的,它只負責運算數據,而數據須要操做計算機的人來提供,你固然能夠給計算機兩個數,而後來運行加法運算,可是在面對複雜問題時,你如何給計算機合理的數據就成爲問題了。使用數據結構通常是遇到比較大量複雜的數據,工程師在面對數據時,合適的將數據所有提取出來,用合理的結構將數據表示出來,這就是數據結構的核心。網絡

程序的重點是對數據的處理,核心是數據,而非程序!將紛繁問題中的數據提取出來便於程序處理是數據結構的核心內容,我以爲只是從數據結構這個名字來講的話,數據結構這門課是並不包含算法的,更好的稱呼應該是《數據結構和算法》。數據結構

數據是能夠結構化的,數據和數據之間的關係能夠概括爲一對一(線性表、棧、隊列共三章),一對多(樹一章),多對多(圖一章)這三種關係,注意,如下講述的數據結構均是這三種類型,沒有其餘。將複雜大量的數據找出規律而後再進行運算,是合理且高效的方法,因此說,數據結構只是一門讓你在複雜巨量數據中找出數據規律的課程,換句話說,有了數據結構,整個世界均可以數據化,全部的一切均可以數字化,而後交由計算平臺處理,這就是爲何計算機專業中,數據結構是其核心的緣由!數據結構和算法

問題2:什麼是算法?以及如何衡量算法的好壞?

​ 什麼是算法?算法就是解決問題的方法(查找和排序,最後兩章內容)。全部的方法,不論優劣,都稱之爲算法。學習算法的目的就是要在一堆算法中找到問題最優的解法,即最優解!咱們在學習數學時說到,數學是一切天然學科的基礎!那麼數學也是計算機科學的基礎,計算機科學歸根到底也就屬於數學中的求最優解問題。畢竟計算機硬件資源是有限的,如何合理高效的使用計算機資源就是一個找最優解的過程,包括操做系統的工做,計算機網絡數據傳輸的處理,計算機體系結構是如何一層層的工做的,均是在現有條件下找一個平衡,即最優解!算法就是在處理問題的邏輯層找最優解。說到最優解,那你寫一個算法,我也寫一個算法,你咋知道誰的是最優解?所以就引出衡量算法優劣的時間複雜度和空間複雜度。編程語言

空間複雜度就是算法運行時所佔用的存儲空間,這裏略過,主要講時間複雜度。函數

時間複雜度:時間複雜度所指的並非解決問題所寫的程序的運行時間,他是一個關於問題規模的函數,將程序中基本操做的執行次數做爲算法時間複雜度的度量,且將最壞的狀況做爲其度量結果。簡單來講,時間複雜度並非測量算法運行所需的具體時間,而是一個以數量級的表示方法,比方說你的錢比別人多一個數量級,你有三位數的存款(100-999),那別人就有(10-99)。學習

舉個例子,看下面一段代碼:

void fun(int n){
  int i,j,x = 0;
  for(i = 0;i < n; ++i){
    for(j = i + 1;j < n; ++j){
      ++x;
    }
  }
}

一、首先找出程序的基本操做,肯定程序的問題規模

​ 在該程序中,顯然 ++x 操做是處於程序的最內層循環,所以定爲基本操做,其規模爲n 。

二、肯定規模

​ 計算出 ++x 的執行次數爲f(n) = n(n - 1)/2,故起決定性的項是(n^2) / 2,所以時間複雜度T(n) = O(n^2);

時間複雜度的計算先了解,後面章節的算法部分每個算法都會詳細計算其時間複雜度(包括最好以及最壞狀況)

問題3:學習數據結構的預備知識

讀者在學習數據結構時須要瞭解兩個知識點,分別是指針和結構體類型。下面詳細說明。

一、指針

先說指針是什麼,指針變量主要是用來存儲變量在內存中的地址,注意指針存放的是地址,而非變量自己。指針變量用*表示,例如 *pointer 表示一個指針變量,那麼在C語言中有細分的基礎數據類型,若是想指向一個整數的地址,那麼就須要在指針前加上相應的數據類型。

例如 int *pointer ; 表示指向一個整數的指針

再如 float *myPointer ;表示指向一個浮點數的數據指針

以上的int、float表示指向的數據類型,*表示指針,pointer、myPointer表示指針變量的變量名。

指針既然指向的是數據在內存中的地址,那麼如何表示出一個數據在內存中的地址呢?在編程語言中,&符號是地址符,若是你定義了一個變量a(int a;),那麼&a即表示變量a在內存中的地址;把變量a的地址能夠用指針變量保存,即int *pointer = &a;

即把變量a的地址賦給了指針型變量pointer。

以上是定義一個指針變量的同時並給指針變量賦值,亦能夠先定義再賦值,語句以下

int *p;

p = &a;

在定義一個指針變量時,若不想讓指針指向內存地址,能夠將其賦值爲NULL,語句以下int *p = NULL; 這樣指針p就不指向內存地址。

在指針變量的使用過程當中,*p表示取指針變量的變量值

例如 int num = *p; 即把指針p所指的值賦值給num

二、構造結構體

​ 數據結構的使用通常是複雜大量的數據處理時,基礎數據類型已經不方便使用,工程師使用本身定義數據類型能更好的處理數據,那麼本身定義數據類型的過程就叫結構體構造,結構體和基礎數據類型同樣也是數據類型,

只不過這個數據類型是讀者本身用基礎數據類型構造的而已。下面就拿一個構造的數據類型來舉例。

typedef struct{
  int age;
  char sex;
  float weight;
}Student;

以上代碼即構造了一個結構體變量,那麼就說說這段代碼的含義

typedef是由type define組成的,意思爲類型定義,struct意思爲結構,還記得結構體是什麼嗎?結構體即爲工程師本身定義的數據類型,那麼typedef struct即爲定義結構體,{ }中的int、char、float是工程師進行構造數據類型所使用的基礎數據類型,Student是該數據類型的名稱,就像整數數據類型是int同樣,Student不是固定的,工程師能夠隨意起屬於本身的數據類型名 。

對於上面定義的結構型,若是我想定義一個Student的數據類型,直接Student stu; 便可,對比基礎數據類型,其定義的方式都同樣。若是給結構型裏的份量賦值,直接寫stu.age = 15; ,若是取份量的值則int n = stu.age;。

說回構造類型,構造結構體和麪向對象語言中的對象同樣,對象有對象名,結構體定義時有結構題名;對象有屬性,對應結構體的份量;對象取屬性值的方式也和結構體相同,都是用 . 的方式。

下面給出Java面向對象Student類的代碼,讀者能夠比較看待

public class Student {
	int age;
	char sex;
	float weight;
}

最後再說一下數據結構與算法整本書的骨骼

1、數據結構部分

數據結構是研究數據的,那麼數據就有其邏輯結構,上文講過的如下四種

一、元素之間沒有關係對應———>集合

二、一對一關係———>線性表(線性表、棧、隊列)

三、一對多關係———>樹

四、多對多關係———>圖

還有兩種存儲結構

一、順序結構

二、鏈式結構

2、算法部分

一、排序

二、查找

相關文章
相關標籤/搜索