一、學習數據結構有什么用?

打算把數據結構跟算法的知識捋一捋,所以新建了個文集。
很多人都說這是內功,那學這個到底有什么用呢,我找了幾篇蠻有道理的文章轉了過來,來堅定下學習的信念。

我看完這幾篇后覺得,學這個最重要的是學會了把現實中的實際問題抽象為計算機能夠理解的數據模型,然后施加以算法以解決問題。

找的文章如下:

作者:劉欣
鏈接:https://www.zhihu.com/question/29587605/answer/147424220
來源:知乎

《數據結構》是計算機專業的一門必修課, 可是很多學生學完以后,覺得用處不大, 還不如學個C,Java來的直接一點。

等到工作了以后做業務系統開發,發現根本就用不到那些書中的講的二叉樹、圖、排序算法, 更加覺得這門課是在浪費時間了。

這種想法實際上是錯誤的。

學習數據結構,并不僅僅是學習其中現成的那些隊列,堆棧,二叉樹,圖等經典結構, 也不僅僅是學習其中的那些快速排序、冒泡排序等算法。

更重要的是你要學習一種思想:如何把現實問題轉化為計算機語言的表示。

計算機其實一種很笨,很機械的機器,只會按照預定的指令一步步執行, 而計算機語言的特點就是精確、無二意, 它的本質語言是二進制的, 即使是C,Java等高級一點的語言也只不過是包裝而已, 它的表達能力并沒有本質的提升, 仍然停留在很低的層次。

而我們用的自然語言則是典型的模糊的,不精確的, 程序員面臨的一個重要問題, 或者是我們的主要工作就是怎么把自然語言描述的問題轉化為計算機語言的表示。

到底該怎么轉化, 《數據結構》已經給出了指引: 設計出數據結構, 在施加以算法就行了, 當然現實問題會更復雜, 需要框架,類庫,模式等支撐。

這是一種非常重要的邏輯思維能力的鍛煉, 也是程序員入門的條件。

很多半路出家的人, 僅僅上了個培訓班后參加工作, 寫出的代碼實在是慘不忍睹, 很明顯只掌握了工具,邏輯思維的訓練遠遠不足。

就我個人而言, 大學時學《數據結構》以后, 為了準備高級程序員考試, 把里邊的習題全部做了一遍, 發現真是受益匪淺, 不但高程的成績非常好, 更重要的是在后來的工作中,遇到數據結構相關的實際問題, 基本上沒有什么障礙,只要掌握了語言特性, 解決起來非常輕松。

總結一下,《數據結構》這門課其實會潛移默化的影響你的邏輯思維, 當然, 你需要多多練習才有可能使用純熟, 等它變成身體一部分以后, 你就發現其實大部分編程任務都沒什么難度了,更難的其實是對編程更高的要求:抽象的能力。

作者:呂雙全
鏈接:https://www.zhihu.com/question/29587605/answer/71567673
來源:知乎

想從“由頂向下”的角度說說自己淺顯的理解:

我們知道計算機是人類在思考“能不能偷懶”的原始欲望下創造出來——找一個自動、快速、不知疲憊地替人類進行各種工作的機器。在有了諸如“圖靈機”等計算模型理論的支撐下,人們找到了通用的底層方式來實現自己想要功能的方法。但這些方法需要讓計算機理解——或者可以被處理后理解,就需要我們以某種形式,將我們的問題一步步抽象、一步步化簡,直到形成某種計算機可以理解的“程式化”的語言或組織形式,最后對計算機說一句:剩下的就交給你了!

舉個不甚恰當的例子:
比如我們計劃去旅游,我們手里有地圖,想知道計劃中的幾個城市直接是否都有高速公路可以走,從而不會有某個城市因道路不通而無法驅車前往。雖然我們可以自己去查,但是我們有計算機啊!于是我們想借助它來完成這個任務,于是進行了第一步抽象——將城市表示為一個個點,道路表示為邊,結合起來形成了叫圖的數據結構。我們想知道的便是——這張圖是否是一個連通圖?比如我們用1、2、3、4分別表示“北上廣深”(僅作意會),線段表示道路,于是有了這張圖:

圖.png

畫出來以后,我們自己心里明白它表示什么,但計算機不懂。于是我們進行第二步抽象——將圖編碼,轉化為計算機可以編譯的語言。于是得到下面表示方式:
<G> = (1,2,3,4) ((1,2),(2,3),(3,1),(1,4))
前面括號中我們用數字表示各個節點(對應“城市”)的編號,后面則用“(節點,節點)”成對的形式表示一條邊(對應 “道路”)。
那么計算機如何處理呢?這時就需要設計一種算法,告訴它怎么理解和處理人類跟你說的話。比如可以按這樣的方式:

  1. 選擇第一個節點并進行標記。
  2. 重復第3步直到沒有新的節點可以被標記。
  3. 對于G中的每個節點Ni,如果有一條邊與其相連,且邊的另一頭是一個已經被標記的節點Nj(i不等于j),那么將Ni進行標記。(這一步要借助上面寫出的“邊的集合”((1,2),(2,3),(3,1),(1,4)))
  4. 掃描一遍點的集合(這里是(1,2,3,4)),如果都被標記了,那么就是連通圖(對應“每個城市都有道路經過”);否則不是。

當計算機運行之后,我們開心的發現,得出了想要的結果。更開心的是它不僅可以對這幾個城市查詢道路,還可以對更多的城市做同樣的查詢!我們因此省去了自己人工查詢的繁瑣。
具體如何實現這個算法還要涉及更底層的方面,不過我想到這里數據結構與算法已經體現出來了——正是有了這兄弟倆,我們才能讓借助計算機來得到想要的東西,從而大大方便我們的生活,以及創造出如此眾多神奇的科技。

