1. 程式人生 > >資料結構與演算法C語言版分析概述

資料結構與演算法C語言版分析概述

本節開始將帶領大家系統地學習資料結構,作為一門計算機專業大二學生的必修課程,該課程面對的目標人群為初步具備基本程式設計能力和程式設計思想的程式設計師(大一接觸了 C 語言或者 C++)。通過系統地學習資料結構,可以提高程式設計師分析問題和解決問題的能力。

首先,先來揭開資料結構的神祕面紗,看看什麼是資料結構。

資料結構是什麼?

資料結構,可以將之分為“資料”和“結構”兩個方面去理解。

資料,很好理解。都說人離不開空氣,感覺剝奪實驗告訴我們,人也離不開資訊,而資訊實際上就是對資料進行加工後得到的產物。資訊的形式多樣化,所以資料的形態也多種多樣:文字、數字、字母、符號、圖形影象、音訊視訊等都可以是資料。

感覺剝奪實驗,就是剝奪人的所有接受資訊的權利,包括觸覺、聽覺、感覺等,這樣的剝奪,任何人都是受不了的,詳情可以去網上搜索。

2017 年的雙 11,全球的“剁手族”為天貓貢獻了 1682 億,其中“剁手族”分佈最多的城市為廣東,等等這些都是通過天貓後臺對一筆筆交易資料進行統計得出的結論。

結構,可以理解為各部分之間的關係。對於一篇文章的文章結構來說,有總分式,有並列式等,而判斷一篇檔案結構的過程實際上就是搞清楚文章中各個自然段落之間的關係。

資料結構,實際上是一門研究資料以及資料之間存在的關係的一門課程。通過理清資料及其之間存在的關係,就可以將資料有效儲存到計算機中,讓計算機來處理資料。

例如,在編寫程式實現計算 7-2=? 的問題中,首先搞清楚的是:
  1. 問題中只涉及到兩個資料:整數 7 和整數 2;
  2. 資料之間的關係是被減數與減數的關係;

全部搞清楚了之後,就可以編寫程式解決此問題:定義兩個整形變數,一個表示被減數,一個表示減數(確定之間的關係),將 7 和 2 賦給各自相應的變數(將資料儲存到計算機中),最終輸出相減的結果。

資料結構的體現不止於此,如圖 1 所示,為一個家庭現有成員的樹形圖,現需要讓計算機解決:找到孫子張磊的爺爺是誰?

圖 1 家庭成員樹形圖
通過看這張家譜樹形圖,可以一眼看出,張磊的爺爺是張亮。但是如果把這個問題交給計算機來實現,就需要幫助計算機理清資料之間的關係。

資料的邏輯結構和物理結構

資料之間的關係(即資料結構)又可細分為邏輯關係邏輯結構)和物理關係物理結構)。邏輯關係就是例如張晶的父親是張平、張群是張平的兄弟等等這樣的關係,是人為賦予給資料的。

資料之間的邏輯關係分為三種:

一對一”、“一對多”、“多對多”。圖 1 中,每個孩子對應著唯一的父親,這是“一對一”的關係;拿張平來說,他有兩個孩子,為“一對多”的關係;在共享單車中,每個使用者都可以選擇多輛不同的單車;而每輛單車會被多個人使用,此為“多對多”的關係。

但是由於最終解決問題的主體是計算機,解決問題時需要將資料全部儲存到計算機中,而後計算機去處理。資料在計算機中的實際儲存表現出的是資料之間的物理結構,例如張晶距離張磊在實際的物理儲存中有 5 位元的距離。

學習資料結構的作用就是在理清資料的邏輯關係的前提下,設計出合理的物理儲存結構,使用這種結構,既能有效的儲存資料,又能表示資料之間的關係。當計算機明白了這兩個因素,問題自然而然就解決了。

資料結構 PK 演算法

