「演算法,先於計算機存在於世,比編程語言本身更為重要。語言只是工具,演算法才是靈魂。」而程序就等於演算法加數據結構,足以可見,想要在編程之路上走得更長遠,數據結構與演算法是必須掌握的基本功。
在計算機編程領域,數據結構與演算法的應用無處不在,比如圖像視頻處理、數據壓縮、資料庫、游戲開發、操作系統、編譯器、搜索引擎、AR、VR、人工智慧、區塊鏈等領域,都是以數據結構與演算法為基石。只要你想做這一行,就必然要掌握數據結構與演算法。
演算法是各大名企面試題中的常客,越是厲害的公司,越是注重考查數據結構與演算法。但很可惜,很多人雖然技術不錯,但經常都會敗在演算法上。
數據結構與演算法屬於開發人員的基本內功,也能訓練大腦的思考能力,掌握一次,終生受益。扎實的數據結構與演算法功底,能讓開發者站在更高的角度去思考代碼、寫出性能更優的程序,能夠更快速地上手各種新技術。
2. 求問演算法,數據結構,數學等基礎課程真的沒有作用嗎
我的觀點是:很多東西你看上去用不到,但事實上他對你的作用是潛移默化的。
時不時會有朋友寫信問老趙學習上的一些迷茫,其中都有一些共性。例如說不知道該如何學習,說不知道朝哪個方向前進。也例如大家雖然基本上都知道「演算法」的重要性,但是卻總覺平時用不到。說它鍛煉能力,但「能力」是看不見摸不著的,學著學著就會「麻木」,感覺就「學不進去」了。當然這方面有幾個原因,有主觀也有客觀的,有需要周圍環境的改變,也有需要自己精神上「強壯度」的提高。這里呢,我們有時就不提「演算法」這個太具體的名詞了,而使用「基礎」來表示這一類「似乎重要,但不知道重要在哪裡」的東西。
還是先從演算法,數據結構這類大家從學校里首先都會學到的東西談起吧。如果說平時用不到演算法,那肯定是不可能的。什麼是演算法?解決問題的方法都是演算法,程序中任何對象及其關系都是數據結果。當然您可能會說,這里的說的演算法和數據結構是指「有名」的那種,例如大家都耳熟能詳的快速排序,圖、樹等等。當然,說到這個份上,可能就是要分兩條路走了。一,您的確只是一直在做普通的CRUD;二,您對於這些知識理解不夠,而無法感受到對它們的使用,很多時候我們運用所學的東西是自然而然的——更直接地說出來可能不太中聽:「為您掌握的不好,自然覺得沒用」。
打個比方,基本上所有的系統都會有「分類系統」,一個大分類下面有多個子分類,子分類下還會有更多子分類。那麼現在有了個需求:由於需要垂直地列在一個下拉框中供用戶選擇,而分類之間的關系使用縮進來表示。在這里分類結構其實就是一顆樹,而這個任務其實就是對樹的深度優先遍歷,於是可能您對書本印象比較深刻的話,就會說用遞歸,用回溯法。但是不少朋友雖然會解決這問題,解決的方式也不錯,可是卻沒有意識到自己在用什麼演算法或是數據結構——只是解決了一個問題而已。這其實也比較正常,如果您回憶一下可能就會想起來,學習演算法往往都會是依靠「演變」來的,只要具備了一定了邏輯思考能力,演算法和數據結構在「一定程度」上也是較為「自然」的東西,並非需要死記硬背。老趙認識個朋友,在做題的過程中把AVL樹給徹底忘了——是徹底忘了有這個東西,但是他發現二叉樹的退化之後,就自己設法通過旋轉來保持平衡。當然這種演變是一種「能力」,我們稍後再詳談。
不過很多時候出現的情況往往都是「不知道」導致「不會做」,至少也是「做不好」。打個比方,在您的程序中會用到大量的容器,您知道System.Collections命名空間下的容器都是用什麼數據結構實現,適合什麼樣的操作嗎?如果要求您在圖片上列印文字,並且按照固定長度換行,您會使用類似二分法的O(logN)演算法,還是直接遍歷的O(N)演算法呢?再比如把表達式樹用作緩存,如果您不了解前綴樹,二叉搜索樹,以及哈希表的實現方式,可能就只能做出字元串這個低效的選擇了。您可能又會想到說,「平時項目真的遇不到」,那麼老趙還是重復剛才的話「這個可以遇到」——只是您不知道有其他選擇而已。
如果跳出所謂演算法和數據結構,其實任何的基礎對您工作的作用大都類似。按照老趙之前舉過的例子,很多東西都是這樣:
了解Windows,才能寫出更好的.NET應用程序,或者作postmortem調試。
了解計算機體系結構,才能在多CPU,多核時代寫出真正高效而又正確的應用程序。
了解內存分頁或線程調度方式,對您應用中設計緩存策略或任務分配有很高的參考價值。
……能夠從紛繁復雜的選擇之中作出最合理的判斷和決策是一種能力,這需要對大量事物進行了解,分析,沉澱,並且能夠在腦海中形成映射。如果把人腦看作是一種存儲器的話,其中可以就是在一個個單元格中存放著兩大類信息:「知識」和「能力」。「知識」可以把問題轉化為解決方案,而「能力」則是把知識轉化為另一種知識。老趙不知道人腦在得到一個問題的時候是怎麼去尋找知識的,這涉及到不同人的索引方式。但是無論是哪種方式,信息越多,查找一次所需要的時間也勢必越多。如果沒有找到直接能夠解決問題的「知識」,則需要一個或多個「能力」把已有知識通過一次或多次轉化為另一種,可能是我們原本所沒有的知識,而這種能力,我們經常會把他們叫做「推理」,「演變」或者是「融會貫通」能力。
這也就是所謂「能力」最為關鍵的作用,它們可能也是人類在無法藉助外力的情況下唯一獲取新知識的途徑。
我們假設人腦可以存放的總信息數量確定,在這種情況下,知識太多,能力便少,則獲得新知識的成本增加;知識太少,能力雖多,卻在解決問題時都需要「推理演變」一番,這也是一種浪費,就好比很少有人會用「公理」去證明一個命題,因為使用「定理」或「推論」效率可以更高。因此,把「知識」和「能力」進行分配是一種藝術,只有達到一種和諧的平衡,一個人才能更好更快地解決問題。
老趙很笨,沒有學習的訣竅,唯「埋頭苦學」,「勤於思考」把字箴言爾,對我來說無論是「知識」和「能力」都由此而來。有朋友可能會說,我平時不主動學習,等需要的時候再去了解。老趙不同意這個觀點,因為這里有個悖論:如果您不自主學習,又如何可以在真正遇到問題的時候知道該使用什麼東西呢?做出合適的選擇是一個需要積累的過程,而如果不主動學習,很可能最終只會造成重復勞動。就像剛才提到那樣,我們需要對大量事物進行了解,分析,沉澱。可能有時候學不進去也要學吧,可能發現美的那一刻,只是因為量變終於引起質變了。
--------------------------------------------------------------------------------
其實引發老趙寫下這篇文章的原因是一次(或者說是幾次)面試。某培訓機構總是打電話來想要「介紹」他們一些學生來公司面試,其語言誠懇讓人不忍拒絕。可是一次又一次強調我們需要基礎扎實的學生,但是每一次帶來的讓人很不滿意。我在想,他們花了那麼長時間讀完大學,然後再花大筆大筆的錢去培訓機構「進修」,那麼多年下來還是如此水平,連我都不由得為他們心痛。當然這樣的情況是普遍狀況,與是否是某培訓機構的學生無關,這是我進行數百次面試中所發現的共同點。例如剛才培訓機構的學生,沒有一個人能夠把一個數組中所有元素反序一下,而一題簡單的字元串分割就能考倒9成的面試者。這樣的能力讓人如何可以接受?理由更加荒唐,有的說「我是學測試的,不是做專業開發的」,「我是做應用的,不熟悉演算法」——這種問題算是專業開發嗎?算是演算法嗎?
此外,上文也提到了,很多東西感覺「沒有用」是因為本身就不知道可以用。例如以下的一系列文章,目的是把表達式樹作為Key,在一個緩存容器中存儲數據。如果你不知道一些數據結構的內容,可能就只會想到「拼接成字元串(也就是下文的SimpleKeyCache)」一種情況了——然後就這樣使用,使用到頭。
最後你認為:數據結構還是用不到嘛。事實上呢?數據結構其實往往是推導而來的:
提出數據結構A,發現其缺點。
3. 數據結構和演算法應該掌握到什麼程度,需要掌握哪些知識
呵呵,思想很重要,其實真正使用時,已經有很多實現,但是理解數據結構和演算法對於以後所學東西的理解是非常有用的...至於程度的話,就看你需要達到什麼程度了..
像排序演算法,二分搜索演算法,深度優先和廣度有限搜索,當然,對於基本數據結構,棧,隊列,樹。都有一些基本的操作,
而基本演算法的思想應該有:
1、回溯
2、遞歸
3、貪心
4、動態規劃
5、分治
4. 我想把c++,數據結構演算法,資料庫,游戲軟體開發的基礎打扎實!系統結構我也要了解!我有很多網友都是
還是得保證有興趣,如果只是為了錢,很難做到年薪百萬,做到了你也會過得很痛苦很煎熬,得不償失。假如有那麼幾年,你每天得工作12個小時或者14個小時,周末經常得加班,而且拿的錢不比那些看似活得很輕松的同學多,那時候你還會有現在的熱情嗎?
5. 數據結構與演算法分析
本文出自:
www點54manong點com
請尊重原創,轉載請註明出處,謝謝!
什麼是數據結構,為什麼要學習數據結構?數據結構是否是一門純數學課程?它在專業課程體系中起什麼樣的作用?我們要怎麼才能學好數據結構?… 相信同學們在剛開始《數據結構》這門課的學習時,心裡有著類似前面幾個問題的這樣那樣的疑問。希望下面的內容能幫助大家消除疑惑,下定決心堅持學好這門課:
1 學習數據數據結構的意義
數據結構是計算機科學與技術專業、計算機信息管理與應用專業,電子商務等專業的基礎課,是十分重要的核心課程。所有的計算機系統軟體和應用軟體都要用到各種類型的數據結構。因此,要想更好地運用計算機來解決實際問題,僅掌握幾種計算機程序設計語言是難以應付當前眾多復雜的課題。要想有效地使用計算機、充分發揮計算機的性能,還必須學習和掌握好數據結構的有關知識。打好「數據結構」這門課程的扎實基礎,對於學習計算機專業的其他課程,如操作系統、資料庫管理系統、軟體工程、編譯原理、人工智慧、圖視學等都是十分有益的。
2 為什麼要學習數據結構
在計算機發展的初期,人們使用計算機的目的主要是處理數值計算問題。當我們使用計算機來解決一個具體問題時,一般需要經過下列幾個步驟:首先要從該具體問題抽象出一個適當的數學模型,然後設計或選擇一個解此數學模型的演算法,最後編出程序進行調試、測試,直至得到最終的解答。例如,求解梁架結構中應力的數學模型的線性方程組,可以使用迭代演算法來求解。
由於當時所涉及的運算對象是簡單的整型、實型或布爾類型數據,所以程序設計者的主要精力是集中於程序設計的技巧上,而無須重視數據結構。隨著計算機應用領域的擴大和軟、硬體的發展,非數值計算問題越來越顯得重要。據統計,當今處理非數值計算性問題佔用了85%以上的機器時間。這類問題涉及到的數據結構更為復雜,數據元素之間的相互關系一般無法用數學方程式加以描述。因此,解決這類問題的關鍵不再是數學分析和計算方法,而是要設計出合適的數據結構,才能有效地解決問題。下面所列舉的就是屬於這一類的具體問題。
例1:圖書館信息檢索系統。當我們根據書名查找某本書有關情況的時候;或者根據作者或某個出版社查找有關書籍的時候,或根據書刊號查找作者和出版社等有關情況的時候,只要我們建立了相關的數據結構,按照某種演算法編寫了相關程序,就可以實現計算機自動檢索。由此,可以在圖書館信息檢索系統中建立一張按書刊號順序排列的圖書信息表和分別按作者、書名、出版社順序排列的索引表,如圖1.1所示。由這四張表構成的文件便是圖書信息檢索的數學模型,計算機的主要操作便是按照某個特定要求(如給定書名)對圖書館藏書信息文件進行查詢。
諸如此類的還有學生信息查詢系統、商場商品管理系統、倉庫物資管理系統等。在這類文檔管理的數學模型中,計算機處理的對象之間通常存在著的是一種簡單的線性關系,這類數學模型可稱為線性的數據結構。
例2:八皇後問題。在八皇後問題中,處理過程不是根據某種確定的計演算法則,而是利用試探和回溯的探索技術求解。為了求得合理布局,在計算機中要存儲布局的當前狀態。從最初的布局狀態開始,一步步地進行試探,每試探一步形成一個新的狀態,整個試探過程形成了一棵隱含的狀態樹。如圖1.2所示(為了描述方便,將八皇後問題簡化為四皇後問題)。回溯法求解過程實質上就是一個遍歷狀態樹的過程。在這個問題中所出現的樹也是一種數據結構,它可以應用在許多非數值計算的問題中。
例3:教學計劃編排問題。一個教學計劃包含許多課程,在教學計劃包含的許多課程之間,有些必須按規定的先後次序進行,有些則沒有次序要求。即有些課程之間有先修和後續的關系,有些課程可以任意安排次序。這種各個課程之間的次序關系可用一個稱作圖的數據結構來表示,如圖1.3所示。有向圖中的每個頂點表示一門課程,如果從頂點vi到vj之間存在有向邊<vi,vj>,則表示課程i必須先於課程j進行。由以上三個例子可見,描述這類非數值計算問題的數學模型不再是數學方程,而是諸如線性表、樹、圖之類的數據結構。因此,可以說數據結構課程主要是研究非數值計算的程序設計問題中所出現的計算機操作對象以及它們之間的關系和操作的學科。
學習數據結構的目的是為了了解計算機處理對象的特性,將實際問題中所涉及的處理對象在計算機中表示出來並對它們進行處理。與此同時,通過演算法訓練來提高學生的思維能力,通過程序設計的技能訓練來促進學生的綜合應用能力和專業素質的提高。
3數據結構課程的內容
數據結構與數學、計算機硬體和軟體有十分密切的關系,它是介於數學、計算機硬體和計算機軟體之間的一門計算機專業的核心課程,是高級程序設計語言、操作系統、編譯原理、資料庫、人工智慧、圖視學等課程的基礎。同時,數據結構技術也廣泛應用於信息科學、系統工程、應用數學以及各種工程技術領域。
數據結構課程重在討論軟體開發過程中的方案設計階段、同時設計編碼和分析階段的若干基本問題。此外,為了構造出好的數據結構及其實現,還需考慮數據結構及其實現的評價與選擇。因此,數據結構的內容包括三個層次的五個「要素」,如圖1.3所示。
數據結構的核心技術是分解與抽象。通過分解可以劃分出數據的三個層次;再通過抽象,舍棄數據元素的具體內容,就得到邏輯結構。類似地,通過分解將處理要求劃分成各種功能,再通過抽象舍棄實現細節,就得到運算的定義。上述兩個方面的結合使我們將問題變換為數據結構。這是一個從具體(即具體問題)到抽象(即數據結構)的過程。然後,通過增加對實現細節的考慮進一步得到存儲結構和實現運算,從而完成設計任務。這是一個從抽象(即數據結構)到具體(即具體實現)的過程。熟練地掌握這兩個過程是數據結構課程在專業技能培養方面的基本目標。
結束語:數據結構作為一門獨立的課程在國外是從1968年才開始的,但在此之前其有關內容已散見於編譯原理及操作系統之中。20世紀60年代中期,美國的一些大學開始設立有關課程,但當時的課程名稱並不叫數據結構。1968年美國唐.歐.克努特教授開創了數據結構的最初體系,他所著的《計算機程序設計技巧》第一卷《基本演算法》是第一本較系統地闡述數據的邏輯結構和存儲結構及其操作的著作。從20世紀60年代末到70年代初,出現了大型程序,軟體也相對獨立,結構程序設計成為程序設計方法學的主要內容,人們越來越重視數據結構。從70年代中期到80年代,各種版本的數據結構著作相繼出現。目前,數據結構的發展並未終結,一方面,面向各專門領域中特殊問題的數據結構得到研究和發展,如多維圖形數據結構等;另一方面,從抽象數據類型和面向對象的觀點來討論數據結構已成為一種新的趨勢,越來越被人們所重視。
6. 作為一名優秀的程序員,要具備哪些基本功
程序員(英文Programmer)是從事程序開發、維護的專業人員。
作一個真正合格的程序員,需要具備:
1:團隊精神和協作能力
團隊精神和協作能力是作為一個程序員應具備的最基本的素質。
2:文檔習慣
文檔是一個軟體系統的生命力。作為代碼程序員,必須將30%的工作時間寫用於技術文檔。沒有文檔的程序員勢必會被淘汰。
3:規范化的代碼編寫習慣
知名軟體公司的代碼的變數命名、注釋格式,甚至嵌套中行縮進的長度和函數間的空行數字都有明確規定,良好的編寫習慣,不但有助於代碼的移植和糾錯,也有助於不同技術人員之間的協作。
4:需求理解能力
程序員要能正確理解任務單中描述的需求。
5:模塊化思維能力
作為一個優秀的程序員,其思想不能在局限當前的工作任務裡面,要想想看自己寫的模塊是否可以脫離當前系統存在,通過簡單的封裝在其他系統中或其他模塊中直接使用。
6:測試習慣
測試是軟體工程質量保證的重要環節,但是測試不僅僅是測試工程師的工作,而是每個程序員的一種基本職責。程序員要認識測試不僅是正常的程序調試,而要是要進行有目的有針對性的異常調用測試,這一點要結合需求理解能力。
7:學習和總結的能力
程序員是很容易被淘汰的職業,所以要善於學習總結。
7. 數據結構怎麼學
演算法的意義就是解決問題。有很垃圾的演算法,可以讓一個特別簡單的問題跑到宇宙消失那一天也不能解決,好的演算法可以讓它在一秒內解決。
還有,演算法上可能不起眼的小毛病會讓程序效率以幾何級數增長,一個小優化可能讓它在短時間內解決更多的問題。
比如數獨,可以用回溯法直接解決,效率也非常高(大概一秒10個吧,一般數獨),但是如果加入人的智慧的話程序會更快的解決問題。
還有一些,現在沒法說明的問題,也都是因為演算法的不同。
所以說演算法可以決定程序的好壞。
另外輔助的就是數據結構,在演算法的基礎上,優化數據結構會給程序帶來相當大的提速。比如堆,平衡樹……這些,可以用來給演算法效率帶來質的提升。
還有棧,隊列,這是搜索演算法中不可少的數據結構。
程序=數據結構+演算法
另外,如果是說意義的話,現實中也很大。
WAR3,別說你沒玩過(其它策略類也可以),當小兵移動的時候,就有很多演算法。一般採用的是A*,這樣智能型搜索。
在實際中,導航儀(GPS定位的)當然不會使用經典演算法,但是經典演算法也是可以解決地圖路徑的基礎演算法(dijstra,單源最短路)
還有一些貨物的運送問題,可以用最大流找出圖中s和t的最大貨物運量。。
太多太多了。。
這就是我的理解。。不過。。我還高中。。我大學爭取轉到計算機科學與技術
8. 只把c++這門語言學好,包括stl,演算法,數據結構,基礎都打扎實而不去學MFC什麼的開發工具,能做程序員嗎
按照我的理解,學不學MFC不中要。但至少要會調用windows api 吧。至少我在公司沒有見過不會用windows api的人。如果你是做純linux之類的開發,那就不必了。
你說的學好stl,演算法,數據結構。這樣我覺得你適合去研究所研究演算法啥的。你是寫不出來一個有應用價值的程序的。
二級、三級的就算了,沒有一個找程序員的公司會承認這種證書。如果你應聘的是office操作員,那這個證書可能還有用。
我原來學MFC的時候也很痛苦。別著急慢慢來,其實不是很難。
最後推薦你個視頻,就是孫鑫老師的vc++講座。20個課時。網上有,自己搜吧,都是免費的。
9. 請問大學學習數據結構與演算法(C語言版)需要多強的C語言基礎
李明傑老師:每周一道演算法題 通關演算法面試課(超清視頻)網路網盤
鏈接: https://pan..com/s/14GZpVf03Mf9E-YnMrrR4Pw
若資源有問題歡迎追問~