天天看點

資料類型及資料結構資料

資料類型(data type) = 接口(interface) + 資料的表示(data representation)

資料表示有多種, 資料結構(data structural representation)的表示形式是其中一種.

實際上,資料類型是一種 屬性,資料結構是一種 關系,都很抽象,嚴格說起來,應該把資料類型比作元素種類,資料結構類比作化學式/分子式。但是這樣沒有起到比喻說理的效果,依然很抽象,是以依然選擇 原子 和 分子 來說明(一般人想到原子應該都會覺得就像一個一個小球吧,這樣就更易了解)。 從實際結構上來說,一個連結清單隻含有一個資料甚至不含資料,他還是會有指針域和表頭,隊列/堆棧等也一樣,而這些部分就表現了“關系”。相反,單個int/char/float/double資料不含有這些表示關系的部分,是以不能算做一種特殊的 資料結構 。

資料結構是資料與資料之間的關系,資料類型是資料的種類。

資料的本質是差異,每一種差異是一個值。資料的意義是用來對比。

表示資料就要把所有的差異枚舉出來,也就是确定值的範圍。

最簡單的表示資料的方式是使用二值位串。這也是計算機使用的方式。位串這種東西很常見,例如阿拉伯數字。

這裡強調一點:資料沒有類型。如,“1”是一個數字還是字元?隻有在被使用的時候才知道。資料的類型在于使用其的方式。人類認知事物的典型方式是加标簽,或者說分類。這種方式便于人類了解,但同樣也隻是人類的主觀意願。舉個例子,一個狼人以人的形态走在路上,如何判斷他是人還是狼人。如果你告訴我狼人也是人,那我無話可說。

可能因為受到了面向對象思想的影響,我用了很長時間才意識到這一點。

接下來考慮資料的解釋。

如何判斷“123456”是一個數字還是兩個數字?這裡需要使用約定。需要事先約定好一個數字是三位還是六位。

也就是說,在解釋一組資料之前需要對資料的表示方式做好約定。

接下來考慮資料存儲。

受那位匿名同學的啟發,資料的存儲方式也就是資料結構。

回想我們在資料結構課上學到的東西,資料結構考慮的通常是效率和空間這些問題。而這些東西絕對是由資料的存儲方式決定的。通常一種高效的算法會使用專門為這種算法設計的資料結構。這也就是資料結構的意義。

如果一定要問資料類型是什麼東西,隻能說是一種人為的限制。

可能最開始資料類型出現的目的是為了減少由于程式員不小心造成的錯誤。還有可能就是受到面向對象思想的影響。或者幹脆就是别人有我也應該有的想法。

  1. 資料結構:是互相之間存在一種或多種特定關系的資料元素的集合,包括邏輯結構和實體結構。
  2. 資料類型:是一個值的集合和定義在這個值集上的一組操作的總稱。
  3. 抽象資料類型:是指一個數學模型以及定義在該模型上的一組操作

資料結構是一種值的集合,這種值集+值集上的操作就是結構類型,而結構類型是資料類型中的一種,是以資料結構屬于資料類型。 資料結構強調結構,即元素間的關系

資料類型強調類型,即作用于元素的合法操作

資料類型是值的集合及對這些值的運算

資料結構是資料元素的關系及對這種關系的操作。資料元素是有類型的,但是資料結構撇開了這種元素具體的類型,隻考慮資料元素間的互相關系。

數組是資料結構也是資料類型,要看你用什麼角度看

int a[3]; 這裡的a的類型是int [3]

但若是

typedef int DATATYPE;

DATATYPE a[3];

隻要是你不需要考慮 DATATYPE 具體是什麼類型的時候

這裡的a就是一種資料結構

資料類型偏向于用途用法方面,比如整型我用來計算,做加減乘除,字元串我用來表示文字資訊,可以截取,拼接;

資料結構偏向其内部原理,如連結清單的實作鍊式存儲,隊列用來儲存待處理的資料等;

就說數組吧,我寫 int[10] arr_data;的時候,我說arr_data是一個數組,這裡的數組是說的是資料類型,

我說這些資料用一個數組做成線性表存儲的時候,這裡的數組說的是資料結構。

