一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

大牛分享平時如何學習數(shù)據(jù)結(jié)構(gòu)與算法

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:未知 ? 作者:胡薇 ? 2018-11-02 11:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一個熱愛編程的在校生,我的世界不只有coding,還有writing。目前維護訂閱號「苦逼的碼農(nóng)」,專注于寫「算法與數(shù)據(jù)結(jié)構(gòu)」,「Java」,「計算機網(wǎng)絡」。

數(shù)據(jù)結(jié)構(gòu)與算法的地位對于一個程序員來說不言而喻。今天這篇文章不是來勸你們學習數(shù)據(jù)結(jié)構(gòu)與算法的,也不是來和你們說數(shù)據(jù)結(jié)構(gòu)與算法有多重要。

主要是最近幾天后臺有讀者問我是如何學習數(shù)據(jù)結(jié)構(gòu)與算法的,有沒有什么捷徑,是要看視頻還是看書,去哪刷題等…..而且有些還是大三大四的,搞的我都替你們著急、擔心…..

所以我今天就分享下自己平時都是怎么學習的。

學習算法的捷徑就是多刷題

說實話,要說捷徑,我覺得就是腳踏實地著多動手去刷題,多刷題。

但是,如果你是小白,也就是說,你連常見的數(shù)據(jù)結(jié)構(gòu),如鏈表、樹以及常見的算法思想,如遞歸、枚舉、動態(tài)規(guī)劃這些都沒學過,那么,我不建議你去刷題的。而是先去找本書先去學習這些,然后再去刷題。

也就是說,假如你要去諸如leetcode這些網(wǎng)站刷題,那么,你要先具備一定的基礎(chǔ),這些基礎(chǔ)包括:

1、常見數(shù)據(jù)結(jié)構(gòu):鏈表、樹(如二叉樹)。

2、常見算法思想:貪婪法、分治法、窮舉法、動態(tài)規(guī)劃,回溯法。

以上列出來的算是最基本的吧。就是說你刷題之前,要把這些過一遍再去刷題。如果你連這些最基本的都不知道的話,那么你再刷題的過程中,會很難受的,思路也會相對比較少。

總之,千萬不要急,先把這些基本的過一遍,力求理解,再去刷題。這些基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)與算法,我是在大一第二學期學的,我沒看視頻,我是通過看書學的,那時候看的書是:

1、算法分析與分析基礎(chǔ):這本比較簡單,推薦新手看。

2、數(shù)據(jù)結(jié)構(gòu)與算法分析—-C語言描述:代碼用C寫的,推薦看。

3、挑戰(zhàn)程序設(shè)計競賽(第二版):也是很不錯的一本書,推薦看。

具體可以看我的另外一篇文章,里面是介紹這幾本書的:算法與數(shù)據(jù)結(jié)構(gòu)書籍與視頻福利

說實話,我那一學期的時間幾乎都花在數(shù)據(jù)結(jié)構(gòu)與算法上,但刷的題很少,只是書本上的一些例題。所以當我把這些基本的過一遍之后,再去一些網(wǎng)站刷題依舊非常菜。

所以你們千萬別指望以為自己把這些思想學完之后刷題會很牛,只有多刷題,只有多動手實踐,你的靈敏度才會提高起來。

在這里說一下前陣子有個非?;鸨膶凇?【數(shù)據(jù)結(jié)構(gòu)與算法之美】

我沒買這個專欄,我想說的是,買了就一定要去看,千萬別浪費。也千萬不要覺得學完這個專欄你就會變的多牛逼,如果你只是跟著進度去學習這個專欄,自己沒有花時間去刷題、去動手時間。那我可以保證,你學完之后還是那么菜。

總結(jié)下:

提高數(shù)據(jù)結(jié)構(gòu)與算法沒啥捷徑,最好的捷徑就是多刷題。但是,刷題的前提是你要先學會一些基本的數(shù)據(jù)結(jié)構(gòu)與算法思想。

追求完美

如何刷題?如何對待一道算法題?

我覺得,在做題的時候,一定要追求完美,千萬不要把一道題做出來之后,提交通過,然后就趕緊下一道。

算法能力的提升和做題的數(shù)量是有一定的關(guān)系,但并不是線性關(guān)系。也就是說,在做題的時候,要力求一題多解,如果自己實在想不出來其他辦法了,可以去看看別人是怎么做的,千萬不要覺得模仿別人的做法是件丟人的事。

我做題的時候,我一看到一道題,可能第一想法就是用很粗糙的方式做,因為很多題采用暴力法都會很容易做,就是時間復雜度很高。之后,我就會慢慢思考,看看有沒其他方法來降低時間復雜度或空間復雜度。最后,我會去看一下別人的做法,當然,并不是每道題都會這樣執(zhí)行。

