算法學習基礎(一)

作爲一名普通的二本學校,我在很早之前就有一個目標,那就是大學之後好好找一個軟件開發工作。因此學習了很多的編程基礎,不過近幾天面試發現,技術官總是喜歡問你算法知識。編程語言不斷變化,但是很底層的知識與算法密切相關,算法也就是體現程序員內功所在。因此,從此我要好好學算法。

本筆記參考馬士兵老師的視頻教程:https://www.bilibili.com/video/av46562560

一、基本概念

算法是數據結構與算法的簡稱

1.什麼是數據結構?

Data Structure
簡單的理解,數據結構就是:存儲數據的不同方式
在這裏插入圖片描述

假如我們把5個數據比作5個雞蛋,我們可以把它們放到一個管子裏,也可以把它們放到一個框子裏,這就是不同的存儲方式。存儲數據的不同方式就是不同的數據結構。

引申:加入我們有2,4,7,1,6,3,5個數,我們如何來存儲?

方式一:我們最容易想到的方式就是把其個數挨個緊緊排在一起,中間沒有任何空隙,如圖所示,在計算機中我們叫做數組(實際上,)。數組的每一個存儲單元大小都一樣,每一個整數放到一個單元格里面。
在這裏插入圖片描述

方式二:我們還可以使用另外一種方式,每一個小格除了存儲自己的數據以外,還存着指向下一個小格的指針(鏈條),這樣的存儲方式叫做鏈表。

總結:數據的存儲方式有很多種,對於不同的問題我們會採取不同的存儲方式,這就是我們要學的數據結構。

2.什麼是算法(Algorithm)?

算法是同一個問題的不同解決方法。
如下面的計算題:1+2+3+…+99=?

方式一:我們使用最簡單的方式就是1先加2,再加3,再加4,以此類推。
方式二:我們還可以分別計算1加99,2+98,3+97,以此類推。

同一個問題,我們有不同的解決辦法,這就是算法。而算法往往是針對特定的數據結構的。

假設1:對於1中的鏈表這種數據結構,我們如何往鏈表裏面的7和1插入一個0?
這時候我們只需要將7和1中的鏈條打斷,讓7中的鏈條指向0,0中的鏈條指向1,這時候就構成了一個新的鏈條,這就完成了。

假設2:對於1中的數組,我們如歌在7和1之間插入0?
那麼這個算法就稍微麻煩一些了。數組之間沒有空隙,我們插入不了,因此可以採取以下辦法:我們重新分配一塊新的空間,這是的新空間要比原來的空間要大一個單元格,也就是一個單位的數據大小。這時候先把2,4,7複製下來,再把0插進去,最後把1,6,5,3複製下去,如下圖所示:
在這裏插入圖片描述

由上面我們可以看出,對於插入算法來說,鏈表要比數組簡單的多。當然,不能說數組就不如鏈表,有很多的操作數組要比鏈表快得多,比如說我們想訪問第6個數。對於鏈表來說我們必須從第一個數開始,先找到第一個數,再根據第一個數順着鏈條往後找,最終才能找到。二對於數組來說,找第6個數就很簡單,只要知道單元格的大小,直接往後跨越6個單元格,就可以找到第6個數,所以查找對於數組來說,要比鏈表快。

所以,對不同的數據結構,在不同的應用場景中有不同優點和缺點,所以,選擇什麼樣的數據結構,要根據特定的問題來決定。

總的來說,數據結構就是存儲數據的不同方式,算法就是解決問題的不同方法,而算法往往是針對不同的數據結構的。

二、如何測算算法的優劣?

時間測算:1.計算算法時間差;幅度不夠循環來湊。對於一個問題,完成同樣結果,我們認爲所用時間越少,算法越好;
空間測算:對於一個問題,如果完成同樣的結果,我們認爲,佔用系統的空間越少,算法越好,佔用系統空間越大,算法越不好。

1.我們如何秒速算法的優劣?Big O

O(Big O):Big O(也可以讀作“大O”)用來標識複雜度。

什麼是時間複雜度?計算機解決一個問題執行的時間,隨着問題規模的擴大,時間的變化的規律。
什麼是空間複雜度?計算機解決一個問題做佔用的空間,隨着問題規模的擴大,空間的變化規律。

假設一:如果數組規模爲10,需要找數組中的最後一個數,現在數組規模變成10萬,需要找數組中的最後一個數。時間其實是一樣的,這時候把時間複雜度稱爲O(1),O(1)表示時間複雜度是一個常數,不管數組規模擴大多少,我們需要找第幾個數,所用時間是一個固定的值,此時記爲O(1)。

假設二:如果要訪問鏈表中某個位置的值,這時候時間複雜度爲O(n)。一般時間複雜度我們都講的是最差的情況,在鏈表中,找第一個數的時間複雜度還是爲O(1),而我們一般考慮的是找最後一個數的情況。所以此時複雜度爲O(n)。

時間複雜度一般都有什麼?
n2,n3,log n

假設三:求一個數組的平均數?求一個數組的平均數,我們先把所有數加起來,所以一個數組規模要擴大,我們要加的數隨之擴大,因此時間複雜度是O(n)。

2.思考:用O表示時間複雜度?

a.查找數組最後一個位置上的數
b.查找鏈表最後一個位置上的數
c.對數組求和
d.查找數組的最大值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章