一训柴、學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)有什么用?

打算把數(shù)據(jù)結(jié)構(gòu)跟算法的知識捋一捋,所以新建了個文集。
很多人都說這是內(nèi)功,那學(xué)這個到底有什么用呢,我找了幾篇蠻有道理的文章轉(zhuǎn)了過來,來堅(jiān)定下學(xué)習(xí)的信念砰奕。

我看完這幾篇后覺得,學(xué)這個最重要的是學(xué)會了把現(xiàn)實(shí)中的實(shí)際問題抽象為計(jì)算機(jī)能夠理解的數(shù)據(jù)模型,然后施加以算法以解決問題康震。

找的文章如下:

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

《數(shù)據(jù)結(jié)構(gòu)》是計(jì)算機(jī)專業(yè)的一門必修課旋炒, 可是很多學(xué)生學(xué)完以后,覺得用處不大签杈, 還不如學(xué)個C,Java來的直接一點(diǎn)。

等到工作了以后做業(yè)務(wù)系統(tǒng)開發(fā)鼎兽,發(fā)現(xiàn)根本就用不到那些書中的講的二叉樹答姥、圖、排序算法谚咬, 更加覺得這門課是在浪費(fèi)時間了鹦付。

這種想法實(shí)際上是錯誤的。

學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)择卦,并不僅僅是學(xué)習(xí)其中現(xiàn)成的那些隊(duì)列敲长,堆棧,二叉樹秉继,圖等經(jīng)典結(jié)構(gòu)祈噪, 也不僅僅是學(xué)習(xí)其中的那些快速排序、冒泡排序等算法尚辑。

更重要的是你要學(xué)習(xí)一種思想:如何把現(xiàn)實(shí)問題轉(zhuǎn)化為計(jì)算機(jī)語言的表示辑鲤。

計(jì)算機(jī)其實(shí)一種很笨,很機(jī)械的機(jī)器杠茬,只會按照預(yù)定的指令一步步執(zhí)行月褥, 而計(jì)算機(jī)語言的特點(diǎn)就是精確、無二意瓢喉, 它的本質(zhì)語言是二進(jìn)制的宁赤, 即使是C,Java等高級一點(diǎn)的語言也只不過是包裝而已, 它的表達(dá)能力并沒有本質(zhì)的提升栓票, 仍然停留在很低的層次决左。

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

到底該怎么轉(zhuǎn)化, 《數(shù)據(jù)結(jié)構(gòu)》已經(jīng)給出了指引: 設(shè)計(jì)出數(shù)據(jù)結(jié)構(gòu)挚躯, 在施加以算法就行了强衡, 當(dāng)然現(xiàn)實(shí)問題會更復(fù)雜, 需要框架码荔,類庫纤控,模式等支撐。

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

很多半路出家的人, 僅僅上了個培訓(xùn)班后參加工作硼瓣, 寫出的代碼實(shí)在是慘不忍睹究飞, 很明顯只掌握了工具,邏輯思維的訓(xùn)練遠(yuǎn)遠(yuǎn)不足堂鲤。

就我個人而言亿傅, 大學(xué)時學(xué)《數(shù)據(jù)結(jié)構(gòu)》以后, 為了準(zhǔn)備高級程序員考試瘟栖, 把里邊的習(xí)題全部做了一遍葵擎, 發(fā)現(xiàn)真是受益匪淺, 不但高程的成績非常好半哟, 更重要的是在后來的工作中酬滤,遇到數(shù)據(jù)結(jié)構(gòu)相關(guān)的實(shí)際問題, 基本上沒有什么障礙寓涨,只要掌握了語言特性盯串, 解決起來非常輕松。

總結(jié)一下戒良,《數(shù)據(jù)結(jié)構(gòu)》這門課其實(shí)會潛移默化的影響你的邏輯思維嘴脾, 當(dāng)然, 你需要多多練習(xí)才有可能使用純熟蔬墩, 等它變成身體一部分以后译打, 你就發(fā)現(xiàn)其實(shí)大部分編程任務(wù)都沒什么難度了,更難的其實(shí)是對編程更高的要求:抽象的能力拇颅。

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

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

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