衡量一道算法題的好壞無非就是時間復雜度和空間復雜度,所以我們要力求完美,就要把這兩個降到最低,令他們相輔相成。

我舉道例題吧:

問題:一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法?

這道題我在以前的分章分析過,不懂的可以先看下之前寫的:遞歸與動態(tài)規(guī)劃---基礎(chǔ)篇1

方法1::暴力遞歸

這道題不難,或許你會采取下面的做法:

public static int solve(int n){ if(n == 1 || n == 2){ return n; }else if(n <= 0){ ? ? ? ?return 0; ? ?}else{ ? ? ? ?return solve(n-1) + solve(n-2); ? ?}}

這種做法的時間復雜度很高,指數(shù)級別了。但是如果你提交之后僥幸通過了,然后你就接著下一道題了,那么你就要好好想想了。

方法二:空間換時間

力求完美,我們可以考慮用空間換時間:這道題如何你去仔細想一想,會發(fā)現(xiàn)有很多是重復執(zhí)行了。所以可以采取下面的方法:

//用一個HashMap來保存已經(jīng)計算過的狀態(tài)static Map map = new HashMap();public static int solve(int n){ if(n <= 0)return 0; ? ?else if(n <= 2){ ? ? ? ?return n; ? ?}else{//是否計算過 ? ? ? ?if(map.containsKey(n)){ ? ? ? ? ? ?return map.get(n); ? ? ? ?}else{ ? ? ? ? ? ?int m = solve(n-1) + solve(n-2); ? ? ? ? ? ?map.put(n, m); ? ? ? ? ? ?return m; ? ? ? ?} ? ?}}

這樣,可以大大縮短時間。也就是說,當一道題你做了之后,發(fā)現(xiàn)時間復雜度很高,那么可以考慮下,是否有更好的方法,是否可以用空間換時間。

方法三:斐波那契數(shù)列

實際上,我們可以把空間復雜度弄的更小,不需要HashMap來保存狀態(tài):

public static int solve(int n){ if(n <= 0) ? ? ? return 0; ? ?if(n <= 2){ ? ? ? ?return n; ? ?} ? ?int f1 = 0; ? ?int f2 = 1; ? ?int sum = 0; ? ?for(int i = 1; i<= n; i++){ ? ? ? ?sum = f1 + f2; ? ? ? ?f1 = f2; ? ? ? ?f2 = sum; ? ?} ? ?return sum;}

我弄這道題給你們看,并不是在教你們這道題怎么做,而是有以下目的:

1、在刷題的時候,我們要力求完美。

2、我想不到這些方法啊,怎么辦?那么你就可以去看別人的做法,之后,遇到類似的題,你就會更有思路,更知道往哪個方向想。

3、可以從簡單暴力入手做一道題,在考慮空間與時間之間的衡量,一點點去優(yōu)化。

推薦一些刷題網(wǎng)站

我一般是在leetcode和牛客網(wǎng)刷題,感覺挺不錯,題目難度不是很大。

在??途W(wǎng)那里,我主要刷劍指Offer,不過那里也有個在線刷leetcode,不過里面的題量比較少。牛客網(wǎng)刷題有個非常方便的地方就是有個討論區(qū),那里會有很多大佬分享他們的解題方法,不用我們?nèi)グ俣日翌}解。所以你做完后,實在想不出,可以很方便著去看別人是怎么做的。

至于leetcode,也是大部分題目官方都有給出答案,也是個不錯的刷題網(wǎng)站。你們可以兩個挑選一個,或者兩個都刷。

當然,還有其他刷題的網(wǎng)站,不過,其他網(wǎng)站沒刷過,不大清除如何。

再說數(shù)據(jù)結(jié)構(gòu)

前面我主要是說了我平時都是怎么學習算法的。在數(shù)據(jù)結(jié)構(gòu)方法,我只是列舉了你們一定要學習鏈表和樹(二叉堆),但這是最基本的,刷題之前要掌握的,對于數(shù)據(jù)結(jié)構(gòu),我列舉下一些比較重要的:

1、鏈表(如單向鏈表、雙向鏈表)。

2、樹(如二叉樹、平衡樹、紅黑樹)。

3、圖(如最短路徑的幾種算法)。

4、隊列、棧、矩陣。

對于這些,自己一定要動手實現(xiàn)一遍。你可以看書,也可以看視頻,新手可以先看視頻,不過前期可以看視頻,之后我建議是一定要看書。

