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

數據結構與算法C語言版分析概述

ont 思考 data 解決 而後 社會 初學者 實驗 總結

本節開始將帶領大家系統地學習數據結構,作為一門計算機專業大二學生的必修課程,該課程面對的目標人群為初步具備基本編程能力和編程思想的程序員(大一接觸了 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% 的程序員。

數據結構與算法C語言版分析概述