愈往深處和廣處學習,愈覺得人類智慧的偉大。
數據結構與算法,正是前人在計算機領域智慧結晶的集中領域之一,我想有時甚至不需要知道學好它有什么用,因為體悟智慧本身不就是一種享受嗎?

作者:猴鼻帕5
鏈接:https://zhidao.baidu.com/question/1951067610918494068.html
來源:百度知道

本人乃一個數據癡迷者,在計算機的道路上,也是一個數據結構的癡迷者,現在大學里面和同學搞開發也癡迷于數據庫,我就我個人的理解給你談一談:
首先,數據結構是一門計算機語言學的基礎學科,它不屬于任何一門語言,其體現的是幾乎所有標準語言的算法的思想。

上面的概念有一些模糊,我們現在來具體說一說,相信你們的數據結構使用的是一門具體的語言比如C/C++語言來說明,那是為了輔助的學習數據結構,而數據結構本身不屬于任何語言(相信你把書上的程序敲到電腦里面是不能通過的吧,其只是描述了過程,要調試程序,還需要修改和增加一些東西)。

你們的書上開始應該在講究數據的物理存儲結構/邏輯存儲結構等概念,說明數據結構首先就是“數據的結構”,在內存上的存儲方式,就是物理的存儲結構,在程序使用人員的思想上它是邏輯的,比如:
你們在C/C++中學習到鏈表,那么鏈表是什么一個概念,你們使用指針制向下一個結點的首地址,讓他們串聯起來,形成一個接一個的結點,就像顯示生活中的火車一樣。而這只是對于程序員的概念,但是在內存中存儲的方式是怎樣的那?對于你程序員來說這是“透明”的,其內部分配空間在那里,都是隨機的,而內存中也沒有一個又一根的線將他們串聯起來,所以,這是一個物理與邏輯的概念,對于我們程序員只需要知道這些就可以了,而我們主要要研究的是“邏輯結構”。

我可以給你一個我自己總結的一個概念:所有的算法必須基于數據結構生存。也就是說,我們對于任何算法的編寫,必須依賴一個已經存在的數據結構來對它進行操作,數據結構成為算法的操作對象,這也是為什么算法和數據結構兩門分類不分家的概念,算法在沒有數據結構的情況下,沒有任何存在的意義;而數據結構沒有算法就等于是一個尸體而沒有靈魂。

估計這個對于算法的初學者可能有點暈,我們在具體的說一些東西吧:我們在數據結構中最簡單的是什么:我個人把書籍中線性表更加細化一層(這里是為了便于理解在這樣說的):

單個元素,比如:int i;這個i就是一個數據結構,它是一個什么樣的數據結構,就是一個類型為int的變量,我們可以對它進行加法/減法/乘法/除法/自加等等一系列操作,當然對于單個元素我們對它的數據結構和算法的研究沒有什么意義,因為它本來就是原子的,某些具體運算上可能算法存在比較小的差異;

而提升一個層次:就是我們的線性表(一般包含有:順序表/鏈表)那么我們研究這樣兩種數據結構主要就是要研究它的什么東西那?一般我們主要研究他們以結構為單位(就是結點)的增加/刪除/修改/檢索(查詢)四個操作(為什么有這樣的操作,我在下面說到),我們一般把“增加/刪除/修改”都把它稱為更新,對于一個結點,若要進行更新一類的操作比如:刪除,對于順序表來說是使用下標訪問方式,那么我們在刪除了一個元素后需要將這個元素后的所有元素后的所有元素全部向前移動,這個時間是對于越長的順序表,時間越長的,而對于鏈表,沒有順序的概念,其刪除元素只需要將前一個結點的指針指向被刪除點的下一個結點,將空間使用free()函數進行釋放,還原給操作系統。當執行檢索操作的時候,由于順序表直接使用下標進行隨機訪問,而鏈表需要從頭開始訪問一一匹配才可以得到使用的元素,這個時間也是和鏈表的結點個數成正比的。

所以我們每一種數據結構對于不同的算法會產生不同的效果,各自沒有絕對的好,也沒有絕對的不好,他們都有自己的應用價值和方式;這樣我們就可以在實際的項目開發中,對于內部的算法時間和空間以及項目所能提供的硬件能力進行綜合評估,以讓自己的算法能夠更加好。
(在這里只提到了基于數據結構的一個方面就是:速度,其實算法的要素還應該包括:穩定性、健壯性、正確性、有窮性、可理解性、有輸入和輸出等等)

為什么要以結點方式進行這些亂七八糟的操作那?首先明確一個概念就是:對于過程化程序設計語言所提供的都是一些基礎第一信息,比如一些關鍵字/保留字/運算符/分界符。

而我們需要用程序解決現實生活中的問題,比如我們要程序記錄某公司人員的情況變化,那么人員這個數據類型,在程序設計語言中是沒有的,那么我們需要對人員的內部信息定義(不可能完全,只是我們需要那些就定義那些),比如:年齡/性別/姓名/出生日期/民族/工作單位/職稱/職務/工資狀態等,那么就可以用一些C/C++語言描述了,如年齡我們就可以進行如下定義:
int age;/age變量,表示人員公司人員的年齡/
同理進行其他的定義,我們用結構體或類把他們封裝成自定義數據類型或類的形式,這樣用他們定義的就是一個人的對象的了,它內部包含了很多的模板數據了。

不知道你看完后,有沒有新的收獲?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內容