接上一節(jié)我們講到什么是數(shù)據(jù)裹驰,不記得同學(xué),可看看上一節(jié)的內(nèi)容片挂。我們今天來講數(shù)據(jù)結(jié)構(gòu)中的結(jié)構(gòu)的定義幻林。
結(jié)構(gòu)?怎一看音念,有建筑結(jié)構(gòu)沪饺,有書本目錄結(jié)構(gòu)等等,建筑結(jié)構(gòu)表示建筑物內(nèi)在物的各個(gè)組成部分的關(guān)系闷愤,目錄目錄結(jié)構(gòu)表示書中每一章節(jié)的順序整葡,那么數(shù)據(jù)結(jié)構(gòu)中的結(jié)構(gòu)有表示什么吶?
我們來看看官方定義:相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合讥脐。顧名思義遭居,數(shù)據(jù)相互之間的集合,當(dāng)然肯定是兩個(gè)或兩個(gè)以上數(shù)據(jù)的關(guān)系旬渠,就一個(gè)數(shù)據(jù)俱萍,那來的關(guān)系,在計(jì)算機(jī)中告丢,每個(gè)數(shù)據(jù)元素都是有意義的枪蘑,不存在孤立的,雜亂無序的數(shù)據(jù)元素,每個(gè)數(shù)據(jù)之間都是有一定的內(nèi)在聯(lián)系岳颇。
每了編寫出優(yōu)秀的程序照捡,我們必須處理好數(shù)據(jù)元素的特性及要處理對(duì)象之間的關(guān)系,這也是研究數(shù)據(jù)結(jié)構(gòu)的真正意義所在话侧。那么這些特定關(guān)系中都有哪些關(guān)系吶麻敌?
一、邏輯結(jié)構(gòu)與物理結(jié)構(gòu)
按照常規(guī)分類掂摔,我們把數(shù)據(jù)結(jié)構(gòu)分為邏輯結(jié)構(gòu)和物理結(jié)構(gòu)术羔,這個(gè)跟我們把事物分抽象跟具體一樣。
結(jié)構(gòu)是非常重要的乙漓,它既能節(jié)省空間又能提高計(jì)算機(jī)的運(yùn)算速度级历,舉個(gè)例子:假如給大家提供一個(gè)箱子用來裝衣服,男同學(xué)不事先疊好衣服叭披,直接把衣服丟進(jìn)去寥殖,女同學(xué)先把衣服按大小,樣式涩蜘,相同款式的衣服疊起來嚼贡,然后按照事先考慮好的擺放順序裝進(jìn)箱子里,最后我看看同诫,同樣的空間粤策,女同學(xué)裝衣服的數(shù)量遠(yuǎn)遠(yuǎn)大于男同學(xué),這也是一個(gè)結(jié)構(gòu)的思維误窖。
1.1叮盘、邏輯結(jié)構(gòu)
定義:邏輯結(jié)構(gòu)是指數(shù)據(jù)對(duì)象中數(shù)據(jù)元素之間的相互關(guān)系。霹俺,這個(gè)跟我們高中學(xué)習(xí)的集合等數(shù)學(xué)學(xué)到知識(shí)類柔吼,我們把邏輯結(jié)構(gòu)分為四種:集合結(jié)構(gòu)、線性結(jié)構(gòu)丙唧、樹形結(jié)構(gòu)愈魏、圖形結(jié)構(gòu)。
(1) 集合結(jié)構(gòu)
試想一下我們以前用到過的火柴(可能現(xiàn)在的90后或00后很少見過火柴想际,都是用打火機(jī)比較多)培漏,這些火柴看起來都一樣的,沒有任何區(qū)分沼琉,它們沒有任何關(guān)系北苟,每一根都是平等的。
這就是我們現(xiàn)在說的集合:集合結(jié)構(gòu)中的數(shù)據(jù)元素除了同屬于一個(gè)集合外打瘪,它們之間沒有其他關(guān)系友鼻。每一個(gè)數(shù)據(jù)都是“平等”的傻昙,它們的共同屬性是“同屬于一個(gè)集合”。這個(gè)跟數(shù)學(xué)中的集合類似彩扔。如下圖(圓內(nèi)的每個(gè)數(shù)字都是無序平等的分布在圓內(nèi)):
(2) 線性結(jié)構(gòu)
線性結(jié)構(gòu)在我們生活中經(jīng)常遇到妆档,比如我們?cè)谂抨?duì),它就是一種線性的結(jié)構(gòu)
線性結(jié)構(gòu)中的數(shù)據(jù)元素之間是一對(duì)一的關(guān)系虫碉。一前一后就是排隊(duì)的關(guān)系贾惦。
(3) 樹形結(jié)構(gòu)
樹形結(jié)構(gòu)在我們生活中也比較常見,比如公司的組織關(guān)系敦捧,學(xué)校的組織關(guān)系须板。
上圖中部門或員工之間存在一對(duì)或一對(duì)多的層次關(guān)系,層次關(guān)系是樹形結(jié)構(gòu)的一種較為重要的概念兢卵,其次是一對(duì)多习瑰,到處我們引出了數(shù)據(jù)結(jié)構(gòu)中的樹形結(jié)構(gòu)的概念:樹形結(jié)構(gòu)中的數(shù)據(jù)元素之間存在一種一對(duì)多的層次關(guān)系
(4) 圖形結(jié)構(gòu)
在開始介紹圖形結(jié)構(gòu)前,我們來看看鄧超跟孫儷的電影關(guān)系圖
從圖中我們可以看到鄧超跟孫儷兩人是夫妻關(guān)系秽荤,他們一起演過電影甜奄,又有各自主演的電影。
這種關(guān)系就是一個(gè)比較典型的圖形結(jié)構(gòu)窃款,圖形結(jié)構(gòu)在圖譜中比較流行使用课兄,它是一種多對(duì)多的關(guān)系,它的定義是:圖形結(jié)構(gòu)的數(shù)據(jù)元素是多對(duì)多的關(guān)系
在畫數(shù)據(jù)結(jié)構(gòu)的邏輯結(jié)構(gòu)時(shí)晨继,需要注意兩點(diǎn):
每個(gè)數(shù)據(jù)元素都是一個(gè)獨(dú)立節(jié)點(diǎn)烟阐,用圓圈表示
元素與元素之間的邏輯關(guān)系用連線表示,如果有方向踱稍,可以使用箭頭表示曲饱、
1.2、物理結(jié)構(gòu)
上面介紹了邏輯結(jié)構(gòu)珠月,現(xiàn)在我們來物理結(jié)構(gòu)的定義(有些資料也稱為存儲(chǔ)結(jié)構(gòu),都是一回事楔敌,大家不要太在意)啤挎。物理結(jié)構(gòu):是指數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)中的存儲(chǔ)形式
在計(jì)算機(jī)中,以何種方式把數(shù)據(jù)存儲(chǔ)到計(jì)算機(jī)中的存儲(chǔ)器卵凑,這就涉及到物理幾個(gè)庆聘,存儲(chǔ)器我們可以很好理解,比如硬盤勺卢,軟盤伙判,光盤,U盤等外部存儲(chǔ)器黑忱,這些通常用戶文件結(jié)構(gòu)來描述存儲(chǔ)結(jié)構(gòu)宴抚。
數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)正確反映了數(shù)據(jù)元素之間的邏輯關(guān)系勒魔,這才是最為關(guān)鍵的,
數(shù)據(jù)元素的存儲(chǔ)結(jié)構(gòu)主要分為兩種形式:順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ)菇曲。
(1) 順序式存儲(chǔ)結(jié)構(gòu)
順序式存儲(chǔ)結(jié)構(gòu)比較好理解一些:數(shù)據(jù)元素放在地址連續(xù)的存儲(chǔ)單元里冠绢,數(shù)據(jù)的邏輯關(guān)系和物理關(guān)系是一樣的。就跟圍棋盤子一樣常潮。
這種結(jié)構(gòu)相對(duì)來說比較簡(jiǎn)單弟胀,就是排隊(duì)占位,都按照固定的順序排好喊式,每個(gè)人占一個(gè)空間孵户,不插隊(duì)。
(2) 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
順序式存儲(chǔ)結(jié)構(gòu)要求數(shù)據(jù)元素按順序排序岔留,不插隊(duì)延届,不離隊(duì),一個(gè)處理完贸诚,直接到下一個(gè)方庭,但實(shí)際排隊(duì)的時(shí)候,總有人不按規(guī)矩來酱固,排隊(duì)離隊(duì)的情況總會(huì)存在械念。這情況也在計(jì)算機(jī)中存在,有些數(shù)據(jù)需要?jiǎng)h除也有需要插入的數(shù)據(jù)运悲,這種情況順序式存儲(chǔ)結(jié)構(gòu)是無法滿足這個(gè)需求的龄减,這時(shí)就引入了鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。
鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)定義:鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)把數(shù)據(jù)元素存放在任意的存儲(chǔ)單元里班眯,這組存儲(chǔ)單元可以是連續(xù)的希停,也可以是不連續(xù)的。我們來看看下圖署隘。
在鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)中宠能,數(shù)據(jù)元素的存儲(chǔ)關(guān)系并不能反映其邏輯關(guān)系,這時(shí)候需要一個(gè)指針(規(guī)定起點(diǎn)跟終點(diǎn))磁餐,數(shù)據(jù)元素只關(guān)心與我相關(guān)的元素就可以违崇,比如前面跟后面(后面的都不需要太關(guān)心),這樣通過指針指定的地址就可以找到相關(guān)聯(lián)數(shù)據(jù)元素的位置诊霹。
這樣看來羞延,鏈?zhǔn)酱鎯?chǔ)比順序式存儲(chǔ)靈活很多,同樣的空間脾还,順序存儲(chǔ)需要事先把所有的位置規(guī)劃好伴箩,每個(gè)元素都要按照已經(jīng)標(biāo)注好的位置存放,是在幾號(hào)位置就在幾號(hào)位置鄙漏,都已經(jīng)安排好的嗤谚。而鏈?zhǔn)酱鎯?chǔ)只需要第一個(gè)元素知道了位置棺蛛,其他的元素只需要知道前面的元素及對(duì)應(yīng)的指針就行,存儲(chǔ)的位置地址會(huì)告訴元素呵恢。
綜上鞠值,邏輯結(jié)構(gòu)是面向問題的,是為了接近問題渗钉,物理結(jié)構(gòu)是面向計(jì)算機(jī)的彤恶,基本目標(biāo)是將數(shù)據(jù)集及其邏輯關(guān)系存儲(chǔ)到計(jì)算機(jī)的內(nèi)存中。
二鳄橘、抽象數(shù)據(jù)類型
2.1声离、數(shù)據(jù)類型
第一次接觸抽象事物時(shí)都比較難以理解的,我們要需要多想象一下瘫怜,多思考术徊,每個(gè)名詞的定義都是具備一定的規(guī)律,不會(huì)憑空想象的鲸湃,比如我們定義書赠涮,定義動(dòng)物,定義白電暗挑,黑電都是有一定的規(guī)劃歸類的笋除。在數(shù)據(jù)類型中,我們也是這樣定義的:是指一組性質(zhì)相同的值的集合及定義在此集合上的一些操作的總稱炸裆。
相同性質(zhì)的集合及操作,非單個(gè)數(shù)據(jù)元素烹看,在數(shù)據(jù)結(jié)構(gòu)中国拇,數(shù)據(jù)類型是按照值的不同進(jìn)行劃分的。在高級(jí)語言中惯殊,每個(gè)變量酱吝、常量和表達(dá)式都有各自的取值范圍。類型就是用來說明變量或表達(dá)式的取值范圍靠胜,和所能進(jìn)行的操作掉瞳。
當(dāng)時(shí)設(shè)計(jì)計(jì)算機(jī)語言的前輩,為什么要考慮數(shù)據(jù)類型吶浪漠,搞那么復(fù)雜干嘛,就用一個(gè)名稱來表示數(shù)字霎褐,一個(gè)符合表示操作不更好嗎址愿?現(xiàn)實(shí)中真的可以嗎?我們來看看一個(gè)案例冻璃?
大家都想要住房子响谓,當(dāng)然越大越好损合,不同的人經(jīng)濟(jì)實(shí)力不一樣,有錢人不可能跟我們黎民百姓一樣去住平房娘纷,房地產(chǎn)商根據(jù)這種情況嫁审,就推出來滿足不同階層的房子,有普通上班族的普通商品房赖晶、有滿足富豪的別墅律适,有單間,有錯(cuò)層的遏插;有一百多平的捂贿,也有幾十平的,甚至在一線城市還出現(xiàn)膠囊公寓胳嘲。厂僧。這樣就滿足了不同人的需要。
在計(jì)算機(jī)中了牛,內(nèi)存也不是無限大的颜屠,假如你要計(jì)算簡(jiǎn)單的加減法,顯然你開辟大量的內(nèi)存空間鹰祸,那就大材小用甫窟,浪費(fèi)資源,
于是乎福荸,我們根據(jù)數(shù)據(jù)進(jìn)行分類蕴坪,分出來多種數(shù)據(jù)類型。
java是強(qiáng)類型語言敬锐,所以java對(duì)于數(shù)據(jù)類型的規(guī)范會(huì)相對(duì)嚴(yán)格背传。本質(zhì)上講講數(shù)據(jù)類型分為兩種:
基本類型:簡(jiǎn)單數(shù)據(jù)類型不能簡(jiǎn)化的、內(nèi)置的數(shù)據(jù)類型台夺,由編程語言本身定義的径玖,表示真實(shí)的數(shù)字、字符和整數(shù)颤介。
引用類型:Java本身不支持C++中的結(jié)構(gòu)(struct)或聯(lián)合(union)數(shù)據(jù)類型梳星,它的復(fù)合數(shù)據(jù)類型一般都是通過類或接口進(jìn)行構(gòu)造,類提供了捆綁數(shù)據(jù)和方法的方式滚朵,同時(shí)可以針對(duì)程序外部進(jìn)行信息隱藏
2.2冤灾、基本類型
Java語言提供了八種基本類型。六種數(shù)字類型(四個(gè)整數(shù)型辕近,兩個(gè)浮點(diǎn)型)韵吨,一種字符類型,還有一種邏輯型(布爾型)移宅。俗稱四類八種:
第一類:四種整數(shù)型 byte short int long
第二類:兩種浮點(diǎn)型 float double
第三類:一種邏輯型 boolean(它只有兩個(gè)值可取true false)
第四類:一種字符型 char
在棧中可以直接分配內(nèi)存的數(shù)據(jù)是基本數(shù)據(jù)類型归粉。
java中默認(rèn)的整數(shù)類型是int類型椿疗,如果要定義為float型,則要在數(shù)值后加上l或L糠悼; 默認(rèn)的浮點(diǎn)型也是雙精度浮點(diǎn)届榄,如果要定義為float型,則要在數(shù)值后加上f或F倔喂。
2.3铝条、引用類型
在 Java 中一切都被視為了對(duì)象,但是我們操作的標(biāo)識(shí)符實(shí)際上是對(duì)象的一個(gè)引用(reference)
簡(jiǎn)單的說滴劲,引用其實(shí)就像是一個(gè)對(duì)象的名字或者別名 (alias)攻晒,一個(gè)對(duì)象在內(nèi)存中會(huì)請(qǐng)求一塊空間來保存數(shù)據(jù),根據(jù)對(duì)象的大小班挖,它可能需要占用的空間大小也不等鲁捏。訪問對(duì)象的時(shí)候,我們不會(huì)直接是訪問對(duì)象在內(nèi)存中的數(shù)據(jù)萧芙,而是通過引用去訪問给梅。引用也是一種數(shù)據(jù)類型,我們可以把它想象為類似 C++ 語言中指針的東西双揪,它指示了對(duì)象在內(nèi)存中的地址——只不過我們不能夠觀察到這個(gè)地址究竟是什么动羽。
如果我們定義了不止一個(gè)引用指向同一個(gè)對(duì)象,那么這些引用是不相同的渔期,因?yàn)橐靡彩且环N數(shù)據(jù)類型运吓,需要一定的內(nèi)存空間(stack,椃杼耍空間)來保存拘哨。但是它們的值是相同的,都指示同一個(gè)對(duì)象在內(nèi)存(heap信峻,堆空間)的中位置.
Java 對(duì)引用的概念進(jìn)行了擴(kuò)充倦青,將引用分為了:強(qiáng)引用(Strong Reference)、軟引用(Soft Reference)盹舞、弱引用(Weak Reference)产镐、虛引用(Phantom Reference)4 種,這 4 種引用的強(qiáng)度依次減弱踢步。在這里我們就不展開討論了癣亚。
三、今日總結(jié)
今天我們討論了數(shù)據(jù)結(jié)構(gòu)中結(jié)構(gòu)的定義获印,我們需要掌握到什么是結(jié)構(gòu)逃糟,什么是數(shù)據(jù)類型的知識(shí),在以后需要用到的時(shí)候蓬豁,我們能很好為歸類及應(yīng)用到它绰咽,
好了,今天就先介紹到這里地粪,明天我們來講解一下:數(shù)據(jù)結(jié)構(gòu)俗話說—數(shù)據(jù)結(jié)構(gòu)與算法的區(qū)別取募。