視頻和書我以前有推薦過:算法與數(shù)據(jù)結(jié)構(gòu)書籍與視頻福利

例如對于平衡樹,可能你跟著書本的代碼實現(xiàn)之后,過陣子你就忘記,不過這不要緊,雖然你忘記了,但是如果你之前用代碼實現(xiàn)過,理解過,那么當你再次看到的時候,會很快就記起來,很快就知道思路,而且你的抽象能力等等會在不知不覺中提升起來。之后再學習紅黑樹啊,什么數(shù)據(jù)結(jié)構(gòu)啊,都會學的很快。

最最重要

動手去做,動手去做,動手去做。重要的話說三遍。

千萬不要找了一堆資源,訂好了學習計劃,我要留到某某天就來去做…..

千萬不要這樣,而是當你激情來的時候,就馬上去干,千萬不要留到某個放假日啊什么鬼了,很多這種想法的人,最后會啥也沒做的。

也不要覺得要學習的有好多啊,不知道從哪學習起。我上面說了,可以先學習最基本的,然后刷題,刷題是一個需要長期堅持的事情,一年,兩年。在刷題的過程中,可以穿插學習其他數(shù)據(jù)結(jié)構(gòu)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4709

    瀏覽量

    95338
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40738

原文標題:我是如何學習數(shù)據(jù)結(jié)構(gòu)與算法的?

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    嵌入式開發(fā)入門指南:從零開始學習嵌入式

    特定功能的計算機系統(tǒng),廣泛應用于智能家居、工業(yè)控制、醫(yī)療設(shè)備、車載系統(tǒng)等領(lǐng)域。 2. 學習嵌入式開發(fā)的前置知識熟悉C語言編程掌握基本的數(shù)據(jù)結(jié)構(gòu)算法了解數(shù)字電路與微控制器原理熟悉Linux操作系統(tǒng)
    發(fā)表于 05-15 09:29

    程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)

    的地址)出發(fā),采用推導的方式,深入淺出的分析了廣大C程序員學習和開發(fā)中遇到的難點。 2. 從方法論的高度對C語言在數(shù)據(jù)結(jié)構(gòu)算法方面的應用進行了深入講解和闡述。 3. 講解了絕大多數(shù)C程序員開發(fā)
    發(fā)表于 05-13 16:45

    C++學到什么程度可以找工作?

    管理、引用、面向?qū)ο缶幊蹋惻c對象、繼承、多態(tài))、模板和STL(標準模板庫)等。 2. **數(shù)據(jù)結(jié)構(gòu)算法**:能夠高效地實現(xiàn)并使用各種數(shù)據(jù)結(jié)構(gòu)(如數(shù)組、鏈表、棧、隊列、樹、圖等)和算法
    發(fā)表于 03-13 10:19

    哪些專業(yè)適合學習嵌入式開發(fā)?

    市場的80%以上,那什么專業(yè)能夠輕松轉(zhuǎn)行呢? 1)計算機科學與技術(shù):作為基礎(chǔ)學科,計算機科學與技術(shù)專業(yè)提供了編程、算法、數(shù)據(jù)結(jié)構(gòu)等基礎(chǔ)知識,適合轉(zhuǎn)行到嵌入式、人工智能和物聯(lián)網(wǎng)領(lǐng)域。 2)電子信息工程
    發(fā)表于 01-03 13:44

    DDC264配置寄存器數(shù)據(jù)寫入和320 DCLK時鐘脈沖后的回讀數(shù)據(jù)結(jié)構(gòu)是什么?

    配置寄存器數(shù)據(jù)寫入和320 DCLK時鐘脈沖后的回讀數(shù)據(jù)結(jié)構(gòu)是什么? 根據(jù)注和表9,16位配置寄存器數(shù)據(jù),4位修訂ID, 300位校驗模式,怎么可能有1024 TOTAL READBACK BITS, format = 0
    發(fā)表于 11-19 07:58

    NPU與機器學習算法的關(guān)系

    在人工智能領(lǐng)域,機器學習算法是實現(xiàn)智能系統(tǒng)的核心。隨著數(shù)據(jù)量的激增和算法復雜度的提升,對計算資源的需求也在不斷增長。NPU作為一種專門為深度學習
    的頭像 發(fā)表于 11-15 09:19 ?1208次閱讀

    視覺軟件HALCON的數(shù)據(jù)結(jié)構(gòu)

    在研究機器視覺算法之前,我們需要先了解機器視覺應用中涉及的基本數(shù)據(jù)結(jié)構(gòu)。Halcon數(shù)據(jù)結(jié)構(gòu)主要有圖像參數(shù)和控制參數(shù)兩類參數(shù)。圖像參數(shù)包括:image、region、XLD,控制參數(shù)包括:string、integer、real、
    的頭像 發(fā)表于 11-14 10:20 ?1281次閱讀
    視覺軟件HALCON的<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>

    U盤存儲并聯(lián),算法交互輸出

    \"algorithm.h\"http:// 自定義的算法庫 #define NUM_UDISKS 4 #define DATA_SIZE 1024 // 模擬U盤模塊的數(shù)據(jù)結(jié)構(gòu) typedef
    發(fā)表于 10-28 07:36

    零基礎(chǔ)嵌入式開發(fā)學習路線

    語言的學習,這個階段需要對代碼進行進一步的提升。不能僅滿足于能寫代碼實現(xiàn)功能,而是需要繼續(xù)考慮數(shù)據(jù)怎樣存儲能更合理的利用空間,算法怎么寫才能更高效的實現(xiàn)該功能。數(shù)據(jù)結(jié)構(gòu)在代碼優(yōu)化中起到
    發(fā)表于 10-25 15:55

    架構(gòu)師日記-從數(shù)據(jù)庫發(fā)展歷程到數(shù)據(jù)結(jié)構(gòu)設(shè)計探析

    數(shù)據(jù)庫發(fā)展史 起初,數(shù)據(jù)的管理方式是文件系統(tǒng),數(shù)據(jù)存儲在文件中,數(shù)據(jù)管理和維護都由程序員完成。后來發(fā)展出樹形結(jié)構(gòu)和網(wǎng)狀
    的頭像 發(fā)表于 09-25 11:20 ?1152次閱讀
    架構(gòu)師日記-從<b class='flag-5'>數(shù)據(jù)</b>庫發(fā)展歷程到<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>設(shè)計探析

    深度識別算法包括哪些內(nèi)容

    :CNN是深度學習中處理圖像和視頻等具有網(wǎng)格結(jié)構(gòu)數(shù)據(jù)的主要算法。它通過卷積層、池化層和全連接層等組件,實現(xiàn)對圖像特征的自動提取和識別。 應用領(lǐng)域 :CNN在圖像識別、目標檢測、視頻分
    的頭像 發(fā)表于 09-10 15:28 ?834次閱讀

    基于大數(shù)據(jù)與深度學習的穿戴式運動心率算法

    性能的關(guān)鍵手段。然而,在復雜多變的運動環(huán)境中,準確測量心率數(shù)據(jù)對于傳統(tǒng)算法而言具有較大的技術(shù)瓶頂。本文將探討如何運用大數(shù)據(jù)和深度學習技術(shù)來開發(fā)創(chuàng)新的穿戴式運動心率算
    的頭像 發(fā)表于 09-10 08:03 ?639次閱讀
    基于大<b class='flag-5'>數(shù)據(jù)</b>與深度<b class='flag-5'>學習</b>的穿戴式運動心率<b class='flag-5'>算法</b>

    嵌入式常用數(shù)據(jù)結(jié)構(gòu)有哪些

    在嵌入式編程中,數(shù)據(jù)結(jié)構(gòu)的選擇和使用對于程序的性能、內(nèi)存管理以及開發(fā)效率都具有重要影響。嵌入式系統(tǒng)由于資源受限(如處理器速度、內(nèi)存大小等),因此對數(shù)據(jù)結(jié)構(gòu)的選擇和使用尤為關(guān)鍵。以下是嵌入式編程中常用的幾種數(shù)據(jù)結(jié)構(gòu),結(jié)合具體特點和
    的頭像 發(fā)表于 09-02 15:25 ?1038次閱讀

    深度學習算法在嵌入式平臺上的部署

    隨著人工智能技術(shù)的飛速發(fā)展,深度學習算法在各個領(lǐng)域的應用日益廣泛。然而,將深度學習算法部署到資源受限的嵌入式平臺上,仍然是一個具有挑戰(zhàn)性的任務。本文將從嵌入式平臺的特點、深度
    的頭像 發(fā)表于 07-15 10:03 ?3183次閱讀

    深度學習算法在集成電路測試中的應用

    隨著半導體技術(shù)的快速發(fā)展,集成電路(IC)的復雜性和集成度不斷提高,對測試技術(shù)的要求也日益增加。深度學習算法作為一種強大的數(shù)據(jù)處理和模式識別工具,在集成電路測試領(lǐng)域展現(xiàn)出了巨大的應用潛力。本文將從深度
    的頭像 發(fā)表于 07-15 09:48 ?1854次閱讀