初學數據結構,怎麼理解書上的這句話?

「對於集合ADT,我們可以有諸如並(union)、交(intersection)、測定大小(size)以及取余(complement)等操作。或者,我們也可以只要兩種操作:並和查找(find),這兩種操作又在該集合上定義了一種不同的ADT。」


這是一種一般化模型的思想。

1、就象代數中的1、2、3等數字,是對1、2、3個蘋果,1、2、3個梨子等這樣的抽象。

2、在現實中,存在各種各樣的數據組織形式。不僅僅只有數字、字元,還有各種千變萬化的更複雜的由基本數據類型所形成的組合形式。而且,這些組合,也有相應的各種運算方式。

3、那麼,就有一個問題,怎麼更一般地描述現實中的各種數據形式及其運算,或者說建立一個通用模型?這個問題類似於物理等其它學科一樣。

4、於是,拋掉現實中的數據的具體特徵,只保留數據組織及其操作這兩個特徵,就可以得到所想要的一般化模型。

  • 也就是說,任何現實中的數據,必然有某種數據組織,無論是什麼樣的數據,當然,在這種一般化中,並不關心究竟是什麼樣的數據組織,或者說,數據組織這個特徵,連是什麼組織形式都不包含,只有最一般的數據組織。打個比方說,我只用知道雞是一個動物就可以了,連是什麼動物,什麼是動物等都不關心。

  • 同樣地,任何現實中的數據,必然有某種運算方式,無論是什麼樣的數據,當然,在這種一般化中,也不關心究竟是什麼樣的運算方式,同理類推。

5、這樣,就得到了數據結構中的抽象數據類型。

6、抽象數據類型的一般化目的和好處,類似於數學、物理等其它學科的一般化,特別是得到了一個通用模型。

7、之後,對於具體的現實問題,可以再將這個模型具體化。

8、掌握這個一般化的思想、以及通過數據結構課程的模型具體化方式的能力訓練後,就能夠自如地處理現實中的各種各樣的具體數據。

9、這種一般化模型的思想,普遍運用到各個學科、各門課程。尤其是符號化的一般化模型,基本上是近現代的基本手段。所以智商測驗多用圖畫代表一種符號。

10、能夠早一點認識到符號的存在,能夠早一點認識到模型一般化的存在,對於智力的發展是有無比重要的好處。


就像C#的,不管是List&,LinkedList&還是HashSet&都繼承自IEnumerable&一樣,很抽象。


C 的語法忘得差不多了,我用遊戲的概念解釋一下。

「對於集合ADT,我們可以有諸如並(union)、交(intersection)、測定大小(size)以及取余(complement)等操作。或者,我們也可以只要兩種操作:並和查找(find),這兩種操作又在該集合上定義了一種不同的ADT。」

假定一個冒險遊戲,主角有背包,背包里有藥水Potion、武器Sword等等,它們都屬於不同的數據類型。寫成偽代碼就是:

arrPackage = { potion01, potion02, sword01, sword02.... };

主角打死怪物後掉落一個寶箱,寶箱里有一瓶藥水和一把武器:

arrBox = { potion03, sword03 };

主角撿到寶箱的程序操作就是:

arrPackage = Union(arrPackage, arrBox); // 兩者合併操作

譬如某關的通關條件是獲得potion5和sword05:

arrTarget = {potion5, sword5};

那麼採用「交(intersection)」的運算:

if (Intersection(arrPackage, arrTarget) == arrTarget) 結果為 True 則判斷為通關。

。。。。。。。。。。。

總體來講三兩句很難解釋清楚。

題主去Youtube 上搜視頻來看吧,多看幾個應該能理解:

https://www.youtube.com/results?search_query=abstract+data+type+c

-


面向介面(協議)編程,ADT 是對於集合類型的抽象,拿 List 舉例,ArrayList 和 LinkedList 都可以盛放一組數據,雖然他們內部實現原理不同,但是都可以通過相同一組 API 去對他們進行操作。


你要不要考慮轉行?

要想理解數據結構,你需要先了解計算機結構和數據的存取,以及一些數學上的概念。很抽象,很難找到一種通俗的說法……

建議你不要較真,ADT之類的就是一個抽象的概念,你去找定義,也就是一堆更加抽象的概念的組合……

這個你可以先保留,了解說法,整本書看完應該就理解了


這個不是純粹數學裡的集合問題一個意思?


鑒於題主新學數據結構,我就啰嗦點。

抽象數據類型是一個 為了脫離計算機存儲和演算法這些具體的描述 而定義的一個概念,它由兩個部分組成:數據對象集和操作集。