舉個不甚恰當(dāng)?shù)睦樱?br> 比如我們計(jì)劃去旅游,我們手里有地圖痹届,想知道計(jì)劃中的幾個城市直接是否都有高速公路可以走呻待,從而不會有某個城市因道路不通而無法驅(qū)車前往。雖然我們可以自己去查队腐,但是我們有計(jì)算機(jī)安献健!于是我們想借助它來完成這個任務(wù)柴淘,于是進(jìn)行了第一步抽象——將城市表示為一個個點(diǎn)迫淹,道路表示為邊,結(jié)合起來形成了叫圖的數(shù)據(jù)結(jié)構(gòu)为严。我們想知道的便是——這張圖是否是一個連通圖敛熬?比如我們用1、2梗脾、3、4分別表示“北上廣深”(僅作意會)盹靴,線段表示道路炸茧,于是有了這張圖:

圖.png

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

  1. 選擇第一個節(jié)點(diǎn)并進(jìn)行標(biāo)記碉渡。
  2. 重復(fù)第3步直到?jīng)]有新的節(jié)點(diǎn)可以被標(biāo)記。
  3. 對于G中的每個節(jié)點(diǎn)Ni母剥,如果有一條邊與其相連滞诺,且邊的另一頭是一個已經(jīng)被標(biāo)記的節(jié)點(diǎn)Nj(i不等于j)形导,那么將Ni進(jìn)行標(biāo)記。(這一步要借助上面寫出的“邊的集合”((1,2),(2,3),(3,1),(1,4)))
  4. 掃描一遍點(diǎn)的集合(這里是(1,2,3,4))习霹,如果都被標(biāo)記了朵耕,那么就是連通圖(對應(yīng)“每個城市都有道路經(jīng)過”);否則不是淋叶。

當(dāng)計(jì)算機(jī)運(yùn)行之后阎曹,我們開心的發(fā)現(xiàn),得出了想要的結(jié)果爸吮。更開心的是它不僅可以對這幾個城市查詢道路芬膝,還可以對更多的城市做同樣的查詢!我們因此省去了自己人工查詢的繁瑣形娇。
具體如何實(shí)現(xiàn)這個算法還要涉及更底層的方面锰霜,不過我想到這里數(shù)據(jù)結(jié)構(gòu)與算法已經(jīng)體現(xiàn)出來了——正是有了這兄弟倆,我們才能讓借助計(jì)算機(jī)來得到想要的東西桐早,從而大大方便我們的生活癣缅,以及創(chuàng)造出如此眾多神奇的科技。

愈往深處和廣處學(xué)習(xí)哄酝,愈覺得人類智慧的偉大友存。
數(shù)據(jù)結(jié)構(gòu)與算法,正是前人在計(jì)算機(jī)領(lǐng)域智慧結(jié)晶的集中領(lǐng)域之一陶衅,我想有時甚至不需要知道學(xué)好它有什么用屡立,因?yàn)轶w悟智慧本身不就是一種享受嗎?

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

本人乃一個數(shù)據(jù)癡迷者,在計(jì)算機(jī)的道路上,也是一個數(shù)據(jù)結(jié)構(gòu)的癡迷者,現(xiàn)在大學(xué)里面和同學(xué)搞開發(fā)也癡迷于數(shù)據(jù)庫,我就我個人的理解給你談一談:
首先,數(shù)據(jù)結(jié)構(gòu)是一門計(jì)算機(jī)語言學(xué)的基礎(chǔ)學(xué)科搀军,它不屬于任何一門語言膨俐,其體現(xiàn)的是幾乎所有標(biāo)準(zhǔn)語言的算法的思想。

上面的概念有一些模糊罩句,我們現(xiàn)在來具體說一說焚刺,相信你們的數(shù)據(jù)結(jié)構(gòu)使用的是一門具體的語言比如C/C++語言來說明,那是為了輔助的學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)门烂,而數(shù)據(jù)結(jié)構(gòu)本身不屬于任何語言(相信你把書上的程序敲到電腦里面是不能通過的吧乳愉,其只是描述了過程,要調(diào)試程序屯远,還需要修改和增加一些東西)蔓姚。

