學習數據結構有什麼用?
1.學習數據結構有什麼用?
2.學習演算法有必要嗎?
個人認為數據結構是編程最重要的基本功沒有之一!
學了順序表和鏈表,你就知道,在查詢操作更多的程序中,你應該用順序表;而修改操作更多的程序中,你要使用鏈表;而單向鏈表不方便怎麼辦,每次都從頭到尾好麻煩啊,怎麼辦?你這時就會想到雙向鏈表or循環鏈表。
學了棧之後,你就知道,很多涉及後入先出的問題,例如函數遞歸就是個棧模型、Android的屏幕跳轉就用到棧,很多類似的東西,你就會第一時間想到:我會用這東西來去寫演算法實現這個功能。
學了隊列之後,你就知道,對於先入先出要排隊的問題,你就要用到隊列,例如多個網路下載任務,我該怎麼去調度它們去獲得網路資源呢?再例如操作系統的進程(or線程)調度,我該怎麼去分配資源(像CPU)給多個任務呢?肯定不能全部一起擁有的,資源只有一個,那就要排隊!那麼怎麼排隊呢?用普通的隊列?但是對於那些優先順序高的線程怎麼辦?那也太共產主義了吧,這時,你就會想到了優先隊列,優先隊列怎麼實現?用堆,然後你就有疑問了,堆是啥玩意?自己查吧,敲累了。
總之好好學數據結構就對了。我覺得數據結構就相當於:我塞牙了,那麼就要用到牙籤這「數據結構」,當然你用指甲也行,只不過「性能」沒那麼好;我要擰螺母,肯定用扳手這個「數據結構」,當然你用鉗子也行,只不過也沒那麼好用。學習數據結構,就是為了了解以後在IT行業里搬磚需要用到什麼工具,這些工具有什麼利弊,應用於什麼場景。以後用的過程中,你會發現這些基礎的「工具」也存在著一些缺陷,你不滿足於此工具,此時,你就開始自己在這些數據結構的基礎上加以改造,這就叫做自定義數據結構。而且,你以後還會造出很多其他應用於實際場景的數據結構。。你用這些數據結構去造輪子,不知不覺,你成了又一個輪子哥。簡單的說,你去學Python了,到工作中,一個負載稍高一點的Python網站,你不懂數據結構,你都不知道 List 和 Dictionary 的性能曲線大概會怎麼變,需要深度優化的時候怎麼下手。
你才大一,不要被那些浮躁的言論騙了。好好讀書,基礎打好。《數據結構》是計算機專業的一門必修課, 可是很多學生學完以後,覺得用處不大, 還不如學個C,Java來的直接一點。
等到工作了以後做業務系統開發,發現根本就用不到那些書中的講的二叉樹、圖、排序演算法, 更加覺得這門課是在浪費時間了。
這種想法實際上是錯誤的。
學習數據結構,並不僅僅是學習其中現成的那些隊列,堆棧,二叉樹,圖等經典結構, 也不僅僅是學習其中的那些快速排序、冒泡排序等演算法。
更重要的是你要學習一種思想:如何把現實問題轉化為計算機語言的表示。
計算機其實一種很笨,很機械的機器,只會按照預定的指令一步步執行, 而計算機語言的特點就是精確、無二意, 它的本質語言是二進位的, 即使是C,Java等高級一點的語言也只不過是包裝而已, 它的表達能力並沒有本質的提升, 仍然停留在很低的層次。
而我們用的自然語言則是典型的模糊的,不精確的, 程序員面臨的一個重要問題, 或者是我們的主要工作就是怎麼把自然語言描述的問題轉化為計算機語言的表示。
到底該怎麼轉化, 《數據結構》已經給出了指引: 設計出數據結構, 在施加以演算法就行了, 當然現實問題會更複雜, 需要框架,類庫,模式等支撐。
這是一種非常重要的邏輯思維能力的鍛煉, 也是程序員入門的條件。
很多半路出家的人, 僅僅上了個培訓班後參加工作, 寫出的代碼實在是慘不忍睹, 很明顯只掌握了工具,邏輯思維的訓練遠遠不足。
就我個人而言, 大學時學《數據結構》以後, 為了準備高級程序員考試, 把裡邊的習題全部做了一遍, 發現真是受益匪淺, 不但高程的成績非常好, 更重要的是在後來的工作中,遇到數據結構相關的實際問題, 基本上沒有什麼障礙,只要掌握了語言特性, 解決起來非常輕鬆。
總結一下,《數據結構》這門課其實會潛移默化的影響你的邏輯思維, 當然, 你需要多多練習才有可能使用純熟, 等它變成身體一部分以後, 你就發現其實大部分編程任務都沒什麼難度了,更難的其實是對編程更高的要求:抽象的能力。
歡迎關注我的微信公眾號:碼農翻身
學好數據結構,可以讓程序跑得快一點唄。
最近和Telerik鬥爭良久,各種優化,各種修改它的代碼,把它內部的實現開個口子,好接管其數據結構,然後提供自己的實現,那性能都蹭蹭蹭地提高。
在此還得感謝Telerik提供的劣質代碼,可以有充分的空間發揮自身價值,博取老闆歡心。數據結構沒學好的,校招就等著吃虧吧。
校招季,多少人因為基本的數據結構不會直接在前兩輪面試就被pass掉我就不說了。
不然你以為我為什麼會轉行數據分析?
我開玩笑的,
但是前兩句是真的。
數據結構和演算法是一部發展史,發明他們就是為了「做出東西」,學習他們是為了不重複發明輪子,當你在「做東西」時遇到運行效率上的瓶頸,就可以參考這些前人的方案,當學完後,就能評估出一個「東西」以現在的技術是否可能做出來
有人羅列xx結構、xx演算法能幹嘛幹嘛全是屁話,書上都有。說白了這東西就是前人的公式,學習就是為了套公式解決問題的,解決世界難題就要發明新公式(演算法/結構)能否做出來包括兩點:效率是否能承受,功能是否能實現一些語言包裝了大量基礎演算法,用於快速實現功能,一般效率也是可以接受的
當效率不能接受,就需要調整演算法和結構,c甚至彙編題主應該是想做看得見摸得著的東西,所以應該選擇抽象級別高的語言。先定這「東西」幹嘛用的,拆分所有要實現的細節,逐個完成,當它運作起來並快如預期,就做完了 是否有必要深入學,和你在實現過程中的效率需求有關我認為數據結構是程序設計中的第二層。第一層是抽象,把你想要描述的東西用程序語言抽象出來。比如說一個人,你應該用怎樣的類去儲存,這是第一層抽象。數據結構的作用是,如何將數據組織起來。為什麼要將數據組織起來?因為計算機無法理解你的抽象,它不知道這個人的爸爸是他,兄弟是他,得由你程序猿來告訴它。為什麼不知道,因為計算機中只有0和1,數據都是0和1,這個節點和那個節點的關係,二者如何互相得到,這是程序員要做的,數據結構教的。因為計算機不知道怎麼做。演算法是什麼,演算法就是如何在節點與節點之間,狀態與狀態之間相互轉移。
好多人從演算法和數據結構本身出發,來解答題主的問題。
我來從你的角度來給你一個通用的答案。
當你在考慮學一個東西值不值得的時候,你應該去把它學了,不然往往會後悔。
又花不了多少時間,早晚要學的。其實很多時候別人再說「有用」你也聽不進去,因為你沒學過就是不明白為啥別人說「有用」。有那時間都學完了。學習數據結構可以避免被我罵笨蛋唄
想學 Python 就去學。不過先決定好,別學一半就放棄又去學別的什麼東西。數據結構的話,能看懂代碼沒啥用,要知道各種數據結構的特性。比如你要知道 Python 里的 list 和 dict 和 set 在判定指定元素是否存在時有什麼區別。具體的數據結構是次要的,對目標問題的可利用的屬性、數學模型的特殊屬性、以及運行系統的物理屬性保持高度敏感才是關鍵。數據結構課程不厭其煩講解那麼多例子就是讓你建立這種「機敏」的世界觀
你查東西只會遍歷么
避免你寫出性能底下甚至是不可用的程序。
樓上已經回答的很好了。
數據結構和演算法,就好比兵法,懂排兵布陣的將軍,要比不懂的要更能把控戰爭的贏面。有沒有必要學習,這個不用討論了吧?
學會數據結構和演算法會擴展你的視野,比如,你平時編程中用到數組,不懂數據結構和演算法,你只能認識到數組就只是存儲一系列有序元素的集合而已,但是你懂了數據結構,你會對數組的認識更加深刻。
平時的工作中,你覺得你用不著數據結構和演算法,很有可能是你沒有這種思想意識,所以你感覺自己沒有用到,但實際上你用到了,你不一定要每天去寫新的演算法,但是你寫的80%的程序,背後都會有數據結構和演算法的影子。數據結構和演算法非常有用
如果你不學這些,你依然可以靠拼接別人的示範代碼過活。可是,那樣的話別人的代碼對你來說就都是黑盒子,知其然而不知其所以然。尤其如果你的程序速度慢的時候,你會完全不知道為什麼慢,然後完全沒法調整。同樣,要對程序進行改造的時候,沒有這些功底,你同樣也會徹底抓瞎。有些東西不是學了就能立竿見影的看出效果的,但它會影響你之後所做的一切。演算法和數據結構就是這樣的東西。數據結構可以幫助你在分析業務時,快速定義對象和實現演算法!別人業務給你講清楚,你就知道能不能實現了,編碼是另外的事情了!
就我來說吧…我覺得大一這一年知道的最有用的一件事是:
想做自己的東西,想做自己的應用,就不要想著它眼前的用途。
就那數據結構來說,你開始可能認為這個東西看了半天寫不了任何應用,沒什麼實際價值。可事實上,它的價值遠超你任何一門程序設計語言的語法。
你可以精通10門語言,了解各種設計模式,各種框架,但是少了數據結構,你就永遠走不遠,像一個握有幾百種民房設計圖紙的建築設計師一樣,你也不可能能設計的出迪拜塔。
很多人以為本科生做兩個小項目,接幾個外包,做幾個App,搞搞自己的博客就很厲害,其實,如果你就被這點東西迷惑,那麼,你的水平也就到這裡了。
工程師不是隨便動動手就能當的,本科不是培訓學校。能大幅漲工資,你說有沒有用?
1,你之所以覺得沒有用是因為你沒用到。
2,想學什麼都行,但是想清楚,你以後要做什麼。如果做嵌入式,學什麼python,如果做科研,學matlab,沒什麼語言適應所有情況的。最忌諱像我這樣的反例:幾乎什麼都懂,也保證什麼都不懂。
3,數據結構會讓你寫出時間複雜度很高的代碼時有負罪感,而我學習嵌入式開發的後遺症就是對於最多不超過255的int(short),如果我用16或者32位的int代替它的功能會有一種浪費內存的罪惡感。思維
首先回答,學習數據結構非常有用,它是計算機從業人員一項重要的基本功。
每年計算機系畢業生那麼多,如何區分精英和普通碼農的一個很重要的衡量指標就是專業基本功夠不夠紮實。下面對數據結構在專業上的作用,我說一下我的看法。
在某些特定的情況下,語言提供的基本數據結構(例如int,char,string …)不能滿足你的使用需求,這個時候你就需要更高級的數據結構來應付這些情況。就像武功招式,你用慣了基礎招式,就需要學習殺傷力更強用途更廣的招式。 相當於基礎武功之上的二級招式。當你了解了這些招式,像鏈表,堆棧,二叉樹,圖等等,你就可以用更深厚的底氣來面對計算機的世界,你可以知道網路裡面節點的互相連接就是圖的具體實例,你可以用圖的最短路徑演算法求出實際網路上一個節點到另一個節點的最短路徑,你可以知道操作系統裡面海量的文件可以由B+/B-樹來組織,你可以知道進程管理裡面可以用優先隊列(堆)調度帶優先順序的進程,你可以知道函數的調用就是對系統棧的操作。
簡單來說,你可以加深對計算機世界的理解。另一方面,某些數據結構在特定的環境下可以提高使用者的效率。
例如用二叉樹來查找,樹形結構在查找中很大的一個好處就是減免了很多不必要的查找。當你按左小右大(左半邊的所有數都小於中間的數,右半邊所有數都大於中間的數)的方式組織好一個數列的二叉樹,你可以每次只和中間的數比較,不斷縮小範圍就可以找到你要找的數。如此顯然比順序查找要快的多。當你學完數據結構,你也會順帶著對演算法有了一些了解,因為數據結構和演算法往往是不分家的,演算法常常需要特定的數據結構支持。
例如圖論的演算法幾乎都要圖的數據結構支持。如果說數據結構是二級招式,還是基礎內功的範圍,是輔助性的,那麼演算法就是赤裸裸的大殺器,它可以用來純粹的提高程序的效率(這裡是狹義的演算法)。
當你匹配字元串的時候,把演算法換成kmp,時間複雜度立刻從O(n^2)爆增到線性的O(n),那酸爽,和操作著笨重的順序匹配,不可同日而語。說了這麼多,你也大概明白了數據結構和演算法的重要性,所以我的建議是,先打好基礎,一步一步慢慢來,打好下層建築,才能壘起萬丈高樓,君不見豆腐渣工程是多麼害人害己。推薦閱讀:
※為什麼 Python 中的複數形式是 (a + bj) 而不是 (a + bi) ?
※py交易的梗是怎麼出現的?
※我用flask-sqlalchemy為什麼無法更新我的sqlite文件?
※Python 中 a+=b 和 a=a+b 的區別有哪些?
※現在哪些編程技術比較火爆。需求量很大且待遇看漲?