數據對象集表明你要操作的數據是什麼:比如點、向量或者矩陣。

操作集表明你想要對這些數據做什麼操作,比如對向量的點積、叉積。

數據對象集不能只存在腦子裡,它必須讓計算機來表達,具體表達方法就是數據結構。比如線性表是一個抽象數據類型,具體表達的時候可以用數組也可以用鏈表這兩種數據結構來描述。

操作集也不能你說從線性表裡查找一個數,這個數就自動出來了。其需要讓計算機來找,具體找的方法就是演算法,比如順序查找、二分查找等。

回到題目,集合是一種抽象數據類型。

數據對象集:一組類型相同且無序的數據。

操作集:並、交、補、差、查找等等。

而你給的這句話描述的抽象數據類型叫並查集,它和集合相同點很多,不同點在於它只提供 並和查找 這兩種操作。它是新的抽象數據類型么?就像輪子哥給的繼承例子,它們雖然相似但畢竟不同。


意思是說,你參考集合寫了一個數據類型,但是只實現了交和查找兩種操作,那麼這個數據類型就是一個新的數據類型。

20160816補充:

「抽象數據類型是操作的集合」,有點面向介面編程的意思,例如

typedef xxxxxx ADT;
void find(ADT* adt, int x);
void intersection(ADT* left_adt, ADT* right_adt);

外面要操作你的ADT只有兩個介面,不管你的 xxxxxx(實現) 換成了什麼,只要這兩個介面依舊存在,都是同一種類型(對象)


個人的理解是,抽象數據類型 ADT 是由操作定義的,改變了操作的集合就是定義另外一個 ADT 了,即使一個 ADT 的操作是另一個的操作的子集。


我的觀點是計算機類書籍一定不能看中文翻譯版。比如截圖裡集合的 complement 翻譯為取余,不知道譯者是上哪學的高中。

可以看看抽象代數,把 ADT 理解成一個代數系統,也可以看看 Haskell 的 type class。


集合,表,圖及其處理在形式上都只是一串數據安照安排的方式進行處理,說白了都是抽象成數字的處理。


參考qsort和bsearch。


就以Set為例,它本身有求交集,求並集等方法。如果想要有查找方法,就需要實現Hashtable,然後就是hashset,這就是一種新的數據結構。


書上明確定義了ADT的含義,一些操作的集合。這裡強調的是一組操作,描述中說明了那是兩組不同的操作的集合所以是兩種不同的ADT


大概意思是你可以定義一種基礎數據類型叫集合,然後這種叫集合的數據類型允許那一大堆操作;然而你也可以只聲明兩種操作,然後你需要用到其他操作的時候再加進來擴展成一種新的集合!

比如定義樹只有簡單的操作,然後通過擴展屬性和操作你可以有二叉樹,二叉平衡樹,什麼線段樹,什麼order-statistic tree 什麼interval tree等等等等,說到底還是樹,不過擁有更多屬性和操作!你也可以一開始在基本的樹上定義這些屬性和操作,不過那樣太複雜了!


你得根據語境來理解,ADT就是數據和對數據的操作方法的集合。那麼,對數據的操作方法變了,那就是一個新的ADT。


ADT 是數據元素,關係和操作的集合。

例: 即使它們的物理結構和邏輯結構相同,

二叉樹和二叉排序樹是兩種不同的數據結構。

就好像有些回答, 把別人說過的話加兩句不一定正確的廢話, 就是一個新的回答了.

當然, 最好是像 @vczh 那樣, 繼承一下.

這樣只需要添加或者重載某些操作.

方便復用和維護.


看了一些例子啊自己就懂了。

我們之前一開始學的時候是複數這個抽象數據類型。那Complex操作就加減乘數這些。

可以看到一個抽象數據類型是由許多操作組成。

「對於集合ADT,我們可以有諸如並(union)、交(intersection)、測定大小(size)以及取余(complement)等操作。或者,我們也可以只要兩種操作:並和查找(find),這兩種操作又在該集合上定義了一種不同的ADT。」

題主說的這句話,就是不同的數據結構有不同操作,但是並查這兩種操作啊,就像輪子哥說的父類,它們是爸爸啊


推薦閱讀:

問一個關於寄存器與棧的問題?
剛入門編程的人有必要學習數據結構嗎?
C語言初學者進階學習數據結構與演算法路線?方法?
為什麼大多數編程語言的內建抽象數據類型沒有圖?
自學離散數學,用哪一本書比較好?我自己已經有很多本好難選?

TAG:程序員 | 編程 | C編程語言 | 數據結構 | 演算法與數據結構 |