你們的書上開始應(yīng)該在講究數(shù)據(jù)的物理存儲結(jié)構(gòu)/邏輯存儲結(jié)構(gòu)等概念,說明數(shù)據(jù)結(jié)構(gòu)首先就是“數(shù)據(jù)的結(jié)構(gòu)”慨丐,在內(nèi)存上的存儲方式赂乐,就是物理的存儲結(jié)構(gòu),在程序使用人員的思想上它是邏輯的咖气,比如:
你們在C/C++中學(xué)習(xí)到鏈表挨措,那么鏈表是什么一個概念挖滤,你們使用指針制向下一個結(jié)點(diǎn)的首地址,讓他們串聯(lián)起來浅役,形成一個接一個的結(jié)點(diǎn)斩松,就像顯示生活中的火車一樣。而這只是對于程序員的概念觉既,但是在內(nèi)存中存儲的方式是怎樣的那惧盹?對于你程序員來說這是“透明”的,其內(nèi)部分配空間在那里瞪讼,都是隨機(jī)的钧椰,而內(nèi)存中也沒有一個又一根的線將他們串聯(lián)起來,所以符欠,這是一個物理與邏輯的概念嫡霞,對于我們程序員只需要知道這些就可以了,而我們主要要研究的是“邏輯結(jié)構(gòu)”希柿。

我可以給你一個我自己總結(jié)的一個概念:所有的算法必須基于數(shù)據(jù)結(jié)構(gòu)生存诊沪。也就是說,我們對于任何算法的編寫曾撤,必須依賴一個已經(jīng)存在的數(shù)據(jù)結(jié)構(gòu)來對它進(jìn)行操作端姚,數(shù)據(jù)結(jié)構(gòu)成為算法的操作對象,這也是為什么算法和數(shù)據(jù)結(jié)構(gòu)兩門分類不分家的概念挤悉,算法在沒有數(shù)據(jù)結(jié)構(gòu)的情況下渐裸,沒有任何存在的意義;而數(shù)據(jù)結(jié)構(gòu)沒有算法就等于是一個尸體而沒有靈魂装悲。

估計(jì)這個對于算法的初學(xué)者可能有點(diǎn)暈昏鹃,我們在具體的說一些東西吧:我們在數(shù)據(jù)結(jié)構(gòu)中最簡單的是什么:我個人把書籍中線性表更加細(xì)化一層(這里是為了便于理解在這樣說的):

單個元素,比如:int i;這個i就是一個數(shù)據(jù)結(jié)構(gòu)衅斩,它是一個什么樣的數(shù)據(jù)結(jié)構(gòu)盆顾,就是一個類型為int的變量怠褐,我們可以對它進(jìn)行加法/減法/乘法/除法/自加等等一系列操作畏梆,當(dāng)然對于單個元素我們對它的數(shù)據(jù)結(jié)構(gòu)和算法的研究沒有什么意義,因?yàn)樗緛砭褪窃拥哪卫粒承┚唧w運(yùn)算上可能算法存在比較小的差異奠涌;

而提升一個層次:就是我們的線性表(一般包含有:順序表/鏈表)那么我們研究這樣兩種數(shù)據(jù)結(jié)構(gòu)主要就是要研究它的什么東西那?一般我們主要研究他們以結(jié)構(gòu)為單位(就是結(jié)點(diǎn))的增加/刪除/修改/檢索(查詢)四個操作(為什么有這樣的操作磷杏,我在下面說到)溜畅,我們一般把“增加/刪除/修改”都把它稱為更新,對于一個結(jié)點(diǎn)极祸,若要進(jìn)行更新一類的操作比如:刪除慈格,對于順序表來說是使用下標(biāo)訪問方式怠晴,那么我們在刪除了一個元素后需要將這個元素后的所有元素后的所有元素全部向前移動,這個時間是對于越長的順序表浴捆,時間越長的蒜田,而對于鏈表,沒有順序的概念选泻,其刪除元素只需要將前一個結(jié)點(diǎn)的指針指向被刪除點(diǎn)的下一個結(jié)點(diǎn)冲粤,將空間使用free()函數(shù)進(jìn)行釋放,還原給操作系統(tǒng)页眯。當(dāng)執(zhí)行檢索操作的時候梯捕,由于順序表直接使用下標(biāo)進(jìn)行隨機(jī)訪問,而鏈表需要從頭開始訪問一一匹配才可以得到使用的元素窝撵,這個時間也是和鏈表的結(jié)點(diǎn)個數(shù)成正比的傀顾。

