本人乃一個(gè)數(shù)據(jù)癡迷者,在計(jì)算機(jī)的道路上,也是一個(gè)數(shù)據(jù)結(jié)構(gòu)的癡迷者,現(xiàn)在大學(xué)里面和同學(xué)搞開發(fā)也癡迷于數(shù)據(jù)庫,我就我個(gè)人的理解給你談一談:
首先,數(shù)據(jù)結(jié)構(gòu)是一門計(jì)算機(jī)語言學(xué)的基礎(chǔ)學(xué)科,它不屬于任何一門語言,其體現(xiàn)的是幾乎所有標(biāo)準(zhǔn)語言的算法的思想。
上面的概念有一些模糊,我們現(xiàn)在來具體說一說,相信你門的數(shù)據(jù)結(jié)構(gòu)使用的是一門具體的語言比如C/C++語言來說明,那是為了輔助的學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),而數(shù)據(jù)結(jié)構(gòu)本身不屬于任何語言(相信你把書上的程序敲到電腦里面是不能通過的吧,其只是描述了過程,要調(diào)試程序,還需要修改和增加一些東西)。你們的書上開始應(yīng)該在講究數(shù)據(jù)的物理存儲(chǔ)結(jié)構(gòu)/邏輯存儲(chǔ)結(jié)構(gòu)等概念,說明數(shù)據(jù)結(jié)構(gòu)首先就是“數(shù)據(jù)的結(jié)構(gòu)”,在內(nèi)存上的存儲(chǔ)方式,就是物理的存儲(chǔ)結(jié)構(gòu),在程序使用人員的思想上它是邏輯的,比如:
你們在C/C++中學(xué)習(xí)到鏈表,那么鏈表是什么一個(gè)概念,你們使用指針制向下一個(gè)結(jié)點(diǎn)的首地址,讓他們串聯(lián)起來,形成一個(gè)接一個(gè)的結(jié)點(diǎn),就像顯示生活中的火車一樣。而這只是對(duì)于程序員的概念,但是在內(nèi)存中存儲(chǔ)的方式是怎樣的那?對(duì)于你程序員來說這是“透明”的,其內(nèi)部分配空間在那里,都是隨機(jī)的,而內(nèi)存中也沒有一個(gè)又一根的線將他們串聯(lián)起來,所以,這是一個(gè)物理與邏輯的概念,對(duì)于我們程序員只需要知道這些就可以了,而我們主要要研究的是“邏輯結(jié)構(gòu)”。
我可以給你一個(gè)我自己總結(jié)的一個(gè)概念:所有的算法必須基于數(shù)據(jù)結(jié)構(gòu)生存。也就是說,我們對(duì)于任何算法的編寫,必須依賴一個(gè)已經(jīng)存在的數(shù)據(jù)結(jié)構(gòu)來對(duì)它進(jìn)行操作,數(shù)據(jù)結(jié)構(gòu)成為算法的操作對(duì)象,這也是為什么算法和數(shù)據(jù)結(jié)構(gòu)兩門分類不分家的概念,算法在沒有數(shù)據(jù)結(jié)構(gòu)的情況下,沒有任何存在的意義;而數(shù)據(jù)結(jié)構(gòu)沒有算法就等于是一個(gè)尸體而沒有靈魂。估計(jì)這個(gè)對(duì)于算法的初學(xué)者可能有點(diǎn)暈,我們在具體的說一些東西吧:
我們在數(shù)據(jù)結(jié)構(gòu)中最簡單的是什么:我個(gè)人把書籍中線性表更加細(xì)化一層(這里是為了便于理解在這樣說的):單個(gè)元素,比如:int i;這個(gè)i就是一個(gè)數(shù)據(jù)結(jié)構(gòu),它是一個(gè)什么樣的數(shù)據(jù)結(jié)構(gòu),就是一個(gè)類型為int的變量,我們可以對(duì)它進(jìn)行加法/減法/乘法/除法/自加等等一系列操作,當(dāng)然對(duì)于單個(gè)元素我們對(duì)它的數(shù)據(jù)結(jié)構(gòu)和算法的研究沒有什么意義,因?yàn)樗緛砭褪窃拥模承┚唧w運(yùn)算上可能算法存在比較小的差異;而提升一個(gè)層次:就是我們的線性表(一般包含有:順序表/鏈表)那么我們研究這樣兩種數(shù)據(jù)結(jié)構(gòu)主要就是要研究它的什么東西那?一般我們主要研究他們以結(jié)構(gòu)為單位(就是結(jié)點(diǎn))的增加/刪除/修改/檢索(查詢)四個(gè)操作(為什么有這樣的操作,我在下面說到),我們一般把“增加/刪除/修改”都把它稱為更新,對(duì)于一個(gè)結(jié)點(diǎn),若要進(jìn)行更新一類的操作比如:刪除,對(duì)于順序表來說是使用下標(biāo)訪問方式,那么我們在刪除了一個(gè)元素后需要將這個(gè)元素后的所有元素后的所有元素全部向前移動(dòng),這個(gè)時(shí)間是對(duì)于越長的順序表,時(shí)間越長的,而對(duì)于鏈表,沒有順序的概念,其刪除元素只需要將前一個(gè)結(jié)點(diǎn)的指針指向被刪除點(diǎn)的下一個(gè)結(jié)點(diǎn),將空間使用free()函數(shù)進(jìn)行釋放,還原給操作系統(tǒng)。當(dāng)執(zhí)行檢索操作的時(shí)候,由于順序表直接使用下標(biāo)進(jìn)行隨機(jī)訪問,而鏈表需要從頭開始訪問一一匹配才可以得到使用的元素,這個(gè)時(shí)間也是和鏈表的結(jié)點(diǎn)個(gè)數(shù)成正比的。所以我們每一種數(shù)據(jù)結(jié)構(gòu)對(duì)于不同的算法會(huì)產(chǎn)生不同的效果,各自沒有絕對(duì)的好,也沒有絕對(duì)的不好,他們都有自己的應(yīng)用價(jià)值和方式;這樣我們就可以在實(shí)際的項(xiàng)目開發(fā)中,對(duì)于內(nèi)部的算法時(shí)間和空間以及項(xiàng)目所能提供的硬件能力進(jìn)行綜合評(píng)估,以讓自己的算法能夠更加好。
(在這里只提到了基于數(shù)據(jù)結(jié)構(gòu)的一個(gè)方面就是:速度,其實(shí)算法的要素還應(yīng)該包括:穩(wěn)定性、健壯性、正確性、有窮性、可理解性、有輸入和輸出等等)
為什么要以結(jié)點(diǎn)方式進(jìn)行這些亂七八糟的操作那?首先明確一個(gè)概念就是:對(duì)于過程化程序設(shè)計(jì)語言所提供的都是一些基礎(chǔ)第一信息,比如一些關(guān)鍵字/保留字/運(yùn)算符/分界符。而我們需要用程序解決現(xiàn)實(shí)生活中的問題,比如我們要程序記錄某公司人員的情況變化,那么人員這個(gè)數(shù)據(jù)類型,在程序設(shè)計(jì)語言中是沒有的,那么我們需要對(duì)人員的內(nèi)部信息定義(不可能完全,只是我們需要那些就定義那些),比如:年齡/性別/姓名/出生日期/民族/工作單位/職稱/職務(wù)/工資狀態(tài)等,那么就可以用一些C/C++語言描述了,如年齡我們就可以進(jìn)行如下定義:
int age;/*age變量,表示人員公司人員的年齡*/
同理進(jìn)行其他的定義,我們用結(jié)構(gòu)體或類把他們封裝成自定義數(shù)據(jù)類型或類的形式,這樣用他們定義的就是一個(gè)人的對(duì)象的了,它內(nèi)部包含了很多的模板數(shù)據(jù)了。
我就我個(gè)人的經(jīng)歷估計(jì)的代碼量應(yīng)該10000以內(nèi)的(我個(gè)人的經(jīng)理:只是建議,從你的第一行代碼開始算,不論程序正確與否,不論那一門語言,作為一個(gè)標(biāo)準(zhǔn)程序員需要十萬行的代碼的功底(這個(gè)是我在大學(xué)二年級(jí)感覺有一定時(shí)候的大致數(shù)據(jù),不一定適合其他人),而十萬行代碼功底一般需要四門基礎(chǔ)遠(yuǎn)支撐,若老師沒有教,可以自學(xué)一些語言)。
數(shù)據(jù)結(jié)構(gòu)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 公司的經(jīng)理大哥建議過我,說趁年輕要深入學(xué)習(xí)算法與數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)模式, APP 架構(gòu),當(dāng)然也包括 iOS 底層的一些...
- 本文內(nèi)容取自于小甲魚的數(shù)據(jù)結(jié)構(gòu)與算法。http://www.itdecent.cn/p/230e6fde9c75 ...
- 1、線性表、棧和隊(duì)列等數(shù)據(jù)結(jié)構(gòu)所表達(dá)和處理的數(shù)據(jù)以線性結(jié)構(gòu)為組織形式。棧是一種特殊的線性表,這種線性表只能在固定的...
- 關(guān)于小兒得了手足口病,一開始我和大多媽媽一樣是慌亂的,焦躁不安,擔(dān)憂一直纏繞在心頭……畢竟這得了這病死亡的新...