為何會讀這本書?
?????? 算上實習(xí)工作三年,一直是不溫不火,行尸走肉般的在不大不小的公司上下班,簽到打卡(相信很多剛畢業(yè)的人都會有這種體會,告訴我,我不是一個人QAQ)。前一段時間找工作的時候,看了看阿里,網(wǎng)易等知名互聯(lián)網(wǎng)公司的招聘要求,發(fā)現(xiàn)除了對招聘崗位的技能要求之外,也都會有數(shù)據(jù)結(jié)構(gòu)和設(shè)計模式這一塊的要求,但是對這一塊特別空白,簡歷連投都不敢投,為了有更大的空間和提升,我覺得有必要靜下心來學(xué)習(xí)和掌握這兩塊技術(shù)。
?????? 但是數(shù)據(jù)結(jié)構(gòu)這東西,怎么說,很復(fù)雜很燒腦,借了同事同學(xué)的書看了看,那是相當(dāng)不好啃,于是百度一頓搜,終于選定了這本程杰著的《大話數(shù)據(jù)結(jié)構(gòu)》一書作為我自學(xué)數(shù)據(jù)結(jié)構(gòu)的第一本書,并決定記錄一下我的學(xué)習(xí)過程和總結(jié)感想。
數(shù)據(jù)結(jié)構(gòu)非常有趣
??????? “數(shù)據(jù)結(jié)構(gòu)很重要,一定要學(xué)好,但數(shù)據(jù)結(jié)構(gòu)比較抽象,有些算法理解起來很困難,學(xué)得很累。數(shù)據(jù)結(jié)構(gòu)非常有趣,很多算法是智慧的結(jié)晶,學(xué)習(xí)它是去感受計算機(jī)編程技術(shù)的魅力”這是書中前言作者的原話,也是我目前的困惑和選擇這本書最主要的原因,我想找到數(shù)據(jù)結(jié)構(gòu)的魅力所在。
??????? 還有一點很有意思的是這本書的目錄足足有16頁,基本對每一個大標(biāo)題小標(biāo)題都有一句點睛語錄記錄在上面,對我來講很加分,哈哈,扯遠(yuǎn)了,拉回來。
??????? 下面就是正文的閱讀,今天就對第一章數(shù)據(jù)結(jié)構(gòu)緒論做個筆記和總結(jié)思考。
第一章 數(shù)據(jù)結(jié)構(gòu)緒論
??????? 數(shù)據(jù):是描述客觀事物的符號,是計算機(jī)中可以操作的對象,是能被計算機(jī)識別,并輸入給計算機(jī)處理的符號集合。數(shù)據(jù)不僅僅包括整型、實型等數(shù)值類型,還包括字符及聲音、圖像、視頻等非數(shù)值類型。
??????? 也就是說,我們這里所說的數(shù)據(jù),其實就是符號,而且必須具備兩個前提:
??????? *可以輸入到計算機(jī)中。
??????? *能被計算機(jī)程序處理。
對于整型、實型等數(shù)值類型,可以進(jìn)行數(shù)值計算。對于字符數(shù)據(jù)類型,就需要進(jìn)行非數(shù)值的處理,聲音、圖像、視頻等可以通過編碼的手段變成字符數(shù)據(jù)來處理。
??????? 數(shù)據(jù)元素:是組成數(shù)據(jù)的、有一定意義的基本單位,在計算機(jī)中通常作為整體處理。也稱為記錄。
??????? 數(shù)據(jù)項:一個數(shù)據(jù)元素可以由若干個數(shù)據(jù)項組成。
?????? 這里需要注意的是數(shù)據(jù)項是數(shù)據(jù)不可分割的最小單位。但真正討論問題的時候,數(shù)據(jù)元素才是數(shù)據(jù)結(jié)構(gòu)中建立數(shù)據(jù)模型的著眼點。比如:我們討論一部電影,討論的是電影角色(“數(shù)據(jù)元素”),而不是電影角色的眼睛,鼻子,嘴巴(“數(shù)據(jù)項”)去分析。
??????? 數(shù)據(jù)對象:是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的子集。
?????? 總結(jié):一開始我覺得數(shù)據(jù)元素特別像一個類或者M(jìn)odel,然后數(shù)據(jù)項就相當(dāng)于類或Model的屬性(是不是很像?!?。菙?shù)據(jù)對象的概念我就理解不了了,難道是具有相同屬性的不同類,然后這么幾個類組成一個對象?(我想沒人會這么干吧...)。
? ? ?? 這里我們需要明確一點就是,我們的關(guān)注點是數(shù)據(jù),而不是程序,所以上面的想法完全就是錯誤的,正確的著眼應(yīng)該是從數(shù)據(jù)出發(fā)。這樣就很好理解了。比如數(shù)據(jù)庫中的一張成績表,這張表就是數(shù)據(jù)對象,表中的每一條記錄就是一個數(shù)據(jù)元素,而表的每一個列就是數(shù)據(jù)項。因為數(shù)據(jù)元素是數(shù)據(jù)的基本單元,所以我們可以說一條記錄是一個數(shù)據(jù);且數(shù)據(jù)對象也是數(shù)據(jù)的子集,那么我們也可以說這張表是一個數(shù)據(jù);當(dāng)然我們更可以說表中的一個成績也是一個數(shù)據(jù)。所以數(shù)據(jù)的概念是最大的。
? ? ?? 數(shù)據(jù)結(jié)構(gòu):是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 在計算機(jī)中,數(shù)據(jù)元素并不是孤立、雜亂無序的,而是具有內(nèi)在聯(lián)系的數(shù)據(jù)集合。數(shù)據(jù)集合之間存在的一種或多種特定關(guān)系,也就是數(shù)據(jù)的組織形式。 ??
?????? 數(shù)據(jù)之間的結(jié)構(gòu)又分為邏輯結(jié)構(gòu)和物理結(jié)構(gòu)(也有叫存儲結(jié)構(gòu))。
?????? 邏輯結(jié)構(gòu):指數(shù)據(jù)對象中數(shù)據(jù)元素之間的相互關(guān)系。數(shù)據(jù)元素的邏輯表示。
?????? 物理結(jié)構(gòu):指數(shù)據(jù)的邏輯結(jié)構(gòu)在計算機(jī)中的存儲形式。數(shù)據(jù)元素的物理存儲。
?????? 邏輯結(jié)構(gòu)分為以下四種:
?????? 1.集合結(jié)構(gòu):數(shù)據(jù)元素除了同屬于一個集合外,相互之間沒有其他關(guān)系。就相當(dāng)于數(shù)學(xué)中的集合。
?????? 2.線性結(jié)構(gòu):數(shù)據(jù)元素之間是一對一的關(guān)系。眾多數(shù)據(jù)元素排成一條線。
?????? 3.樹形結(jié)構(gòu):數(shù)據(jù)元素之間存在一種一對多的關(guān)系。
?????? 4.圖形結(jié)構(gòu):數(shù)據(jù)元素是多對多的關(guān)系。
?????? 物理結(jié)構(gòu)分為以下兩種:
?????? 1.順序存儲結(jié)構(gòu):把數(shù)據(jù)元素存放在地址連續(xù)的存儲單元里,其數(shù)據(jù)間的邏輯關(guān)系和物理關(guān)系是一致的。這種存儲結(jié)構(gòu)其實很簡單,就是排隊占位。大家都按順序排好,每個人占一小段空間,大家誰也別插隊。結(jié)合語言,就相當(dāng)于數(shù)組。當(dāng)你告訴計算機(jī)你要建立一個9個整型數(shù)據(jù)的數(shù)組時,計算機(jī)就在內(nèi)存中(堆)找了片空地,按照一個整型所占位置的大小乘以9,開辟一段連續(xù)的空間,于是第一個數(shù)組數(shù)據(jù)就放在第一個位置,第二個數(shù)據(jù)放在第二個,這樣一次排列。數(shù)組名是第一個位置的指針。
?????? 2.鏈?zhǔn)酱鎯Y(jié)構(gòu):是把數(shù)據(jù)元素存放在任意的存儲單元里,這組存儲單元可以是連續(xù)的,也可以是不連續(xù)的。數(shù)據(jù)元素的存儲關(guān)系不能反映其邏輯關(guān)系,因此需要用一個指針存放數(shù)據(jù)元素的地址,這樣通過地址就可以找到相關(guān)聯(lián)數(shù)據(jù)元素的位置。指針:存放數(shù)據(jù)元素的地址,通過指針就可以找到數(shù)據(jù)元素在內(nèi)存中的位置。
??????? 書中有兩句話:“數(shù)據(jù)的存儲結(jié)構(gòu)應(yīng)正確反映數(shù)據(jù)元素之間的邏輯關(guān)系,這才是最為關(guān)鍵的”,“數(shù)據(jù)元素的存儲關(guān)系并不能反映其邏輯關(guān)系”,有點難以理解。我個人的一些理解是:本身數(shù)據(jù)元素的存儲關(guān)系是不能反映其邏輯關(guān)系的,就是兩者是兩回事,但是我們?nèi)绻鰯?shù)據(jù)結(jié)構(gòu)的優(yōu)化,就需要正確選用邏輯關(guān)系和存儲關(guān)系,讓存儲關(guān)系可以反映出邏輯關(guān)系。簡而言之就是,如何存儲數(shù)據(jù)元素之間的邏輯關(guān)系,是實現(xiàn)物理結(jié)構(gòu)的重點和難點(要先確定優(yōu)秀或者合適的邏輯結(jié)構(gòu),再選用合適的物理結(jié)構(gòu))。(ps.有點迷糊,繼續(xù)看下去,希望可以自己想明白,也希望有大神可以幫我解答一下這個困惑。)
??????? 邏輯結(jié)構(gòu)是面向問題的,而物理結(jié)構(gòu)就是面向計算機(jī)的,其基本的目標(biāo)就是將數(shù)據(jù)及其邏輯關(guān)系存儲在計算機(jī)的內(nèi)存中。
?????? 數(shù)據(jù)類型:指一組性質(zhì)相同的值的集合及定義在此集合上的一些操作的總稱。
?????? 數(shù)據(jù)類型是按照值的不同進(jìn)行區(qū)分的,比如java中整數(shù)和小數(shù)可以區(qū)分成整型和浮點型;又根據(jù)整型的大小可以分為short,int,long,浮點型又可以分為float和double。
?????? 至于為什么會有數(shù)據(jù)類型的概念呢,就跟我們租房子一樣,如果一個人住就可以租個單間,當(dāng)然可以租兩室一廳或幾室?guī)讖d,但可能會造成浪費。在計算機(jī)中,因為計算機(jī)的內(nèi)存是有限的,為了不造成不必要的浪費,就定義幾種數(shù)據(jù)類型,規(guī)定好長度和分類。
??????? java中分為四類八種基本類型,分別是:
??????? *整型:byte,short,int,long;
??????? *浮點型:float,double;
??????? *邏輯型:boolean;
??????? *字符型:char;
? ? ?? 抽象數(shù)據(jù)類型:我們對已有的數(shù)據(jù)類型進(jìn)行抽象,就有了抽象數(shù)據(jù)類型。指一個數(shù)學(xué)模型及定義在該模型上的一組操作。抽象數(shù)據(jù)類型的定義僅取決于它的一組邏輯特性,而與其在計算機(jī)內(nèi)部如何表示和實現(xiàn)無關(guān)。
? ? ?? 抽象:指取出事物具有的普遍性的本質(zhì)。它是抽出問題的特征而忽略非本質(zhì)的細(xì)節(jié),是對具體事物的一個概括。抽象是一種思考問題的方式,它隱藏了復(fù)雜的細(xì)節(jié),只保留實現(xiàn)目標(biāo)所必需的信息。 ??????
?????? 不同的計算機(jī)有不同的硬件系統(tǒng),這就要求程序語言最終通過編譯器來轉(zhuǎn)換成底層語言。可事實上高級程序語言并不會管你整型在底層語言是怎么定義的,怎么進(jìn)行加減乘除運算的,也不想知道CPU為了運算進(jìn)行了多少次開關(guān)操作;同時不同的高級程序語言之間對于整型的實現(xiàn)方法可能也不一樣,但由于其定義的數(shù)學(xué)特性相同,在計算機(jī)變成看來,它們都是相同的。所以所謂的整型其實是抽象數(shù)據(jù)類型。也因此,“抽象”的意義在于數(shù)據(jù)類型的數(shù)學(xué)抽象特性。
?????? 抽象數(shù)據(jù)類型不僅僅指那些已經(jīng)定義并實現(xiàn)的數(shù)據(jù)類型,還可以是計算機(jī)編程者在設(shè)計軟件程序時自己定義的數(shù)據(jù)類型。比如OC中CGSize,CGPoint這些幾何數(shù)據(jù)類型。
?????? 根據(jù)抽象數(shù)據(jù)類型的定義,它還包括定義在該模型上的一組操作。事實上,抽象數(shù)據(jù)類型體現(xiàn)了程序設(shè)計中的問題分解、抽象和信息隱藏的特性。把實際生活中的問題分解為多個規(guī)模小且容易處理的問題,然后建立一個計算機(jī)能處理的數(shù)據(jù)模型,并把每個功能模塊的實現(xiàn)細(xì)節(jié)作為一個獨立的單元,從而是具體實現(xiàn)過程隱藏起來。
??????? 總結(jié):個人感覺抽象數(shù)據(jù)類型,很像java中的抽象類的概念,也是將一個事物的特性和相同的動作抽取出來,并不需要關(guān)心具體的實現(xiàn)。
?????? 啊,伸個懶腰,感覺做筆記比看書還累(...),文章中加引用的是書中的定義,其他都是個人對于書中內(nèi)容進(jìn)行的一些思考的記錄和總結(jié),也不知道對不對,哈哈。
?????? 盡量保證每個星期更新一篇,內(nèi)容的話基本都是對于書單上三本書的學(xué)習(xí)記錄(筆記),也有可能是吐槽文...
?????? 對了,剛在電梯看到物業(yè)貼的登革熱提醒,希望同在杭州的小伙伴注意身體,祝大家長命百歲,身體健康,哈哈。歡迎大家留言討論,共同進(jìn)步。
Better Late Than Never!
努力是為了當(dāng)機(jī)會來臨時不會錯失機(jī)會。
?????? 共勉!