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

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

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

大學應(yīng)該更偏向技術(shù)還是算法和數(shù)據(jù)結(jié)構(gòu)這類?

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:編程指北 ? 作者:編程指北 ? 2021-07-04 15:11 ? 次閱讀

經(jīng)常有學妹問我(其實學弟也愛問):

大學應(yīng)該更偏向技術(shù)還是算法和數(shù)據(jù)結(jié)構(gòu)這類。

大家都是成年人了,這還用選嗎?

當然是兩者都要重點啃下來呀,算法和技術(shù)相輔相成的,一定不要有二選一的想法!

算法和數(shù)據(jù)結(jié)構(gòu)可以說是技術(shù)(包括MySQL、Java、Redis、操作系統(tǒng)這些)的基石:

5d29ea2c-d96e-11eb-9e57-12bb97331649.png

我當時大一也是覺得數(shù)據(jù)結(jié)構(gòu)沒啥用,哪有學個 JS、CSS 寫個漂亮的網(wǎng)頁炫酷?

什么算法,明明有 qsort 還要學快排、堆排?

這玩意有 qsort 快嗎?

我直接一行就排好序了,你還要寫十幾行,真菜呀!

那時候以為的技術(shù)就是使用各種組件、調(diào)API,比如 Map:

但是越學到后面心里越?jīng)]底,因為這些東西對自己都是黑盒子。

所以如果數(shù)據(jù)結(jié)構(gòu)與算法掌握不好,那么這些 API 對于我們就是一堆的黑黑子,連什么時候用 Map(紅黑樹實現(xiàn))、什么時候用 HashMap 都分不清。

Redis 這種組件,難道只需要了解如何get、set 就是算是掌握了嗎?

那肯定不行,實際上想要要用得好,得要了解 Redis 底層的那些數(shù)據(jù)結(jié)構(gòu),比如簡單動態(tài)字符串(SDS、鏈表、字典、跳躍表、整數(shù)集合、壓縮列表,才能選擇適當?shù)拇鎯Y(jié)構(gòu)。

如果要問我大學什么最后悔?那肯定是沒有從大一就開始好好學算法,去打 ACM。

現(xiàn)在還在大一、大二的同學還不抓緊機會,別給自己留下遺憾。當然,不打 ACM,我們也是能夠?qū)W好數(shù)據(jù)結(jié)構(gòu)和算法的。

數(shù)據(jù)結(jié)構(gòu)和算法你能在任何計算機領(lǐng)域里看到,比如在編譯原理中寄存器的分配會用到貪心,死代碼檢測與消除會用到圖論里不可達的知識;操作系統(tǒng)進程、線程調(diào)度會用到多級隊列和調(diào)度算法;組成原理中 Cache 的替換會用到 LRU、FIFO 等算法;開發(fā)必備的數(shù)據(jù)庫也離不開B+樹、LSM 等數(shù)據(jù)結(jié)構(gòu)和查找算法。

很多時候我們需要的算法都被封裝到編程語言的基礎(chǔ)庫里了,以至于很多同學會覺得算法離我們太遠,其實不是的。

所以學習算法有助于我們根據(jù)應(yīng)用場景選擇最合適的數(shù)據(jù)結(jié)構(gòu)。

日常開發(fā)中也一定離不開算法,比如小北最近工作中涉及的某種嵌套 TLV(Tag-Length-Value)結(jié)構(gòu)編碼的解析,就需要用到遞歸、多叉樹等知識。如果不學習算法,那么程序中只能見到大量的 if/else、while/for。。。

可以說不學算法的工程師一定不是一個優(yōu)秀的工程師。

再來說操作系統(tǒng)、編譯原理,這些里面也是蘊含著各種數(shù)據(jù)結(jié)構(gòu)與算法的,就拿編譯原理來說。

一、編譯原理遇見算法

當你學完有限狀態(tài)機以后,你會發(fā)現(xiàn)以前覺得很牛逼正則表達式似乎自己也能用 DFA、NFA 實現(xiàn)一下了。狀態(tài)機的思想在編程中很多地方都用得上。

