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

本節開始將帶領你們系統地學習數據結構,做爲一門計算機專業大二學生的必修課程,該課程面對的目標人羣爲初步具有基本編程能力和編程思想的程序員(大一接觸了 C 語言或者 C++)。經過系統地學習數據結構,能夠提升程序員分析問題和解決問題的能力。程序員


首先,先來揭開數據結構的神祕面紗,看看什麼是數據結構。
算法

數據結構是什麼?

數據結構,能夠將之分爲「數據」和「結構」兩個方面去理解。

數據,很好理解。都說人離不開空氣,感受剝奪實驗告訴咱們,人也離不開信息,而信息實際上就是對數據進行加工後獲得的產物。信息的形式多樣化,因此數據的形態也多種多樣:文字、數字、字母、符號、圖形圖像、音頻視頻等均可以是數據。
編程

感受剝奪實驗,就是剝奪人的全部接受信息的權利,包括觸覺、聽覺、感受等,這樣的剝奪,任何人都是受不了的,詳情能夠去網上搜索。數組

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

結構,能夠理解爲各部分之間的關係。對於一篇文章的文章結構來講,有總分式,有並列式等,而判斷一篇文件結構的過程實際上就是搞清楚文章中各個天然段落之間的關係。

數據結構,其實是一門研究數據以及數據之間存在的關係的一門課程。經過理清數據及其之間存在的關係,就能夠將數據有效存儲到計算機中,讓計算機來處理數據。

例如,在編寫程序實現計算 7-2=? 的問題中,首先搞清楚的是:
數據結構

  1. 問題中只涉及到兩個數據:整數 7 和整數 2;
  2. 數據之間的關係是被減數與減數的關係;


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

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



圖 1 家庭成員樹形圖


經過看這張家譜樹形圖,能夠一眼看出,張磊的爺爺是張亮。可是若是把這個問題交給計算機來實現,就須要幫助計算機理清數據之間的關係。
編程語言

數據的邏輯結構和物理結構

數據之間的關係(即數據結構)又可細分爲:邏輯關係(邏輯結構)和物理關係(物理結構)。邏輯關係就是例如張晶的父親是張平、張羣是張平的兄弟等等這樣的關係,是人爲賦予給數據的。
學習

數據之間的邏輯關係分爲三種:「一對一」、「一對多」、「多對多」。圖 1 中,每一個孩子對應着惟一的父親,這是「一對一」的關係;拿張平來講,他有兩個孩子,爲「一對多」的關係;在共享單車中,每一個用戶均可以選擇多輛不一樣的單車;而每輛單車會被多我的使用,此爲「多對多」的關係。網站

可是因爲最終解決問題的主體是計算機,解決問題時須要將數據所有存儲到計算機中,然後計算機去處理。數據在計算機中的實際存儲表現出的是數據之間的物理結構,例如張晶距離張磊在實際的物理存儲中有 5 比特的距離。

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

數據結構 PK 算法

數據結構和算法二者爲互利雙贏的關係,二者並不衝突。使用計算機編程解決某個具體問題時,正確的作法是:

  1. 思考如何將要用到的數據存儲到計算機中;
  2. 使用什麼方法解決這個問題;


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

本教程的具體內容

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

  • 線性表、棧和隊列:解決的是具備「一對一」關係的數據的存儲問題;
  • 樹:解決的是具備「一對多」(也能夠包含「一對一」)關係的數據存儲問題;
  • 圖:解決的是具備「多對多」(也包含「一對一」和「一對多」)關係的數據存儲問題;


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

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

學習數據結構的優點

  • 適用於全部編程語言

數據結構解決的是數據的有效存儲問題,而不涉及到具體編程語言,是編程的基礎課程。
誤區:隨着計算機技術突飛猛進的發展,越多的技術涌現,不少人花大精力和時間去追求新技術新熱點,而將數據結構等基礎拋之腦後,實屬南轅北轍。由於軟件開發不論如何改變,其最核心的底層知識不會改變。學習數據結構等一些基礎課程才能真正的作到以不變應萬變。
  • 擴寬解決問題的思路


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

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

本教程 PK 其餘數據結構教程

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

因爲《數據結構》一書在對知識點的講解上,跳躍性較強,對讀者的編程思惟要求較高。針對這個狀況,本教程在該書的基礎上對其知識點進行了更淺顯易懂的講解,在講解過程當中配有大量的樣例和圖示。

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

注意:本書中全部涉及到的代碼都是基於 C 語言實現的,且遵循較新的 C99 標準,讀者在嘗試運行網站中的代碼時請儘可能使用較新版本的編譯器。

總結

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

程序猿的路也是如此,要內外兼修。不少人認爲大學所學的內容沒用,其實否則,大學的學習就是在不斷地提高本身的內功修爲;畢業步入社會後,在深厚內力的基礎上學習招式。

數據結構做爲計算機專業的必修課程,就像「北冥神功」「易筋經」同樣,是提高內功修爲的絕世功法,怎麼能夠不學?

當你選擇了本教程,你已然超越了 99% 的程序員。

相關文章
相關標籤/搜索