所以我們每一種數(shù)據(jù)結(jié)構(gòu)對于不同的算法會產(chǎn)生不同的效果,各自沒有絕對的好忿族,也沒有絕對的不好锣笨,他們都有自己的應(yīng)用價(jià)值和方式;這樣我們就可以在實(shí)際的項(xiàng)目開發(fā)中道批,對于內(nèi)部的算法時間和空間以及項(xiàng)目所能提供的硬件能力進(jìn)行綜合評估错英,以讓自己的算法能夠更加好。
(在這里只提到了基于數(shù)據(jù)結(jié)構(gòu)的一個方面就是:速度隆豹,其實(shí)算法的要素還應(yīng)該包括:穩(wěn)定性椭岩、健壯性、正確性璃赡、有窮性判哥、可理解性、有輸入和輸出等等)

為什么要以結(jié)點(diǎn)方式進(jìn)行這些亂七八糟的操作那碉考?首先明確一個概念就是:對于過程化程序設(shè)計(jì)語言所提供的都是一些基礎(chǔ)第一信息塌计,比如一些關(guān)鍵字/保留字/運(yùn)算符/分界符。

而我們需要用程序解決現(xiàn)實(shí)生活中的問題侯谁,比如我們要程序記錄某公司人員的情況變化锌仅,那么人員這個數(shù)據(jù)類型,在程序設(shè)計(jì)語言中是沒有的墙贱,那么我們需要對人員的內(nèi)部信息定義(不可能完全热芹,只是我們需要那些就定義那些),比如:年齡/性別/姓名/出生日期/民族/工作單位/職稱/職務(wù)/工資狀態(tài)等惨撇,那么就可以用一些C/C++語言描述了伊脓,如年齡我們就可以進(jìn)行如下定義:
int age;/age變量,表示人員公司人員的年齡/
同理進(jìn)行其他的定義魁衙,我們用結(jié)構(gòu)體或類把他們封裝成自定義數(shù)據(jù)類型或類的形式报腔,這樣用他們定義的就是一個人的對象的了株搔,它內(nèi)部包含了很多的模板數(shù)據(jù)了。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纯蛾,一起剝皮案震驚了整個濱河市邪狞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茅撞,老刑警劉巖帆卓,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異米丘,居然都是意外死亡剑令,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門拄查,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吁津,“玉大人,你說我怎么就攤上這事堕扶“啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵稍算,是天一觀的道長典尾。 經(jīng)常有香客問我,道長糊探,這世上最難降的妖魔是什么钾埂? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮科平,結(jié)果婚禮上褥紫,老公的妹妹穿的比我還像新娘。我一直安慰自己瞪慧,他們只是感情好髓考,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弃酌,像睡著了一般氨菇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矢腻,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天门驾,我揣著相機(jī)與錄音射赛,去河邊找鬼多柑。 笑死,一個胖子當(dāng)著我的面吹牛楣责,可吹牛的內(nèi)容都是我干的竣灌。 我是一名探鬼主播聂沙,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼初嘹!你這毒婦竟也來了及汉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤屯烦,失蹤者是張志新(化名)和其女友劉穎坷随,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驻龟,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡温眉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翁狐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片类溢。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖露懒,靈堂內(nèi)的尸體忽然破棺而出闯冷,到底是詐尸還是另有隱情,我是刑警寧澤懈词,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布蛇耀,位于F島的核電站,受9級特大地震影響坎弯,放射性物質(zhì)發(fā)生泄漏蒂窒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一荞怒、第九天 我趴在偏房一處隱蔽的房頂上張望洒琢。 院中可真熱鬧,春花似錦褐桌、人聲如沸衰抑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呛踊。三九已至,卻和暖如春啦撮,著一層夾襖步出監(jiān)牢的瞬間谭网,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工赃春, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愉择,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像锥涕,于是被迫代替她去往敵國和親衷戈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容