登錄

數(shù)據(jù)結(jié)構(gòu)

百科 > 計(jì)算機(jī) > 數(shù)據(jù)結(jié)構(gòu)

1.什么是數(shù)據(jù)結(jié)構(gòu)

  數(shù)據(jù)結(jié)構(gòu)是一種具有一定邏輯關(guān)系,在計(jì)算機(jī)中應(yīng)用某種存儲(chǔ)結(jié)構(gòu),并且封裝了相應(yīng)操作的數(shù)據(jù)元素的集合。它包含三方面的內(nèi)容,邏輯關(guān)系、存儲(chǔ)關(guān)系以及操作。[1]

2.數(shù)據(jù)結(jié)構(gòu)的內(nèi)容

  一般而言,數(shù)據(jù)結(jié)構(gòu)的選擇首先會(huì)從抽象數(shù)據(jù)類型的選擇開始。一個(gè)設(shè)計(jì)良好的數(shù)據(jù)結(jié)構(gòu),應(yīng)該在盡可能使用較少的時(shí)間與空間資源的前提下,為各種臨界狀態(tài)下的運(yùn)行提供支持。數(shù)據(jù)結(jié)構(gòu)可通過(guò)編程語(yǔ)言所提供的數(shù)據(jù)類型、引用及其他操作加以實(shí)現(xiàn)。

  不同種類的數(shù)據(jù)結(jié)構(gòu)適合于不同種類的應(yīng)用,而部分甚至專門用于特定的作業(yè)任務(wù)。例如,當(dāng)計(jì)算機(jī)網(wǎng)絡(luò)依賴于路由表運(yùn)作時(shí),B樹高度適用于數(shù)據(jù)庫(kù)的封裝。

  在許多類型的程序設(shè)計(jì)中,選擇適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)是一個(gè)主要的考慮因素。許多大型系統(tǒng)的構(gòu)造經(jīng)驗(yàn)表明,封裝的困難程度與最終成果的質(zhì)量與表現(xiàn),都取決于是否選擇了最優(yōu)的數(shù)據(jù)結(jié)構(gòu)。在許多時(shí)候,確定了數(shù)據(jù)結(jié)構(gòu)后便能很容易地得到算法。而有些時(shí)候,思路則會(huì)顛倒過(guò)來(lái):例如當(dāng)某個(gè)關(guān)鍵作業(yè)需要特定數(shù)據(jù)結(jié)構(gòu)下的算法時(shí),會(huì)反過(guò)來(lái)確定其所使用的數(shù)據(jù)結(jié)構(gòu)。然而,不管是哪種情況,數(shù)據(jù)結(jié)構(gòu)的選擇都是至關(guān)重要的。

  系統(tǒng)構(gòu)造的關(guān)鍵因素是數(shù)據(jù)結(jié)構(gòu)而非算法的這一深入理解,導(dǎo)致了多種形式化的設(shè)計(jì)方法與編程語(yǔ)言的出現(xiàn)。絕大多數(shù)的語(yǔ)言都帶有某種程度上的模塊化思想,通過(guò)將數(shù)據(jù)結(jié)構(gòu)的具體實(shí)現(xiàn)封裝隱藏于受限接口之后的方法,來(lái)讓不同的應(yīng)用程序能夠安全地重用這些數(shù)據(jù)結(jié)構(gòu)。C++、Java、Python等面向?qū)ο蟮木幊陶Z(yǔ)言可使用類來(lái)完成這一功能。

  因?yàn)閿?shù)據(jù)結(jié)構(gòu)的重要性毋庸置疑,現(xiàn)代編程語(yǔ)言及其運(yùn)行環(huán)境在標(biāo)準(zhǔn)庫(kù)中都包含了多種數(shù)據(jù)結(jié)構(gòu),例如C++標(biāo)準(zhǔn)模板庫(kù)中的容器、Java集合框架以及微軟的.NETFramework。

  大多數(shù)數(shù)據(jù)結(jié)構(gòu)都由數(shù)列、記錄、可辨識(shí)聯(lián)合、引用等基本類型構(gòu)成。舉例而言,可空引用(nullablereference,一種可被置空的引用)是引用與可辨識(shí)聯(lián)合的結(jié)合體,而最簡(jiǎn)單的鏈?zhǔn)浇Y(jié)構(gòu)鏈表則是由記錄與可空引用構(gòu)成。

  數(shù)據(jù)結(jié)構(gòu)意味著接口或封裝:一個(gè)數(shù)據(jù)結(jié)構(gòu)可被視為兩個(gè)函數(shù)之間的接口,或者是由數(shù)據(jù)類型聯(lián)合組成的存儲(chǔ)內(nèi)容的訪問(wèn)方法封裝。