比如解析 HTTP 協(xié)議,如果沒學過狀態(tài)機思想,你可能會一行行的 if/else 去做解析,這里最麻煩的地方在于,if/else 需要提前將 HTTP 頭部字段都接收到再來判斷,而我們知道 HTTP 基于 TCP,而 TCP 是流式傳輸,所以你很有可能是幾個字符一組組接收到的,這個時候用 if/else 寫出來就很難看了。

而用狀態(tài)機編寫起來代碼就會非常優(yōu)雅。狀態(tài)的轉(zhuǎn)移是由規(guī)則驅(qū)動的,接收到一個字符就判斷一個,非常的方便。

繼續(xù)學完語法分析,你會掌握遞歸下降分析這樣非常重要的思想,你可以使用遞歸下降快速的實現(xiàn)四則運算計算器。

如果不用遞歸下降你可能需要先中綴表達式轉(zhuǎn)后綴,然后求值,這是我們大一數(shù)據(jù)結(jié)構(gòu)課寫的,當時用棧寫的,有點麻煩。后來學完編譯原理,又用遞歸下降重寫了一遍,區(qū)區(qū)幾十行代碼遍搞定。

還有一類場景在實際開發(fā)中的用的很多,比如淘寶、京東這樣的電商,它們的營銷規(guī)則有很多,比如滿減、直減、跨店等等,這樣的規(guī)則是不可能寫死在代碼里的。

那是怎么做的呢?

一般會實現(xiàn)一個配置系統(tǒng),并設(shè)計一個DSL(領(lǐng)域特定語言)來表達這些規(guī)則,將規(guī)則直接配置到系統(tǒng)中,這樣可以非常方便的修改,那么如何在代碼里去解析 DSL 定義的規(guī)則呢?這就需要為 DSL 寫一個語法解析器,這里就會用到語法分析的方法。

DSL(Domain Specific Language),它是一種用于某個特定領(lǐng)域的程序設(shè)計語言。這種特定于某個領(lǐng)域是相對于 C、C++、Python 這種通用語言而言的,通用語言可以在各個領(lǐng)域使用,我們熟悉的大多數(shù)程序設(shè)計語言都是通用語言,它們都是圖靈完備的。

像我們平常經(jīng)常使用的 JSON、SQL、HTML 這些都算是一種 DSL,你甚至可以嘗試用遞歸下降去寫一個 JSON、XML 解析器,這比寫電商網(wǎng)站更有價值的。

繼續(xù)往下學你會了解到抽象語法樹 AST 如何生成、如何轉(zhuǎn)化為中間代碼、如何對中間代碼優(yōu)化、最終又是怎么生成機器指令的。

你會看到貪心算法在寄存器分配中的應(yīng)用,也會看到圖論中的可達性分析又是如何實現(xiàn)死代碼消除。

二、CS 基礎(chǔ)課

所以無論是操作系統(tǒng)、計算機網(wǎng)絡(luò)、編譯原理這些基礎(chǔ)CS課程,還是MySQL、Redis這些中間件,都是構(gòu)建在各種精妙的數(shù)據(jù)結(jié)構(gòu)與算法之上的,數(shù)據(jù)結(jié)構(gòu)與算法必學,一定要重視!

如果你有 ACM 獲獎經(jīng)歷,那 BAT 是很容易進的,但是也一定要掌握基本的CS基礎(chǔ)課程知識,不能只重算法不重基礎(chǔ)。

國外可能把題刷好就能拿到offer,但是國內(nèi)不懂 OS、網(wǎng)絡(luò)這些基礎(chǔ)和一些語言八股文也是很難的!

三、CS 學習路線

很多大一大二的同學其實是不太清楚到底該計算機專業(yè)該如何自學,在這分享下我的學習路線吧:

我大學專業(yè)學計算機的,對 CS 本科課程還算了解,也經(jīng)常了解學習國外 CS 課程。

CS 專業(yè)區(qū)別于其它專業(yè)很大特點就是:

工作后的內(nèi)容是和專業(yè)所學的內(nèi)容強相關(guān)的

比如你學了數(shù)據(jù)結(jié)構(gòu)、編譯原理、操作系統(tǒng)、計算機網(wǎng)絡(luò),如果你從事的是研發(fā)崗,那一定離不開這些知識。

