個(gè)人看法:
數(shù)據(jù)結(jié)構(gòu)的重要性對(duì)于碼農(nóng)而言就像蓋房子的圖紙,做飯的菜譜,沒有它,也許也能蓋得成房子,也能做的熟菜,但是質(zhì)量如何就不敢說了。我們從大學(xué)的時(shí)候就把《數(shù)據(jù)結(jié)構(gòu)》作為重要的基礎(chǔ)課程來認(rèn)真學(xué)習(xí),但是真正聽懂的,弄明白的,并不是很多。工作了幾年,體會(huì)到它的重要性,決定回過頭來再次抱起書本,系統(tǒng)的再次學(xué)習(xí)這門課程。我相信,一定會(huì)有不一樣的感受和收獲。閑談少敘,書歸正傳。
一、本節(jié)解決問題:
1.什么是數(shù)據(jù)結(jié)構(gòu)?
二、主要內(nèi)容:
1.學(xué)習(xí)前的心里準(zhǔn)備
2.一個(gè)小例子
3.起源
4.概念和術(shù)語
5.邏輯結(jié)構(gòu)和物理結(jié)構(gòu)
6.數(shù)據(jù)類型
7.總結(jié)
三、開始學(xué)習(xí)吧
1.學(xué)習(xí)前的心理準(zhǔn)備
數(shù)據(jù)結(jié)構(gòu)很重要我們知道了,我們學(xué)習(xí)這門課程的時(shí)候一定是抱著好好學(xué),認(rèn)真踏實(shí)的學(xué)習(xí)的心態(tài)的,但是呢,這中間也許會(huì)有一個(gè)個(gè)疑團(tuán),一道道障礙,別放棄,就對(duì)了!
學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)就像過年回家一樣,也許是做高鐵,也許是飛機(jī),也許是綠皮車,也許是大巴車,還可能是搭順風(fēng)車,兜兜轉(zhuǎn)轉(zhuǎn)只要到達(dá)目的地,就是成功了。
2.一個(gè)小例子
有個(gè)同學(xué)叫“小菜”,他剛?cè)肼殘?chǎng),做了一位碼農(nóng)。工作中,他們要做一個(gè)客服電話系統(tǒng),他們領(lǐng)導(dǎo)給他一個(gè)任務(wù)就是完成客戶排隊(duì)模塊的代碼。
小菜覺得很容易啊,不就是排隊(duì)嗎,用數(shù)據(jù)庫就能簡(jiǎn)單的解決啊。于是他設(shè)計(jì)了一張客戶排隊(duì)表,用自動(dòng)遞增的整型數(shù)字作為客戶編號(hào)。來一個(gè)客戶,在表的末尾插入一條數(shù)據(jù)。等系統(tǒng)一空閑,就從表中取出編號(hào)最小的客戶提交,并刪除該記錄。寫好后,小菜高高興興的提交了。
領(lǐng)導(dǎo)看完代碼,把小菜叫到跟前,對(duì)他說:“你數(shù)據(jù)結(jié)構(gòu)怎么學(xué)的啊?這種實(shí)時(shí)排隊(duì)內(nèi)存就能搞定,用什么數(shù)據(jù)庫啊!”
小菜回去后,細(xì)細(xì)思考,決定用數(shù)組來實(shí)現(xiàn),又怕數(shù)組溢出,還要考慮數(shù)組的長(zhǎng)度。
小菜戰(zhàn)戰(zhàn)兢兢地提交了代碼。
果然,沒過多久,領(lǐng)導(dǎo)再次叫來了小菜,告訴他,只需要用數(shù)據(jù)結(jié)構(gòu)的隊(duì)列結(jié)構(gòu)就能解決這個(gè)問題,回去好好想想,再重新寫來。
小菜回去一宿沒睡,仔細(xì)學(xué)習(xí)了“隊(duì)列結(jié)構(gòu)”,重新設(shè)計(jì)了實(shí)時(shí)排隊(duì)的代碼,提交了。這一次,領(lǐng)導(dǎo)跟小菜說:“小伙子,還不錯(cuò)。”
既然數(shù)據(jù)結(jié)構(gòu)這么重要,那一定要好好學(xué)啊。
3.起源
《數(shù)據(jù)結(jié)構(gòu)》是怎么來的?
1968年,美國(guó)有個(gè)叫做高德納的教授寫了一本書叫做《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》,其中第一卷《基本算法》中,他系統(tǒng)的闡述了數(shù)據(jù)的 邏輯結(jié)構(gòu) 和 物理結(jié)構(gòu)還有數(shù)據(jù)操作,開創(chuàng)了《數(shù)據(jù)結(jié)構(gòu)》的課程體系。從這一年起,《數(shù)據(jù)結(jié)構(gòu)》正式誕生了。
4.概念和術(shù)語
1》數(shù)據(jù)
數(shù)據(jù)結(jié)構(gòu),顧名思義是“數(shù)據(jù)的結(jié)構(gòu)”。那么就有必要知道什么是“數(shù)據(jù)”呢?
數(shù)據(jù)就是描述客觀事物的符號(hào),是計(jì)算機(jī)可以操作的對(duì)象,是能被計(jì)算機(jī)識(shí)別、輸入的符號(hào)集合。例如:1,2,3等數(shù)字、“你好”,“hello”等文字符號(hào),逗號(hào),括號(hào)等標(biāo)點(diǎn)符號(hào)、圖片、音頻、視頻等。
思考:這些符號(hào)為什么能夠被計(jì)算機(jī)識(shí)別呢?
個(gè)人思考:因?yàn)檫@些符號(hào)在計(jì)算機(jī)中有約定的編碼,比如 a 的編碼是65,編碼之后的符號(hào)能夠被計(jì)算機(jī)識(shí)別。計(jì)算機(jī)也是人設(shè)計(jì)的,它是根據(jù)人的設(shè)定工作的,你說 編碼是65的是字符a,它就認(rèn)為是a。
2》數(shù)據(jù)元素
數(shù)據(jù)元素:組成數(shù)據(jù)的、有一定意義的基本單位,在計(jì)算機(jī)中通常作為整體處理,也被稱為記錄。
例如:人類中,小明,小華都是數(shù)據(jù)元素;
車類中,小汽車,大卡車,公交車都是數(shù)據(jù)元素。
3》數(shù)據(jù)項(xiàng)
數(shù)據(jù)項(xiàng):一個(gè)數(shù)據(jù)元素可以由若干數(shù)據(jù)項(xiàng)組成。
例如:小明這個(gè)數(shù)據(jù)元素,他的眼睛、耳朵、手、腳、姓名、年齡、家庭住址等等都是數(shù)據(jù)項(xiàng)。其實(shí)就是類的屬性。
4》數(shù)據(jù)對(duì)象
數(shù)據(jù)對(duì)象:性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的子集。
什么是性質(zhì)相同呢?比如,人都有姓名、性別和出生日期這些相同的數(shù)據(jù)項(xiàng)。
我們把數(shù)據(jù)結(jié)構(gòu)中的基本概念都介紹完了,那么到底什么是數(shù)據(jù)結(jié)構(gòu)呢?
數(shù)據(jù)結(jié)構(gòu):相互之間存在一種或者多種特定關(guān)系的數(shù)據(jù)元素的集合。
數(shù)據(jù)結(jié)構(gòu)之所以難以理解,是因?yàn)樗懻摰氖恰瓣P(guān)系”,還不是一種關(guān)系,而是可能有多種關(guān)系。到底都有哪些關(guān)系呢?
5.邏輯結(jié)構(gòu)和物理結(jié)構(gòu)
按照視點(diǎn)的不同,我們把數(shù)據(jù)結(jié)構(gòu)分為“邏輯結(jié)構(gòu)”和“物理結(jié)構(gòu)”。
邏輯結(jié)構(gòu):數(shù)據(jù)對(duì)象(性質(zhì)相同的數(shù)據(jù)元素)中數(shù)據(jù)元素之間的互相關(guān)系。
1.集合結(jié)構(gòu)
2.線性結(jié)構(gòu)
3.樹形結(jié)構(gòu)
4.圖形結(jié)構(gòu)
集合結(jié)構(gòu):元素之間的關(guān)系是同在一個(gè)集合中。
線性結(jié)構(gòu):1對(duì)1的關(guān)系
樹形結(jié)構(gòu):1對(duì)多的關(guān)系
圖形結(jié)構(gòu): 多對(duì)多的關(guān)系
物理結(jié)構(gòu):也叫做存儲(chǔ)結(jié)構(gòu),是指數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)中的存儲(chǔ)形式。
注意:這里的存儲(chǔ)主要指的是內(nèi)存的存儲(chǔ),而不是像硬盤啊,光盤啊這些外部存儲(chǔ)器的存儲(chǔ)。
存儲(chǔ)結(jié)構(gòu)有兩種:
1.順序存儲(chǔ):例如數(shù)組
2.鏈?zhǔn)酱鎯?chǔ):例如鏈表等
什么是順序存儲(chǔ)?
就是把數(shù)據(jù)元素存放在連續(xù)的內(nèi)存單元里面,其數(shù)據(jù)間的邏輯關(guān)系和物理關(guān)系是一致的。
(請(qǐng)忽略丑陋的文字)
什么是鏈?zhǔn)酱鎯?chǔ)?
就是數(shù)據(jù)元素存儲(chǔ)在任意的存儲(chǔ)單元里,這組存儲(chǔ)單元可以是連續(xù)的,也可以是不連續(xù)的。
這就像什么呢?就像上學(xué)時(shí)候早晨做早操站隊(duì),假如站成一隊(duì),每個(gè)人不可能把所有人的位置都記得,他只需要記住自己的前一個(gè)同學(xué)是誰就行了。而第一個(gè)同學(xué)知道自己是第一個(gè),最后一個(gè)同學(xué)知道自己是最后一個(gè),這樣每次排隊(duì),大家都能找到自己的位置了。
注意:邏輯結(jié)構(gòu)是面向問題的,物理結(jié)構(gòu)是面向計(jì)算機(jī)的,其基本目標(biāo)是將數(shù)據(jù)以及邏輯關(guān)系存儲(chǔ)在計(jì)算機(jī)中。
6.數(shù)據(jù)類型
前面我們知道了什么是數(shù)據(jù),而數(shù)據(jù)也是有類型的,這個(gè)類型是什么回事呢?就像每個(gè)人都有自己的姓氏一樣,同一個(gè)類型的數(shù)據(jù)也有共同的特征。
為什么需要類型呢?
因?yàn)橛?jì)算機(jī)的內(nèi)存是有限的,我們聲明了一個(gè)變量 a ,那么給它多大的空間存儲(chǔ)它好呢?給太大了,浪費(fèi)內(nèi)存,給太小了,又怕不夠,怎么辦呢?就根據(jù)數(shù)據(jù)的特征,給他們不同的類型。比如,整型的數(shù)據(jù),所占的存儲(chǔ)空間是4位,一位是8個(gè)字節(jié),,留出一個(gè)字節(jié)用作正負(fù)符號(hào)表示,整型的取值范圍就是2的31次方減1.
打個(gè)比方說吧,大家都要住房子,都希望房子越大越好,但是呢,有的有錢,有的沒錢,所以呢,房子也就有大的,有小的。
這里順便提一下“溢出”是什么回事兒。
我們知道了,一個(gè)整型的數(shù)據(jù)占4位,一個(gè)浮點(diǎn)型的占8位(當(dāng)然了,不同計(jì)算機(jī)也是不一樣的),你把一個(gè)超過整型范圍的浮點(diǎn)型數(shù)據(jù)硬要塞到放整型的房子里,那能放得下嗎?放不下,不就漏出來了,叫“溢出”。
具體每種語言都有什么類型,這些類型是如何定義的,我們這里不做討論。
7.總結(jié)
本節(jié)說了這么多,就是為了解決開頭的一個(gè)問題:什么是數(shù)據(jù)結(jié)構(gòu)。
數(shù)據(jù)結(jié)構(gòu)是研究數(shù)據(jù)元素之間一種或者多種關(guān)系的集合。
程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)的關(guān)系:
程序設(shè)計(jì) = 數(shù)據(jù)結(jié)構(gòu) + 算法