3.數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)[1]

  應(yīng)用數(shù)據(jù)結(jié)構(gòu)解決生活中的問(wèn)題的首要前提是研究應(yīng)用什么數(shù)據(jù)結(jié)構(gòu)解決生活中的問(wèn)題。其分析步驟為:首先分析任務(wù)中的操作對(duì)象,即找出任務(wù)中涉及到的數(shù)據(jù),從中總結(jié)和抽象出操作對(duì)象,并且分析操作對(duì)象之間的邏輯關(guān)系;其次根據(jù)任務(wù)中對(duì)操作對(duì)象的操作,研究應(yīng)用何種存儲(chǔ)方式來(lái)存儲(chǔ)數(shù)據(jù)才能高效的執(zhí)行程序并且占用較小的存儲(chǔ)空間。選擇數(shù)據(jù)結(jié)構(gòu)的接口要最接近軟件的需求。通常當(dāng)有多個(gè)滿足需要的接口數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)時(shí),可以根據(jù)比較他們的接口操作的運(yùn)行時(shí)間以及數(shù)據(jù)結(jié)構(gòu)消耗的空間來(lái)進(jìn)行選擇,有的時(shí)候時(shí)間和空間可以相互轉(zhuǎn)換,比如可以用空間來(lái)交換操作的效率;最后在物理存儲(chǔ)方式的基礎(chǔ)上設(shè)計(jì)正確的算法實(shí)現(xiàn)操作,完成任務(wù)。

  生活中所要處理的數(shù)據(jù)之間可以抽象出來(lái)不同的邏輯關(guān)系,建立不同的數(shù)據(jù)結(jié)構(gòu),但是針對(duì)實(shí)際問(wèn)題要從中選取能夠準(zhǔn)確描述問(wèn)題的基本特性并且易于實(shí)現(xiàn)的邏輯結(jié)構(gòu)。例如八枚硬幣中其中有一枚硬幣是較為輕的,要求用一個(gè)天平將這枚輕的硬幣判斷出來(lái),判斷的過(guò)程采用將硬幣分析兩組或者三組,分別使用天平比較的方式來(lái)判斷。這一判斷過(guò)程可以用一個(gè)樹形圖來(lái)表示,所以可以將該問(wèn)題抽象為判定樹,構(gòu)建樹形結(jié)構(gòu)。

  根據(jù)選定的數(shù)據(jù)結(jié)構(gòu)可以用不同的存儲(chǔ)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。不同類型的數(shù)據(jù)結(jié)構(gòu)常用的存儲(chǔ)結(jié)構(gòu)為順序存儲(chǔ)結(jié)構(gòu)、鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)、散列存儲(chǔ)結(jié)構(gòu)及索引存儲(chǔ)結(jié)構(gòu)。不同的存儲(chǔ)結(jié)構(gòu)具有不同的特點(diǎn),大致上存在的差異在存儲(chǔ)空間和運(yùn)算效率兩個(gè)方面。例如線性表的順序存儲(chǔ)結(jié)構(gòu)與鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)在存儲(chǔ)空間上來(lái)對(duì)比,鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)顯然要多占用一部分存儲(chǔ)空間。從運(yùn)算效率上來(lái)對(duì)比,如果線性表需要進(jìn)行大量的插入和刪除操作的話,那么鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)從執(zhí)行效率上來(lái)講要占有優(yōu)勢(shì)。而如果線性表要反復(fù)進(jìn)行查詢操作的話,順序存儲(chǔ)結(jié)構(gòu)具備隨機(jī)讀寫的特點(diǎn),就比較適合這種情況。

  確定數(shù)據(jù)的邏輯關(guān)系與存儲(chǔ)結(jié)構(gòu)的情況下,可以設(shè)計(jì)出不同的算法來(lái)實(shí)現(xiàn)應(yīng)用。設(shè)計(jì)的算法應(yīng)該是正確的算法。正確的算法的含義是:能夠解決實(shí)際問(wèn)題,輸入的所有可能的合法的輸入都能產(chǎn)生預(yù)期的正確的結(jié)果;能夠在有窮的步驟內(nèi)執(zhí)行完程序;能夠用最簡(jiǎn)短的語(yǔ)句最高效的完成任務(wù)。

評(píng)論  |   0條評(píng)論