主要靠自學

不管是科班還是非科班,想要快速持續(xù)的提高技術(shù)水平,就得靠自己去鉆,尤其離不開自學。

知乎上其實很多問科班和非科班的差別在哪,其實我一直想說,你給自己充足時間去把科班的內(nèi)容學習一遍,到底還能差在哪呢?

可能唯一差別就是少了一個 計算機學士學位。

也有人把這種自學出家的叫做民科,當然沒有任何的諷刺意思哈。

四、那么計算機專業(yè)該如何自學呢?

最簡單的方式就是參考 CS 科班同學的課程,比如下面這個:

很多,概況起來就是(下面只涉及CS專業(yè)課):

計算機導(dǎo)論 + 一門編程入門語言

算法與數(shù)據(jù)結(jié)構(gòu)

操作系統(tǒng)

計算機網(wǎng)絡(luò)

數(shù)據(jù)庫系統(tǒng)

特定領(lǐng)域,如:計算機圖形學、信息安全、System方向、分布式

學習的途徑就是:

多看國外/國外的 CS 名校的一些開放課程 + 看經(jīng)典的書 + 多寫代碼?。。?/p>

畢竟現(xiàn)在MOOC、Udemy、B站上學習的資源都是很豐富的。

唯一要做的就是篩選一些比較好的課程進行學習,在這里我主要推薦一些國外的計算機課程,他們很明顯的一個特征就是注重實踐。

一門課,除了理論以外,還會有配套的 Lab、assignment,而且這些老師設(shè)計 Lab 都很用心的,看視頻/書 + 做 Lab,這應(yīng)該算計算機科班同學一個比較好的學習方式了,有理論也有實踐。

下面開始上干貨:

一、計算機導(dǎo)論

首先建議從計算機導(dǎo)論課程開始,推薦下面這些課程:

Harvard的CS50 CS50: Introduction to Computer Science

Berkeley的CS61A CS 61A: Structure and Interpretation of Computer Programs

MIT的6.001 mit-6.001

隨后建議學習一門語言,可以是C、Java、或Python,我推薦 C語言(當然,也可以是Python!這不是重點,重點是要多去寫,入門時提高對編程的興趣)。

提到C語言,我這里推薦國內(nèi)浙大翁凱老師的課,看過的都說好,分為兩門:

第一門是面向高考結(jié)束想提前自學一點編程的,叫大學先修課:C語言程序設(shè)計CAP-大學先修課

雖然叫先修課,但是覆蓋了C語言的主要知識點,也適合大一新生~

第二門是C語言程序設(shè)計進階:C語言程序設(shè)計進階

會帶你用C語言完成一些有趣的項目,比如一些圖形界面小游戲,先修課學習C語言語法基礎(chǔ),進階課帶你項目實操,搭配使用,你就是同學中的大神!

有了語言基礎(chǔ)之后建議學數(shù)據(jù)結(jié)構(gòu)與算法:

數(shù)據(jù)結(jié)構(gòu)推薦:

Stanford CS106系列

CS106A: Programming Methodologies

算法推薦:

6.046(進階) Design and Analysis of Algorithms - MIT

MIT的6.006 Introduction to Algorithms

Coursera上的Princeton課程

Berkeley的CS61A 和 CS61B

學習完經(jīng)典的數(shù)據(jù)結(jié)構(gòu)和算法之后就可以去刷題了。

操作系統(tǒng)推薦:

CMU的15-213

Berkeley的CS162,

這兩個都是有視頻有l(wèi)ab的好課

還有一個非常經(jīng)典的 MIT 6.828,附帶一個xv6 lab

課程:6.828: Operating System Engineering

組成原理、體系結(jié)構(gòu):

MIT的6.004,

CMU的15-213

Berkeley的CS61C

計算機網(wǎng)絡(luò):

Stanford的CS144,lab 很有意思

五、新手快速自學的方法

一個原則,來自翁凱老師:

學計算機一定要有一個非常強大的心理狀態(tài),計算機的所有東西都是人做出來的,別人能想的出來,我也一定能想得出來,在計算機的世界里沒有任何的黑魔法,所有的東西只不過是我現(xiàn)在不知道而已,總有一天我會把所有的細節(jié)、所有的內(nèi)部的東西全搞明白的

