資料結構 和 資料型別 兩個概念的本質是什麼,區別與聯絡是什麼?

時間 2021-05-08 00:53:57

1樓:jqyjqy

資料型別是程式語言的概念,是解釋記憶體中的資料的方式,為了講課方便被拿到資料結構這門課裡用了。可以不使用資料型別這個概念,可以不用高階程式語言,可以直接用01位元來講課。總是要想辦法有組織地把01位元儲存在記憶體中。

資料結構是在記憶體中(硬碟也需要)組織、儲存資料的方式,在記憶體中的表現就是相互之間存在一種或多種特定關係的資料元素的集合。

在程式執行中,使用資料結構組織記憶體中的資料,我們可以使用資料型別解釋記憶體中的資料,不想解釋就不用了。

在程式設計中,定義資料型別,就是在描述某種資料結構的實現方法,或者說是在定義組成資料結構的資料的模型。

陣列是某些高階程式語言提供的一種儲存資料的方式,在某些語言中當成一種資料型別提供給使用者,陣列在記憶體中的表現就是連續的儲存單元,是一種順序儲存結構。

int char double可以看成使用某種資料結構實現的一類資料元素的型別,可以把他們背後的01位元的組織、儲存方式看成資料結構。

2樓:新木

反對所有答案。

因為這2個概念本來就是已經混亂了,而且不只是這2個概念,就連ADT這個概念也都混亂了。

就拿嚴蔚敏的書來說。

首先說資料型別和資料結構的混亂。

它裡面說資料結構是二元組DS,資料型別是三元組DSP(D指元素,S指結構或關係,P指操作),但後面又說資料結構包括邏輯結構,儲存結構,資料的運算。

但資料的運算就是操作啊,也就是說資料結構就也成了三元組DSP了,這就和前面說的自相矛盾了。

再說關於資料型別和ADT的混亂。

嚴書裡說int型是ADT。於是我就理解為ADT即是資料型別的邏輯特性。

但嚴書後面又說ADT和資料型別的乙個重要區別就是ADT不只包括固有資料型別,還包括使用者自定義的型別(可見這句話的隱含意思是使用者自定義的型別不是資料型別,excuse me?)。

可見,書上說的本來就是自相矛盾的,因此上面那些引用嚴書中的內容得來的答案自然也就都是站不住腳的。

我們經常可以在各種場合看到說棧是資料結構,棧是資料型別,棧是ADT。

比起書上說的,我更願意使用通俗的用法。

即看你關注哪一方面,就說它是什麼。

資料結構關注非基礎和非固有,ADT關注的是使用者自定義和抽象度高。至於資料型別關注基礎和固有。

由此可見,我們一般說陣列是資料型別,一般說鍊錶和棧是ADT或資料結構。

3樓:webzhiyi

其實資料結構首先是乙個集合,那集合必定裡面可以裝東西,裝的東西其實就是資料元素,定義上強調了元素之間的關係而已,乙個集合裡的元素之間必定是有關係的,至少同屬於這個集合這層關係。

資料型別首先也是乙個集合,定義加上了一組操作,但沒有說操作物件是什麼,讓很多人到霧裡了,其實操作物件是資料元素。

比如整數是乙個資料結構,當它被各種語言定義了一組操作後,成為了各種語言的一種資料型別,操作物件是資料元素,如1,2,3...,而不是操作整數這個資料結構。

很多人問陣列是不是資料結構?陣列當然是資料結構,它的資料元素就是實實在在的各個陣列,如[1],[1,2],對元素定義了操作後成為了一種資料型別。

並且陣列的元素也是乙個資料結構,比如上面的[1,2],不過它的元素是整數1跟2。

4樓:陳卓

不太懂,想打個比方,請專業人士審查下,看對不對。

資料型別好比是兵種,資料結構好比陣。

資料型別多,就能充分發揮出多兵種配合優勢。

但是太多了,又增加了配合的難度。

所以,資料型別數量也要有所控制,

不同的兵種需要不同陣勢組織,多兵種更需要特殊陣勢。

5樓:知客

我也很困惑,和大家分享一下我的理解。多批評~

乙個或一組整體的資料元素向上看可以分類,分為不同的資料型別,可分為原子型別(只有乙個資料元素,int char float等)和結構型別(包括多個資料元素,包括陣列型別,結構體型別等)。

同樣,(私認為乙個資料元素沒有結構,即原子型別的資料元素就沒有資料結構。)一組整體的資料元素向下可以找到它的屬性,即主要的邏輯結構方面的屬性(不考慮資料的物理結構)。

而我們對眼前的資料元素進行分類時,分類依據總是1.如果是乙個元素就按傳統的方式分類int float等,2.如果是一組整體資料元素那肯定是按照它的邏輯結構進行分類。!!!

有時候結構屬性和分類結果是一一對應的,這樣就給類似我這樣的新手造成困惑——說乙個陣列是陣列型別呀,還是陣列結構。我認為都可以,看你是強調型別還是結構~

