我們到底該如何學習《數據結構與算法》

2021-01-08 愚公要移山1

前言:我們到底該不該學習算法與數據結構?

1、真的應該學習

這個問題本身就不是個問題,所有人都在強調數據結構與算法比較重要,但是好像平時也沒用到,無法直觀的去感受它的重要性,於是把學習重心放在了常見的哪些框架身上,似乎只要熟悉了哪些框架的API,編程就會所向披靡。

我舉一個我自身的例子,我本科期間想做一個APP,主要是在線預約的功能,既然是在線預約,用戶多了之後那就需要排隊,當時也不管三七二十一,不管哪種結構,那就先試試ArrayList,當然這種數據結構也能解決,但是當真正操作其增刪改查的時候才發現ArrayList確實是比較麻煩一點。

在網上開始問各種大佬,統一回復的一句話是,你現在學數據結構了嗎?你數據結構咋學的?現在想想真的是留下啦悔恨的眼淚。

既然數據結構與算法重要,到底哪個地方重要呢?下面就來說說:

2、重要性體現

第一:面試

面試確實是第一個體現的點,因為你會發現,面試外企的時候他們第一件事就是啥都不問,上來就是幾道算法題。包括國內的字節跳動。現在的阿里、騰訊、華為、美團。凡是大家知道的那些大廠基本上上來就是先敲代碼。可以看出國內外大廠對於算法與數據結構的看重。

第二:工作

現在的大廠api框架基本上背後的邏輯就是基於算法實現的。其實算法的種類有很多,比如說機器學習、神經網絡算法,還有java中的排序算法,網際網路的商品推薦、股票預測其背後的邏輯都是算法。就算是熟悉的那些框架,背後的邏輯也是數據結構與算法。我們敲代碼解決問題的過程當中也是算法的集中體現。

第三:學習

學習數據結構與算法的目的,別人我不知道,對我目前來說,是想了解哪些常見框架,常見機制背後的運行邏輯。進而為以後創造一個更加強大的產品做鋪墊。任何一個新東西,都是先了解,再模仿,最後再創造的過程。

第四:應付學業

我之前大學學習這門課的時候,學分比重還是比較大的,好幾年過去了,不知道現在變沒變。不過最起碼考研或者是期末考試,這門課都是必須要學習的一門課。可見學校也比較重視。

一、算法與數據結構到底是個什麼東東?

在這裡我不想去解釋哪些常見的名詞了,像什麼是數據項、數據對象、元素等等這些概念。稍微有點基礎的人,對這些概念都應該很清楚,畢竟都是中國人。我主要想說一下,我們到底該如何理解數據結構與算法。

1、什麼是數據結構?

高中的時候都學習過化學,什麼水的結構,碳原子的結構,這些分子、原子之間不是雜亂無章的,我們總是可以歸納分析出一些規律。對於計算機中的數據元素而言,這些數據元素也不是孤立的,總是有一種或者是幾種的內在聯繫。

數據結構:數據元素相互之間一種或者多種關係的表示

既然數據元素之間有某種關係,那這種關係到底是什麼呢?這裡直接總結了一下。

可以看出分兩類,表示了這些數據元素之間的關係。我們在學習數據結構的時候,其實就是學習這些數據元素到底有哪些關係。

2、什麼是算法

宋丹丹和趙本山有過一個小品,說如何把大象關進冰箱裡。第一步先把冰箱門打開,第二步把大象裝進去,第三步,把冰箱門關上。整個簡單的流程完美的體現了算法的思想。標準定義:

算法:解決問題的步驟的描述

就這麼幾個字,其實就是描述過程的。當然解決問題的方法有很多,因此算法也有很多種,就比說我們常見的排序算法,就簡簡單單為了從小到大排序,哪些科學家們活活的搞出了十幾種。每一種排序方式都是一個算法。

3、數據結構與算法的關係(重點)

我們經常會聽到有人說:程序=算法+數據結構,某位大佬科學家就提出了這幾個字還得了圖靈獎。大學的時候知道這件事還讓我一度懷疑圖靈獎也不過如此。嘿嘿,不過現在不敢說了,看的越多,越覺得這個簡單地公式蘊含了無數的道理。

既然是討論他們之間的關係。我們再來看個例子,畢竟例子各位才理解的更加清楚。假如我國要在多個城市之間新建一條高鐵。要求是能夠連結多個城市,而且成本最低。OK,好了,現在就這麼個需求,我們來分析。

