登錄

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

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

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

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

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

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

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

  在許多類型的程序設(shè)計中,選擇適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)是一個主要的考慮因素。許多大型系統(tǒng)的構(gòu)造經(jīng)驗表明,封裝的困難程度與最終成果的質(zhì)量與表現(xiàn),都取決于是否選擇了最優(yōu)的數(shù)據(jù)結(jié)構(gòu)。在許多時候,確定了數(shù)據(jù)結(jié)構(gòu)后便能很容易地得到算法。而有些時候,思路則會顛倒過來:例如當(dāng)某個關(guān)鍵作業(yè)需要特定數(shù)據(jù)結(jié)構(gòu)下的算法時,會反過來確定其所使用的數(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è)計方法與編程語言的出現(xiàn)。絕大多數(shù)的語言都帶有某種程度上的模塊化思想,通過將數(shù)據(jù)結(jié)構(gòu)的具體實現(xiàn)封裝隱藏于受限接口之后的方法,來讓不同的應(yīng)用程序能夠安全地重用這些數(shù)據(jù)結(jié)構(gòu)。C++、Java、Python等面向?qū)ο蟮木幊陶Z言可使用類來完成這一功能。

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

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

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

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

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

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

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

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

評論  |   0條評論