當然按照老師們的定義,資料型別還包含對資料型別的一系列操作。想想看,定義資料型別的目的就是為了操作,加上操作也正常。

6樓:武迪力

ADT--Abstract Data Structure 資料型別:

基本資料型別(屬性),如:Integer..

SetSequence(List)

Dictionary(Map)

Stack

Queue

Priority Queue

Graph

Tree

以上為資料型別,在程式設計中除基本資料型別外不能直接拿來用,因為都是抽象的。

Data Structure--資料結構:

如Linked-List, Array-List, Hash-Set, Hash-Map等,可以直接拿來用,因為都是具體的

對於Integer來說 BitVectors, Hexadecimal為其資料結構,也就是整數的實現。

7樓:

簡單說,資料型別體現資料的『屬性』,資料結構體現資料的『結構』。

基本的資料型別可以構造出某種資料結構,而這樣的資料結構作為乙個整體,又可以充當『結構型別』,變成另乙個資料結構的基本組成部分。

資料型別與資料結構,從廣義的角度講只是視角的不同。

舉個例子:

你觀察乙個水分子,如果從分子層面上看,它就是水的組成部分,是資料型別。

但是從原子層面上看,水分子是氫原子和氧原子組成的乙個結構,那麼這時候你也可以說這個水分子是資料結構,而氫原子和氧原子則是組成該資料結構的資料型別。

同樣的,氫原子同樣可以視為是質子與電子形成的資料結構,但這不妨礙它同時是組成水分子的資料型別

如果還想看詳細一點的分析,可以繼續往下看:

先說資料型別和抽象資料型別。

教科書中的資料型別,往往是乙個高階程式語言語境下的概念,即「特定資料物件在程式語言中的表達與實踐」。

資料型別顯性或隱性地規定了特定資料物件在使用時的數值範圍、儲存方式以及可進行的運算。它將自然概念中的「資料物件」落實到了程式語言的實際應用當中。

故而資料型別表現為一種資料物件在具體軟硬體環境下的組織形式,體現了這類資料物件是什麼,以及他們之間互相能夠進行的計算種類。

如果說資料型別是某類資料元素屬性在計算機中的表達,那麼資料結構就是資料元素關係(結構)在計算機中的表達。

在現實問題中,資料元素必然是混在一起,以一種集群式的關係體來呈現的:

譬如乙個學生的學號(資料)和姓名(資料),其關係就是一對一;而乙個學生的所有資訊(資料),和另乙個學生的所有資訊(資料),其關係就是同屬「學生」這個集合;學校的地理位置,和其他學校的地理位置的交通關係,可能就是多對多。

這樣不同的邏輯關係,必然需要在計算機中以對應的軟硬模式來實現。而對應的軟硬模式,也顯性或隱性地規定了運算方式。這也就是資料結構三要素的由來:邏輯結構、物理結構、運算。

值得注意的是,資料型別中有一類所謂的「結構型別」。(非常類似於之前的抽象資料型別)

譬如構造鍊錶時,會構建乙個帶有資料與指標的「結點型別」,雖然該型別內部也具備物理結構、邏輯結構,同時也隱含了運算模式。但視角的不同讓結構型別終究只是鍊錶這個資料結構的構成單位,其本身不能算作資料結構。

依舊拿原子和分子來做比喻:

資料型別是原子概念,它體現了單一原子的內稟屬性。而資料結構是原子視角下的分子構造,其核心在於不同原子之間的聯絡與構造,而不是整體性的分子概念。

如果將視角從原子視角放大到分子視角,那麼看到的就不是資料結構,而是結構型別了。即:

某個資料結構如果作為乙個整體,可以是某種結構型別;但如果僅解剖性地觀察其內部結構,那就是單純的資料結構。

8樓:

可以大概從以下六個維度理解這兩個概念。。

六個方面

一:什麼是資料

二:有哪些結構

三、四:資料結構與資料型別

五:抽象資料型別

六:相關說明

總體關係

9樓:Arvin

首先資料是計算機資訊載體,當資料中只有乙個元素時,我們將它歸為基本型別。資料中包含多個元素時,又將它歸為結構型別或者復合型別。接下來就是資料元素之間的關係了,對於只含有乙個元素得資料,它的結構其實只有集合這一種結構,是最基本結構,不在資料機構研究範疇。

對於含有多個元素的資料,例如乙個陣列這個型別,它在分類上屬於復合型別,型別名字叫做陣列,陣列之間的元素邏輯上的關係是線性的。

最後的結論陣列在分類上屬於復合型別,具體的講是陣列這個型別。元素之間的關係就是線性表。

10樓:clarify

個人愚見,雖然不一定完全正確,但是比較好統一這些教科書中天書般的概念!

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

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

類之間的物理關係(包括陣列和鍊錶)

ps:資料結構一般重點指邏輯關係,物理關係只是具體計算機中的實現方式介面:資料型別(或者類)的抽象,不用給具體實現抽象資料型別:

資料結構的抽象,不給具體實現2017-05-11

好像有新的理解,

用物件導向的思想看,抽象資料型別就是介面,資料結構就類