第一目的:修建鐵路

第二要求:連通所有城市,成本最低。

我們一下子就能想到這是一個最小生成樹問題,假如把每一個城市看成一個點,把城市之間的成本看成連線數字,就是找出來一個聯通線。

目的其實就是為了找上圖中的那條黑線。這裡不是專門講這個知識體系的。現在我們使用流程圖看看,如果遇到了一個問題,我們是如何去使用程序去解決的。

從上圖可以看出,為了要解決一個問題,首先我們要分析問題,然後確定解決思路,接下來設計或者是選擇已有的算法,再然後就是確定實現的數據結構,最後就是代碼的實現與優化。

數據結構在其中的位置可以看出,是為了更好地實現某種或者是某類算法。在討論這門課的時候也會結合在一起去學習。

二、學習數據結構與算法我們最應該關注什麼?

如果我們想要學好數據結構與算法,首先腦海中要時刻記住兩個關鍵詞彙,時間效率和空間效率。這個兩個詞彙貫穿了整個數據結構與算法的知識體系。

數據結構可以助算法實現問題提供基礎,算法為了解決某一問題必須要時間夠快,空間足夠節省。就好比我們為了能夠在茫茫人海當中找尋另一半一樣。首先時間要足夠快,不能一個一個找,然後我們不可能把茫茫人海所有人的全部信息全給保存了,所以空間上還要足夠節省。

那什麼是時間效率和空間效率呢?通俗的理解就是:我們使用兩個不同的程序去解決同一個問題,時間短的說明時間效率高,消耗空間小的說明空間效率高。

我們在研究數據結構與算法的時候,其實就是選擇不同的數據結構和不同的算法解決某一問題的同時儘可能的提升計算機的時間效率和空間效率。

1、首先看時間複雜度:

想要了解時間複雜度,就需要先了解時間頻度。一個算法花費的時間與算法中語句的執行次數成正比例,哪個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。

說白了時間複雜度就是描述時間的規模,比如說時間頻度是T(n),時間複雜度就是O(n)。時間頻度是T(n+n)的時候,時間複雜度還是O(n)。也就是他的時間規模就是n這個層次了。記作T(n)=O(f(n)),稱O(f(n)) 為算法的漸進時間複雜度,簡稱時間複雜度**。

常見的算法的時間 複雜度之間的關係為:

O(1)<O(logn)<O(n)<O(nlog n)<O(n2)<O(2n)<O(n!)<O(nn)

舉個例子吧:

a=0; //(1)for(i=1;i<=n;i++) //(2)for(j=1;j<=n;j++) //(3) a++; //(4)

語句(1)執行1次,

語句(2)執行n次

語句(3)執行n2次

語句(4)執行n2次

T(n) = 1+n+2n2= O(n2)

2、空間複雜度

空間複雜度就比較容易理解了,空間複雜度是對一個算法在運行過程中臨時佔用存儲空間大小的一個量度,同樣反映的是一個空間規模,我們用 S(n) 來定義。

空間複雜度比較常用的有:O(1)、O(n)、O(n),

三、結論

在本文中,首先討論了數據結構與算法的重要性,然後給出了數據結構與算法的理解,最後就是在學習數據結構與算法時,我們最應該關注的點。其中通過數據結構與算進的關係解決某一問題的流程是重點。在以後的文章中,也會慣用這一思路。這個思路是我在刷了力扣幾百道題時總結出來的。

舉個例子來說一下:

面試中經常會遇到一道題,那就是實現LRU(最近最久未使用)。我們按照上面的流程結構可以很清楚的把問題給解決掉,而不是死記硬背哪些現有的代碼,比如

第一步分析問題,問題是實現最近最久未使用的算法,我們可以畫圖來看一下到底是個什麼問題,然後就是確定算法,比如說第一步我們該幹嘛,第二步該幹嘛等等。接下來確定數據結構的時候,比如說可以自定義Node實現,還有java中為我們提供的LinkedHashMap等等。最後就是根據數據結構的特點通過我們分析的算法流程去實現。

這樣是不是有點清晰了。本專欄將持續推出。也祝你在接下來的日子裡更加靈活運用。