資料類型的作用是限制你程式所做的事情,以檢查出潛在的錯誤。比如在靜态類型的語言比如C中,你有一個類型int的變量,那麼就限定了它是一個範圍有限的整數,你可以對它做運算,但是系統會阻止你把它當作函數調用,這可以阻止潛在的錯誤發生。而且在靜态類型的語言中,這樣的錯誤在編譯期就可以檢查出來了,免得你程式哪天跑着跑着就中槍了。因為這樣的語言變量攜帶類型,類型檢查在編譯期就完成了,是以一般值自身很少攜帶類型資訊。

另外一類是動态類型系統的語言,其中變量不攜帶類型而是值攜帶類型,是以當你運作到某個地方想要把一個整數當成函數調用的時候,類型檢查就會失敗,然後你就會得到一個運作錯誤。

是以類型的作用相當于是規定程式中的一部分:值或者變量,他們可以進行什麼樣的操作。而到底是規定值還是變量,那麼就取決于什麼樣的類型系統了。

先說資料結構(data structure)。一般來說資料結構指的都是結構化的東西,也就是說若幹elements(這個詞不好翻譯,可以認為是基本元素)按照一定結構組成的。如數組,連結清單。可以看出這兩種都是由基本元素組成,而且形成一定結構(數組是實體記憶體連續,連結清單是用指針相連)。而組成的elements可以是複雜結構,如一個結構體組成的數組,或者有嵌套結構的elements。

資料類型(data type)強調類型,一般分為兩種,基本資料類型(int char等)和複雜資料類型(結構體等)。基本結構對應基本資料類型(如一個字元對應char型),複雜結構對應複雜資料類型(結構體)。這個概念是可以對應上面資料結構中的elements的類型。

想總結一下,資料放在elements中,每個elements一般都是線性位址相連的存儲,elements的類型叫資料類型,由elements組成的更複雜的結構叫做資料結構。

補充一下,我覺得原子分子的比喻是不恰當的。确切的說,資料應該是原子,資料結構是分子。資料結構由資料組成(一般的資料結構的直接組成部分隻有一種類型的資料)。而資料由于其表達方式不同,有着不同的資料類型,資料類型用來區分和表達不同元素。

了解這兩個概念必須從資料入手,資料可以認為是線上性記憶體中連續存儲的一段資訊,這段資訊在記憶體中不過就是不加區分的01串而已。而資料類型是讓程式設計者和編譯器識别這段資料表達方式的一種定義。資料結構是将資料用某種方式組合起來的一種結構。是以資料才是核心。

資料結構是資料的一種表現形式,我們把一個具體的人當做一個資料,這人都是由一個頭兩條腿組成。這頭跟腿可以看成是具體的這個人的組成的資料項,他們的關系是頭是在上面的腿是在下面的,是以具體的某個人這個資料的表現形式是頭在上面兩條腿在下面。而每個人都有這樣的表現形式也就是都有這樣的相同的資料結構,我們把每個具體的人歸為同一類,把它叫做人類這種資料類型。這資料類型也可以看成是資料的一個屬性,每個資料都有這樣的一個屬性。int a[3],int b[4]這a和b的資料類型的屬性是相同的嗎?他們的表現形式(資料結構)是一樣的嗎??我的回答是都不一樣,a跟b一個是由3個連接配接的int組成,一個是由4個連接配接的int組成。如果拿人來做比較,其它所有的構成都一樣,但一個是1顆腦袋,一個是2顆腦袋,那這兩個我們會把它當成是相同的資料結構嗎?資料結構都不同,那它們自然是不屬于同一個資料類型了。在我看來數組類型,結構體類型是一個很大的概念,就像基本類型一樣,我們可以說int是屬于基本類型的,char也是屬于基本類型的。但int跟char這兩個不是屬于同一個類型的。而int [3]這是屬于數組類型,int [4]也是屬于數組類型,但它們不是屬于同一個資料類型。這有點像我們定義的類,我們用類聲明的對象都是屬于類類型,但類類型這個大的類型底下又分了無窮個自定義的類型

資料類型:類(指廣義上的對象類,包括自定義類,int,float,char...)

資料結構:類之間的邏輯關系(包括類的集合,線性表,堆棧,隊列,樹,圖...),

類之間的實體關系(包括數組和連結清單)

ps:資料結構一般重點指邏輯關系,實體關系隻是具體計算機中的實作方式

接口:資料類型(或者類)的抽象,不用給具體實作

抽象資料類型:資料結構的抽象,不給具體實作

繼續閱讀