數據結構基礎(一)

        我們今天來學習下數據結構,那麼爲什麼要學習數據結構呢?學習它的意義可以使我們培養專業的程序設計思維,訓練使用程序語言描述解決方案的能力。它是算法分析專業課的先修課程,也就是說,如果我們以後想學習算法類的課程,我們就必須得學好數據結構。我們先來看看程序的本質,程序是爲了解決實際問題而存在的,從本質上而言,程序是解決問題的步驟描述。

        我們在進行問題分析時,首先得確認問題類型,如數值計算,求最小值個數等;其次是確認求解步驟,如打開文件,讀數據,關閉文件,計算和等。那麼我們如何判斷問題求解步驟的好壞呢?1、用盡量少的時間解決問題;2、用盡量少的步驟解決問題;3、用盡量少的內存解決問題。數據結構主要的研究範圍是:1、非數值計算類型的程序問題;2、數據間的組織和操作方式;3、數據的邏輯結構和存儲結構。我們經常會聽到:程序 = 數據結構 + 算法。那麼對於數據結構和算法的研究而言,語言不重要,重要的是思想。但是它們是有前提的,我們絕對不能忽視它們的前提條件。

        數據便是程序的操作對象,用於描述客觀事物。它的特點是可以輸入到計算機,可以被計算機程序處理。那麼在數據中,分爲三類:數據元素、數據項以及數據對象。數據元素是組成數據的基本元素,一個數據元素則是由若干個數據項組成,數據對象是由性質相同的數據元素的集合。它們的關係如下如所示

圖片.png

        數據結構是指數據對象中數據元素之間的關係,數據元素之間不是獨立的,存在特定的關係,這些關係即結構。如數組中各個元素之間存在固定的線性關係。那麼我們在編寫一個好的程序之前,必須分析處理問題中各個對象的特性以及對象之間的關係。下來我們來看看數據結構中的一些結構。集合結構是指數據元素之間沒有特別的關係,僅屬性相同的集合;線性結構是指數據之間是一對一的關係;樹形結構是指數據元素之間存在一對多的層次關係;圖形結構則是指數據元素之間是多對多的關係。如下圖所示

圖片.png

         我們來看看其中的物理結構,便是邏輯結構在計算機中的存儲形式。它分爲兩種:1、順序存儲結構,是將數據存儲在地址連續的存儲單元裏;2、鏈式存儲結構,是將數據存儲在任意的存儲單元裏,通過保存地址的方式找到相關聯的數據元素。它們的結構示意如下圖所示

圖片.png

        那麼數據結構是什麼呢?它是相互之間存在特定關係的數據元素的集合,數據結構可以分爲邏輯結構和物理結構。邏輯結構是指包括集合結構、線性結構、樹形結構以及圖形結構。物理結構便是指順序結構和鏈接結構。數據結構靜態的描述了數據元素之間的關係,高效的程序需要在數據結構的基礎上設計和選擇算法。總結爲:高效的程序 = 恰當的數據結構 + 合適的算法。算法是特定問題的求解步驟的描述,在計算機中表現爲指令的有限序列。算法是獨立存在的一種解決問題的方法和思想,我們經常聽到的一句話:語言並不重要,重要的是思想。這句話是由前提的,那便是對於算法而言的。

        下來我們來看看算法的特性:

        1、輸入:算法具有 0 個或多個輸入;

        2、輸出:算法至少有 1 個或多個輸出;

        3、有窮性:算法在有限的步驟之後會自動結構而不會無限循環;

        4、確定性:算法中的每一步都有確定的含義,不會出現二義性;

        5、可行性:算法的每一步都是可行的。

        算法對於合法數據能夠得到滿足要求的結果;算法能夠處理非法輸入,並得到合理的結果;算法對於邊界數據和壓力數據都能得到滿足要求的結果。注意:正確性是算法最需要滿足的基本準則,但是作爲計算機程序,不可能無限制的滿足這條準則。

        程序的三大特性:1、可讀性,算法要方便閱讀理解和交流;2、健壯性,算法不應該產生莫名其妙的結果;3、性價比,利用最少的資源得到滿足要求的結果。算法的可讀性是最容易被忽視的,因爲我們經常會追求高效的算法,從而不會去注意它的可讀性。然而,程序是寫給人看的,而不是計算機。在兩個算法都滿足功能性要求的前提下,我們最關心的其他特性是什麼呢?如何進行比較評判呢?

        性價比也就是效率是工程中最關注的算法附加特性!我們經常會用到事後統計法比較不同算法對同一組輸入數據的運行處理時間。它的缺陷:1、爲了獲得不同算法的運行時間必須編寫相應的程序;2、運行時間嚴重依賴於硬件以及運行時的環境因素;3、算法的測試數據的選取是相當困難的。還要一種就是事前分析估算依據統計的方法對算法效率進行估算。影響算法效率的主要因素有:1、算法採用的策略和方法;2、問題的輸入規模;3、編譯器所產生的代碼;4、計算機執行速度。

        下面進行一個算法的簡單估算,如下

圖片.png 圖片.png

圖片.png

        程序效率估算練習中的關鍵部分的操作數量爲 n*n;三種求和算法中關鍵部分的操作數量分別爲 2n,n和 1;隨着問題規模 n 的增大,它們操作數量的差異會越來愈大,因此實際算法在效率上的差異也會變得非常明顯!如下

圖片.png

        我們來看看算法操作數量的對比,如下

圖片.png

        結論:當 n <= 3 時,算法 B 優於算法 A;當 n 越來越大時,算法 A 相對算法 B 的優勢明顯

圖片.png

        結論:當 n == 1 時,算法 C 和算法 D 的操作數量相同;當 n 越來越大時,算法 C 的效率遠高於算法 D。

圖片.png

        結論:判斷一個算法的效率時,操作數量中的常數項和其他次要項是可以忽略的,只需要關注最高階項就能得出結論


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章