11樓:YuXingY

資料結構描述的是資料之間的關係,如線性關係,圖狀關係等;

抽象資料型別規定了乙個數學模型即對這個模型的一系列操作,如棧以及對棧的push及pop操作。

12樓:牛肉絲

其實嚴蔚敏編著的《資料結構》已經很好的回答了這個問題。

要理解這個問題先得具備以下三個基礎概念,下方還會提及,這三個概念可以跳過不看

資料結構:是相互之間存在一種或多種特定關係的資料元素的集合,包括邏輯結構和物理結構。

資料型別:是乙個值的集合和定義在這個值集上的一組操作的總稱。

抽象資料型別:是指乙個數學模型以及定義在該模型上的一組操作。

解讀這三個基礎概念,也就是它們之間的關係。

資料結構和資料型別其實是所屬關係,是什麼樣的所屬關係呢?看圖:

解釋一下這張我自己繪製的圖:

一種資料結構+定義在此種資料結構上的一組操作=結構型別

一種值的集合+定義在此種值的集合上的一組操作=原子型別

結構型別+原子型別=資料型別

以下是背景知識,很重要,當然不想細看的直接看段尾的一句話總結。

三個基礎概念:

資料結構:是相互之間存在一種或多種特定關係的資料元素的集合,包括邏輯結構和物理結構。

資料型別的定義是:是乙個值的集合和定義在這個值集上的一組操作的總稱。

資料型別的分類是:原子型別和結構型別。

融合2和3基礎概念和上圖可得:資料型別的兩種型別是按照定義中兩種「值的集合」來區分的。結構型別就是「值的集合」是一種資料結構,例如線性表、樹和圖;而原子型別就是「值的集合」是原子型別,例如C語言中的基本型別(整型、實型、字元型和列舉型別)、指標型別和空型別。

一句話總結,資料結構是一種值的集合,這種值集+值集上的操作就是結構型別,而結構型別是資料型別中的一種,所以資料結構屬於資料型別。

接下來解釋資料型別和抽象資料型別的關係:

還是那句話,以下是背景知識,很重要,當然不想細看的直接看段尾的一句話總結。

兩個基礎概念:

資料型別:是乙個值的集合和定義在這個值集上的一組操作的總稱。

抽象資料型別:是指乙個數學模型以及定義在該模型上的一組操作。

它們的異同其實就在字面上了——抽象。

抽象資料型別的定義僅取決於它的一組邏輯特性,而與其在計算機內部如何表示和實現無關,即無論其內部結構如何變化,只要它的數學特性不變,都不影響其外部的使用。」抽象「的意義在於資料型別的數學抽象特性。

一句話總結,資料型別和抽象資料型別的相同點在於它們具有相同的邏輯特性,不同點在於資料型別即關係資料集的邏輯特性又關係其物理特性,而抽象資料型別只關心資料集的抽象特性。

總結起來就是這三條基礎概念:

資料結構:是相互之間存在一種或多種特定關係的資料元素的集合,包括邏輯結構和物理結構。

資料型別:是乙個值的集合和定義在這個值集上的一組操作的總稱。

抽象資料型別:是指乙個數學模型以及定義在該模型上的一組操作。

我認為,「資料型別」是計算機發展出來的一種重要思想,它將程式設計一分為二:實現基本資料型別和使用抽象資料型別。實現基本資料型別是指在物理層面實現資料型別的邏輯特性;使用抽象資料型別是指僅僅關注資料型別的邏輯特性,而不關注硬體實現。

這樣兩邊的人都可以更集中注意力於自己的工作範圍,進行更深的鑽研。

關於演算法和資料結構和程式語言和程式的關係是什麼?

計算機底層都是 01010101010的二進位制存在記憶體中,為了讓人類能直觀運算元據,產生了資料結構,抽象出一種結構。C語言知識實現演算法的一種工具,用其他的工具也能實現。演算法大概就是,為了達成某種目的,一種思路。程式就是演算法的具體實現。使用特定的資料結構,並且用某種工具比如C語言編寫實現 L...

有關 Objective C 中乙個資料結構的問題,為什麼 NSArray 和 NSDictionary 都被設計成只能存放物件(不能存放基本型別,如 int)?

因為NSArray中儲存的是指標,並且通過在加入到容器中的時候retain來保證指標的有效性。OC的堆上儲存是基於引用計數的,而原始資料型別的操作方式和OC型別是不同的 不需要retain 個人認為cocoa設計時為了效率 不需要判斷加入容器中的元素的型別 也為了抽象的一致性 即引用計數操作 而沒有...

計算大規模的資料結構中的圖的任意兩點的最短距離問題?

flyingfish 如果是4000點,幾萬邊這種極小圖,隨便floyd 都沒有問題。如果是現實工作中遇到的千萬級別以上的點,億級別邊的大圖,可能需要重新定義計算最短路徑的價值了。dijkstra 甚至都不需要。考慮是乙個關係圖,三度以上的關係強度衰退嚴重,甚至距離大於3的點都不會有物理意義的。 不...