相關焦點

  • 從數據結構到算法:圖網絡方法初探
    因此也催化出一系列在圖上進行數據挖掘的任務,如為用戶推薦感興趣的好友、判斷蛋白質結構、預測交通流量、檢測異常帳戶等等。但是真實圖的數據量龐大,動輒上億節點、而且內部拓撲結構複雜,很難將傳統的圖分析方法如最短路徑、DFS、BFS、PageRank 等算法應用到這些任務上。鑑於機器學習在圖像、文本領域的廣泛應用,一部分研究者嘗試將機器學習方法和圖數據結合起來,逐漸成為機器學習領域的一股熱潮。
  • 機器學習時代的哈希算法,將如何更高效地索引數據
    哈希算法一直是索引中最為經典的方法,它們能高效地儲存與檢索數據。但在去年 12 月,Jeff Dean 與 MIT 等研究者將索引視為模型,探索了深度學習模型學習的索引優於傳統索引結構的條件。本文首先將介紹什麼是索引以及哈希算法,並描述在機器學習與深度學習時代中,如何將索引視為模型學習比哈希算法更高效的表徵。
  • 觀點| 我們該如何學習機器學習中的數學
    那麼我們該如何在校外學習數學呢?我相信學習數學最好的方法是將其作為一份全職工作,也就是學生。因為離開了學校,我們很難進行結構化的學習,也很難有正向的同齡壓力和眾多的學習資源。但是在校外學習中,我比較推薦成立學習小組或研討會,它們同樣能提供類似學校的學習環境。在研究實驗室中,這種課外學習可能是以閱讀小組的形式進行。
  • 深入淺出:如何從0開始學習大數據挖掘分析?
    最近有很多人諮詢,想學習大數據,但不知道怎麼入手,從哪裡開始學習,需要學習哪些東西?對於一個初學者,學習大數據挖掘分析的思路邏輯是什麼?本文就梳理了如何從0開始學習大數據挖掘分析,學習的步驟思路,可以給大家一個學習的建議。
  • JAVA必須掌握的數據結構和算法
    常見的數據結構鍊表LinkedHashSet LinkedList 底層數據結構由鍊表和哈希表組成。數據的添加和刪除都較為方便,就是訪問比較耗費時間。歸併排序歸併排序算法會把序列分成長度相同的兩個子序列,當無法繼續往下分時(也就是每個子序列中只有一個數據時),就對子序列進行歸併。歸併指的是把兩個排好序的子序列合併成一個有序序列。該操作會一直重複執行,直到所有子序列都歸併為一個整體為止。
  • 被稱為21世紀最性感的工作,我們要如何學習「數據科學」?
    數據科學是什麼?怎樣才能成為一名數據科學家?數據科學的歷史可以追溯到20世紀60年代,但是在當時並未引起學術界的注意。在這個研究被《哈佛商業評論》評為「21世紀最性感的工作」之後,數據科學激起了廣大公眾的興趣!那麼數據科學到底是什麼?怎樣才能成為一名數據科學家?
  • 數據科學家應該知道的頂級機器學習算法
    按學習風格分組的機器學習算法算法可以用多種方式對問題進行建模,因為它涉及與體驗的交互。但是,無論我們要如何調用輸入數據都沒有關係。而且,算法在機器學習和人工智慧中很流行教科書。也就是說,首先要考慮一種算法可以適應的學習方式。通常,機器學習算法只能具有幾種主要的學習方式。而且,我們還將通過它們。另外,我們很少有適合他們的算法和問題類型的例子。
  • 程式設計師要不要學習算法、數據結構、計算機原理等等基礎知識?
    程式設計師要不要學諸如算法、數據結構、網絡編程、計算機原理等等基礎課程?一直是碼農界經久不衰的話題。
  • 阿里三面慘遭被虐,關於數據結構與算法竟然一竅不通!
    以Java為描述語言,介紹計算機編程中使用的數據結構和算法,覆蓋相應競爭性考試的主題,目的不是提供關於數據結構和算法的定理及證明,而是強調問題及其分析,講解必備知識和解題技巧。書中匯集知名IT企業經典的編程面試題目並給出解題思路,為學生應試和軟體開發人員面試提供有益指導。本書特點:所有代碼用Java實現。數據結構難點啟發思考。為每個問題列舉可能的解決辦法。
  • 聯邦學習算法綜述
    聯邦學習算法目前的主要研究方向和瓶頸是如何提升聯邦聚合的優化效率和性能,以達成模型的快速收斂和精準訓練。因此,目前關於聯邦深度學習模型的研究主要是如何優化聯邦聚合,而針對聯邦深度學習模型的研究還相對較少。表1從算法、框架和特點等角度,對比了聯邦機器學習和聯邦深度學習的算法。
  • 谷歌開發出的深度學習算法模型,可用於預測DNA鏈等亞細胞結構的變化
    近日,研究團隊又獲得了新的進展,利用算法分析其亞細胞結構(如線粒體、染色體、DNA鏈等)的變化後,發現了通過分析「眼睛」,我們可以判斷一個人是否有患心臟病的風險。其實揭開它的神秘面紗,其核心就是圖像處理算法。圖像處理是如何應用到生物學領域的?在生物學研究領域,細胞生物學的研究核心點就是:結構決定功能。其中,蛋白質學中就有理論明確提出,細胞的狀態由細胞內結構的位置以及細胞周期的改變來確定。
  • 數據結構與算法-2
    目錄(1)為什麼學習算法(2)時間複雜度(3)數組、鍊表
  • 算法之「算法」:所有機器學習算法都可以表示為神經網絡
    隨後出現了一個又一個新算法,從邏輯回歸到支持向量機。但是眾所周知,神經網絡是算法的算法及機器學習的巔峰。我們可以說,神經網絡是對機器學習的普遍概括,而不是僅僅一次嘗試。直覺上,我們可以通過幾個例子理解,更嚴謹地講,這種說法也可以通過數學方法證明。我們先來定義一下什麼是神經網絡:它是一個體系結構,包括輸入層、隱藏層和輸出層,各層的節點之間互相連接。信息通過線性變換(權重和偏置)和非線性變換(激活函數)從輸入層轉換到輸出層,有一些方法可以更新模型的可訓練參數。
  • 微軟、優步,老工程師告訴你哪些數據結構和算法最重要
    一位在 Uber 等科技公司工作過的開發者分享了他的一手經驗,告訴你實際工作中會用到哪些數據結構和算法。日常工作中,你經常使用算法和數據結構嗎?曾就職於 Uber 等科技公司的工程師 Gergely Orosz 提出了這樣一個問題。此外,他也注意到,越來越多的人覺得算法是無用的,並認為它們只是科技公司提出的一種強制性措施罷了。
  • 大數據到底應該如何學?大數據生態圈技術組件解析
    簡單來說,我們需要學習的就是一系列的大數據生態圈技術組件,以及貫穿整個數據分析流程的分析方法和思維,並且思路更加重要一些!只有明確了數據分析場景與流程,我們才能夠確定需要整合哪些大數據組件來解決這一問題。下面我們將一起推開這一領域的大門~2. 數據是如何採集的大數據分析的第一步就是對數據的收集和管理,我們需要先來了解一下數據是如何產生的?
  • 如何用免費GPU學習AI算法?這篇算法資源大集錦別錯過
    好嘞,現在開始學習深度學習模型。首先從計算機視覺入門。計算機視覺入門最基礎的一個數據集是MNIST。MNIST共包含了70000個手寫數字圖像,數字範圍從0-9。我們現在就要開發一個模型,讓模型能分辨手寫的0-9,詳情請查看《深度學習入門CV-手寫數字識別》。是否太容易就到達90%多的準確率?
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    原標題:機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用高級研修班通信和信息技術創新人才培養工程項目辦公室 通人辦〔2018〕 第5號 機器學習、深度學習算法原理與案例實踐暨Python
  • 數據結構與算法分析筆記——B樹
    數據結構與算法分析筆記——B樹B樹AVL樹的特徵是,通過在插入或刪除時的微調,使得整個樹中任意節點的左子樹和右子樹之間的高度差不超過1。這樣的結果是,整棵樹的高度不至於太高。那麼,如果我們想要得到一棵更低的樹?該如何呢?
  • 如何刻畫數據的本質?流形學習能幫到你
    打開APP 如何刻畫數據的本質?流形學習能幫到你 發表於 2019-04-28 19:08:08 在格物匯之前的文章中,我們系統性的介紹了特徵抽取的經典算法——主成分分析PCA與線性判別分析LDA的原理、應用場景,以及這兩種算法的局限性和改進方法。
  • 聽說你了解深度學習最常用的學習算法:Adam優化算法?
    By蔣思源2017年7月12日  深度學習常常需要大量的時間和機算資源進行訓練,這也是困擾深度學習算法開發的重大原因。雖然我們可以採用分布式並行訓練加速模型的學習,但所需的計算資源並沒有絲毫減少。而唯有需要資源更少、令模型收斂更快的最優化算法,才能從根本上加速機器的學習速度和效果,Adam算法正為此而生!