建立抽象層,我自己的感悟

計算機里,幾乎都是人造的概念,大部分的東西,只要你一直深挖下去,幾乎都可以搞明白。

但是要注意時間成本,軟件行業(yè)已經(jīng)不是一般的復(fù)雜和巨大,任何一個領(lǐng)域的知識的復(fù)雜性都足夠耗費掉我們一生的時間,所以一定要抓住主線,對于技術(shù)和知識,要學通用的、流行的,可以嘗試面向面試學習。

“打破砂鍋問到底”式的學習雖然精神可敬,但性價比并不劃算。

一定要學會在適當?shù)膶哟紊铣橄蟪鲆粚?,并且認可這一層提供的接口,不去深究內(nèi)部實現(xiàn),了解原理即可,不必深究內(nèi)部實現(xiàn)。

比如學習 HTTP,那么就先認可 TCP 提供的穩(wěn)定可靠傳輸,而不繼續(xù)深挖 TCP 的內(nèi)容,等到學習傳輸層的時候再去深入挖掘 TCP 具體實現(xiàn)。

也就是我們常說的面向接口/抽象編程。

視頻為主,看書為輔

新手,一定不要一直看書,保持看書的時間不超過 50%,按照下面的流程:

看書學習基本的理論

編程練習、實踐

有了新領(lǐng)悟,繼續(xù)看書

如此反復(fù)的循環(huán)。

責任編輯:lq6

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

    關(guān)注

    23

    文章

    4624

    瀏覽量

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

    關(guān)注

    3

    文章

    573

    瀏覽量

    40169

原文標題:學妹:大學四年以算法為重還是技術(shù)為重?

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