資料結構和演算法兩者為互利共贏的關係,兩者並不衝突。使用計算機程式設計解決某個具體問題時,正確的做法是:
  1. 思考如何將要用到的資料儲存到計算機中;
  2. 使用什麼方法解決這個問題;

資料結構解決的是第一個問題,演算法解決的的第二個問題。光有資料結構沒有演算法,相當於只把資料儲存到計算機中而沒有有效的方法去處理,沒有任何意義;而若光有演算法,沒有資料結構,就相當於一個軍師有錦囊妙計,但是沒有士兵。

本教程的具體內容

本教程參照嚴蔚敏教授的《資料結構》一書,課程內容同該書同步,根據資料之間不同的邏輯關係,分為以下章節:

  • 線性表和佇列:解決的是具有“一對一”關係的資料的儲存問題;
  • :解決的是具有“一對多”(也可以包含“一對一”)關係的資料儲存問題;
  • :解決的是具有“多對多”(也包含“一對一”和“一對多”)關係的資料儲存問題;

以上在介紹的同時,還會涉及到具體問題的解決,例如查詢某個資料等。除以上內容外,也包含了有關字串陣列和廣義表的相關內容。

除以上內容外,本教程對於各個知識點,還會配有專門的專案進行練習,同時還會不斷地更新內容,給大家蒐集介紹一些實用的演算法。

學習資料結構的優勢

  • 適用於所有程式語言

資料結構解決的是資料的有效儲存問題,而不涉及到具體程式語言,是程式設計的基礎課程。 誤區:隨著計算機技術日新月異的發展,越多的技術湧現,很多人花大精力和時間去追求新技術新熱點,而將資料結構等基礎拋之腦後,實屬南轅北轍。因為軟體開發不論如何改變,其最核心的底層知識不會改變。學習資料結構等一些基礎課程才能真正的做到以不變應萬變。
  • 擴寬解決問題的思路


對於面臨的一些複雜的問題,其複雜性往往不是解決該問題的演算法,更多的是思考如何儲存具有複雜關係的資料。對於解決此類問題,資料結構無疑是一把利器。

資料結構中還會涉及有一些具體問題的解決演算法(本教程會持續更新),例如沒有接觸資料結構之前,對於資料的排序,可能只想到冒泡(氣泡排序),其實你不知道,還有插入排序,快速排序等效率更高的排序演算法,這些在本教程中都會以圖文並茂的方式給大家講解。

本教程 PK 其他資料結構教程

本教程依照於嚴蔚敏的《資料結構》一書,致力於打造一套適用與初學者,最淺顯易懂的資料結構教程。

由於《資料結構》一書在對知識點的講解上,跳躍性較強,對讀者的程式設計思維要求較高。針對這個情況,本教程在該書的基礎上對其知識點進行了更淺顯易懂的講解,在講解過程中配有大量的樣例和圖示。

更重要的是,本教程對該書中所有的虛擬碼進行了基於 C 語言的完整實現,對實現過程進行了大量的鋪墊,並附帶了大量易於理解的註釋和圖示。

注意:本書中所有涉及到的程式碼都是基於 C 語言實現的,且遵循較新的 C99 標準,讀者在嘗試執行網站中的程式碼時請儘量使用較新版本的編譯器。

總結

在武俠小說中,高手往往注重內功的修養,而招式則為其次,有了深厚的內力,即使不會招式,也能見招拆招;如果一味地崇拜花拳繡腿,沒有內功,只是花架子,沒什麼卵用。

程式猿的路也是如此,要內外兼修。很多人認為大學所學的內容沒用,其實不然,大學的學習就是在不斷地提升自己的內功修為;畢業步入社會後,在深厚內力的基礎上學習招式。

資料結構作為計算機專業的必修課程,就像“北冥神功”“易筋經”一樣,是提升內功修為的絕世功法,怎麼可以不學?

當你選擇了本教程,你已然超越了 99% 的程式設計師。