收藏 人收藏

    評論

    相關(guān)推薦

    DAC908時鐘信號的頻率和數(shù)據(jù)輸入的頻率的關(guān)系?

    剛剛接觸數(shù)模轉(zhuǎn)換器,想問一下時鐘信號的頻率和數(shù)據(jù)輸入的頻率的關(guān)系,例如我在DAC908的D0~D7端,以30kHz的頻率接收數(shù)據(jù),那么我的時鐘信號輸入的頻率應(yīng)該是多少,是高于30kHz還是
    發(fā)表于 01-14 06:14

    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位校驗?zāi)J剑趺纯赡苡?024 TOTAL READBACK BITS, format = 0
    發(fā)表于 11-19 07:58

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

    在研究機器視覺算法之前,我們需要先了解機器視覺應(yīng)用中涉及的基本數(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 ?487次閱讀
    視覺軟件HALCON的<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>

    魯棒性算法數(shù)據(jù)處理中的應(yīng)用

    一、魯棒性算法的基本概念 魯棒性算法是指在面對數(shù)據(jù)中的異常值、噪聲和不確定性時,仍能保持穩(wěn)定性能的算法。這類
    的頭像 發(fā)表于 11-11 10:22 ?427次閱讀

    AIC23采集到的數(shù)據(jù)應(yīng)該用什么數(shù)據(jù)類型來接收?int還是unsigned int?

    AIC23采集到的數(shù)據(jù)應(yīng)該用什么數(shù)據(jù)類型來接收,int還是unsigned int? 這個采集到的數(shù)字是什么含義呢?代表的是聲音信號的幅值? while(!MCBSP_rrdy(
    發(fā)表于 10-18 06:56

    河南大學OpenHarmony技術(shù)俱樂部正式揭牌成立

    8月30日,由OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)項目群技術(shù)指導(dǎo)委員會與河南大學共同舉辦的“河南大學OpenHarmony技術(shù)俱樂部成立大會”
    的頭像 發(fā)表于 09-03 16:12 ?445次閱讀
    河南<b class='flag-5'>大學</b>OpenHarmony<b class='flag-5'>技術(shù)</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 ?542次閱讀

    揭秘編程核心:基本數(shù)據(jù)結(jié)構(gòu)算法思想詳解

    描述問題的數(shù)據(jù)除了各數(shù)據(jù)元素本身,還要考慮各元素的邏輯關(guān)系,主要是一對一的線性關(guān)系,一對多的樹型關(guān)系和多對多的圖形關(guān)系。
    的頭像 發(fā)表于 04-25 11:51 ?1128次閱讀
    揭秘編程核心:基本<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>與<b class='flag-5'>算法</b>思想詳解

    探索編程世界的七大數(shù)據(jù)結(jié)構(gòu)

    結(jié)構(gòu)就像是一顆倒掛的小樹,有根、有枝、有葉。它是一種非線性的數(shù)據(jù)結(jié)構(gòu),以層級的方式存儲數(shù)據(jù),頂部是根節(jié)點,底部是葉節(jié)點。
    的頭像 發(fā)表于 04-16 12:04 ?411次閱讀

    CAN原理和通信軟件推薦

    看過一些資料還是不太理解這個CAN通信,CAN通信的原理是什么?尤其是CAN的分類和數(shù)據(jù)結(jié)構(gòu),CAN分為標準幀和擴展幀,對于這兩個幀的具體含義是什么? 在變頻器上擴展CAN通信卡,有什么CAN通信軟件推薦,我可以在軟件上直接發(fā)送幀控制變頻器?
    發(fā)表于 03-23 22:49

    fpga和數(shù)字ic區(qū)別 fpga和plc區(qū)別

    邏輯設(shè)計可以通過編程隨時改變應(yīng)用場景,模擬各種硬件的并行運算。而數(shù)字IC則專注于傳遞、加工、處理數(shù)字信號,它是按照功能分類的集成電路的一種。 兩者在功能和應(yīng)用上也有所不同。FPGA設(shè)計偏向于產(chǎn)品化,通過在產(chǎn)品上實現(xiàn)邏輯控制、
    的頭像 發(fā)表于 03-14 18:08 ?2726次閱讀

    TASKING編譯器是否可以將數(shù)據(jù)結(jié)構(gòu)設(shè)置為 \"打包\"?

    TASKING 編譯器是否可以將數(shù)據(jù)結(jié)構(gòu)設(shè)置為 \"打包\"? GCC 很早以前就提供了這種可能性,可以將__attribute__((packed))與對齊指令結(jié)合使用。 對于
    發(fā)表于 03-05 06:00

    矢量與柵格數(shù)據(jù)結(jié)構(gòu)各有什么特征

    矢量數(shù)據(jù)結(jié)構(gòu)和柵格數(shù)據(jù)結(jié)構(gòu)是地理信息系統(tǒng)(GIS)中最常用的兩種數(shù)據(jù)結(jié)構(gòu)。它們在存儲和表示地理要素上有著不同的方法和特征。在接下來的文章中,我們將詳細介紹這兩種數(shù)據(jù)結(jié)構(gòu)并比較它們的特點
    的頭像 發(fā)表于 02-25 15:06 ?2722次閱讀

    為什么CIPOS? Mini偏向于使用IGBT芯片,而非Si MOSFET?

    英飛凌作為電力電子領(lǐng)域創(chuàng)新解決方案的領(lǐng)先企業(yè),其取得的一大顯著成就是,開發(fā)了用于集成功率模塊(IPM)的絕緣柵雙極晶體管(IGBT)和金屬氧化物半導(dǎo)體場效應(yīng)晶體管(MOSFET)。這些緊湊的電力電子器件有助于打造更加集成、可靠且高性價比的解決方案。本文探討了英飛凌在其CIPOSMini產(chǎn)品中,
    的頭像 發(fā)表于 02-19 13:15 ?430次閱讀
    為什么CIPOS? Mini<b class='flag-5'>更</b><b class='flag-5'>偏向</b>于使用IGBT芯片,而非Si MOSFET?

    嵌入式軟件開發(fā)應(yīng)該掌握哪些知識?

    掌握的知識 1.基礎(chǔ)知識 1.1 c/c++編程語言和數(shù)據(jù)結(jié)構(gòu) C/C++ 是嵌入式系統(tǒng)中常用的編程語言,因為它們提供了直接訪問硬件的能力。通過使用特定的編譯器和調(diào)用硬件相關(guān)的接口,可以實現(xiàn)對各種外設(shè)
    發(fā)表于 02-19 11:23