色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

常用的算法技巧總結(jié)

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:未知 ? 作者:李倩 ? 2018-11-07 10:38 ? 次閱讀

今天和大家講講,在做算法題時(shí)常用的一些技巧。對(duì)于平時(shí)沒(méi)用過(guò)這些技巧的人,或許你可以考慮試著去看看在實(shí)踐中能否用的上這些技巧來(lái)優(yōu)化問(wèn)題的解。

1. 巧用數(shù)組下標(biāo)

數(shù)組的下標(biāo)是一個(gè)隱含的很有用的數(shù)組,特別是在統(tǒng)計(jì)一些數(shù)字,或者判斷一些整型數(shù)是否出現(xiàn)過(guò)的時(shí)候。例如,給你一串字母,讓你判斷這些字母出現(xiàn)的次數(shù)時(shí),我們就可以把這些字母作為下標(biāo),在遍歷的時(shí)候,如果字母a遍歷到,則arr[a]就可以加1了,即 arr[a]++;

通過(guò)這種巧用下標(biāo)的方法,我們不需要逐個(gè)字母去判斷。

我再舉個(gè)例子:

問(wèn)題:給你n個(gè)無(wú)序的int整型數(shù)組arr,并且這些整數(shù)的取值范圍都在0-20之間,要你在 O(n) 的時(shí)間復(fù)雜度中把這 n 個(gè)數(shù)按照從小到大的順序打印出來(lái)。

對(duì)于這道題,如果你是先把這 n 個(gè)數(shù)先排序,再打印,是不可能O(n)的時(shí)間打印出來(lái)的。但是數(shù)值范圍在 0-20。我們就可以巧用數(shù)組下標(biāo)了。把對(duì)應(yīng)的數(shù)值作為數(shù)組下標(biāo),如果這個(gè)數(shù)出現(xiàn)過(guò),則對(duì)應(yīng)的數(shù)組加1。

代碼如下:

public void f(int arr[]) { int[] temp = new int[21]; for (int i = 0; i < arr.length; i++) { ? ? ? ? ? ?temp[arr[i]]++; ? ? ? ?} ? ? ? ?//順序打印 ? ? ? ?for (int i = 0; i < 21; i++) { ? ? ? ? ? ?for (int j = 0; j < temp[i]; j++) { ? ? ? ? ? ? ? ?System.out.println(i); ? ? ? ? ? ?} ? ? ? ?} ? ?}

提醒:可以左右滑動(dòng)

利用數(shù)組下標(biāo)的應(yīng)用還有很多,大家以后在遇到某些題的時(shí)候可以考慮是否可以巧用數(shù)組下標(biāo)來(lái)優(yōu)化。

2. 巧用取余

有時(shí)候我們?cè)诒闅v數(shù)組的時(shí)候,會(huì)進(jìn)行越界判斷,如果下標(biāo)差不多要越界了,我們就把它置為0重新遍歷。特別是在一些環(huán)形的數(shù)組中,例如用數(shù)組實(shí)現(xiàn)的隊(duì)列。往往會(huì)寫(xiě)出這樣的代碼:

for (int i = 0; i < N; i++) { ? ? ? ?if (pos < N) { ? ? ? ? //沒(méi)有越界 ? ? ? ? // 使用數(shù)組arr[pos]? ? ? ? else {? ? ? ? ? pos = 0;//置為0再使用數(shù)組 ? ? ? ? ? //使用arr[pos]? ? ? ? ?}? ? ? ? pos++;? ?}

實(shí)際上我們可以通過(guò)取余的方法來(lái)簡(jiǎn)化代碼

for (int i = 0; i < N; i++) { ? //使用數(shù)組arr[pos] ? (我們假設(shè)剛開(kāi)始的時(shí)候pos < N) ? pos = (pos + 1) % N;}

3. 巧用雙指針

對(duì)于雙指針,在做關(guān)于單鏈表的題是特別有用,比如“判斷單鏈表是否有環(huán)”、“如何一次遍歷就找到鏈表中間位置節(jié)點(diǎn)”、“單鏈表中倒數(shù)第 k 個(gè)節(jié)點(diǎn)”等問(wèn)題。對(duì)于這種問(wèn)題,我們就可以使用雙指針了,會(huì)方便很多。我順便說(shuō)下這三個(gè)問(wèn)題怎么用雙指針解決吧。

例如對(duì)于第一個(gè)問(wèn)題

我們就可以設(shè)置一個(gè)慢指針和一個(gè)快指針來(lái)遍歷這個(gè)鏈表。慢指針一次移動(dòng)一個(gè)節(jié)點(diǎn),而快指針一次移動(dòng)兩個(gè)節(jié)點(diǎn),如果該鏈表沒(méi)有環(huán),則快指針會(huì)先遍歷完這個(gè)表,如果有環(huán),則快指針會(huì)在第二次遍歷時(shí)和慢指針相遇。

對(duì)于第二個(gè)問(wèn)題

一樣是設(shè)置一個(gè)快指針和慢指針。慢的一次移動(dòng)一個(gè)節(jié)點(diǎn),而快的兩個(gè)。在遍歷鏈表的時(shí)候,當(dāng)快指針遍歷完成時(shí),慢指針剛好達(dá)到中點(diǎn)。

對(duì)于第三個(gè)問(wèn)題

設(shè)置兩個(gè)指針,其中一個(gè)指針先移動(dòng)k個(gè)節(jié)點(diǎn)。之后兩個(gè)指針以相同速度移動(dòng)。當(dāng)那個(gè)先移動(dòng)的指針遍歷完成的時(shí)候,第二個(gè)指針正好處于倒數(shù)第k個(gè)節(jié)點(diǎn)。

你看,采用雙指針?lè)奖愣嗔税伞K砸院笤谔幚砼c鏈表相關(guān)的一些問(wèn)題的時(shí)候,可以考慮雙指針哦。

4. 巧用移位運(yùn)算。

有時(shí)候我們?cè)谶M(jìn)行除數(shù)或乘數(shù)運(yùn)算的時(shí)候,例如n / 2,n / 4, n / 8這些運(yùn)算的時(shí)候,我們就可以用移位的方法來(lái)運(yùn)算了,這樣會(huì)快很多。

例如:

n / 2 等價(jià)于 n >> 1

n / 4 等價(jià)于 n >> 2

n / 8 等價(jià)于 n >> 3。

這樣通過(guò)移位的運(yùn)算在執(zhí)行速度上是會(huì)比較快的,也可以顯的你很厲害的樣子,哈哈。

還有一些 &(與)、|(或)的運(yùn)算,也可以加快運(yùn)算的速度。例如判斷一個(gè)數(shù)是否是奇數(shù),你可能會(huì)這樣做

if(n % 2 == 1){ dosomething();}

不過(guò)我們用與或運(yùn)算的話(huà)會(huì)快很多。例如判斷是否是奇數(shù),我們就可以把n和1相與了,如果結(jié)果為1,則是奇數(shù),否則就不會(huì)。即

if(n & 1 == 1){ dosomething();)

具體的一些運(yùn)算技巧,還得需要你們多在實(shí)踐中嘗試著去使用,這樣用久后就會(huì)比較熟練了。

5. 設(shè)置哨兵位

在鏈表的相關(guān)問(wèn)題中,我們經(jīng)常會(huì)設(shè)置一個(gè)頭指針,而且這個(gè)頭指針是不存任何有效數(shù)據(jù)的,只是為了操作方便,這個(gè)頭指針我們就可以稱(chēng)之為哨兵位了。

例如我們要?jiǎng)h除頭第一個(gè)節(jié)點(diǎn)是時(shí)候,如果沒(méi)有設(shè)置一個(gè)哨兵位,那么在操作上,它會(huì)與刪除第二個(gè)節(jié)點(diǎn)的操作有所不同。但是我們?cè)O(shè)置了哨兵,那么刪除第一個(gè)節(jié)點(diǎn)和刪除第二個(gè)節(jié)點(diǎn)那么在操作上就一樣了,不用做額外的判斷。當(dāng)然,插入節(jié)點(diǎn)的時(shí)候也一樣。

有時(shí)候我們?cè)诓僮鲾?shù)組的時(shí)候,也是可以設(shè)置一個(gè)哨兵的,把a(bǔ)rr[0]作為哨兵。例如,要判斷兩個(gè)相鄰的元素是否相等時(shí),設(shè)置了哨兵就不怕越界等問(wèn)題了,可以直接arr[i] == arr[i-1]?了。不用怕i = 0時(shí)出現(xiàn)越界。

當(dāng)然我這只是舉一個(gè)例子,具體的應(yīng)用還有很多,例如插入排序,環(huán)形鏈表等。

6. 與遞歸有關(guān)的一些優(yōu)化

(1).對(duì)于可以遞歸的問(wèn)題考慮狀態(tài)保存

當(dāng)我們使用遞歸來(lái)解決一個(gè)問(wèn)題的時(shí)候,容易產(chǎn)生重復(fù)去算同一個(gè)子問(wèn)題,這個(gè)時(shí)候我們要考慮狀態(tài)保存以防止重復(fù)計(jì)算。例如我隨便舉一個(gè)之前舉過(guò)的問(wèn)題

問(wèn)題:一只青蛙一次可以跳上1級(jí)臺(tái)階,也可以跳上2級(jí)。求該青蛙跳上一個(gè)n級(jí)的臺(tái)階總共有多少種跳法?

這個(gè)問(wèn)題用遞歸很好解決。假設(shè) f(n) 表示n級(jí)臺(tái)階的總跳數(shù)法,則有

f(n) = f(n-1) + f(n - 2)。

遞歸的結(jié)束條件是當(dāng)0 <= n <= 2時(shí), f(n) = n。因此我們可以很容易寫(xiě)出遞歸的代碼

public int f(int n) { if (n <= 2) { ? ? ? ? ? ?return n; ? ? ? ?} else { ? ? ? ? ? ?return f(n - 1) + f(n - 2); ? ? ? ?} ? ?}

不過(guò)對(duì)于可以使用遞歸解決的問(wèn)題,我們一定要考慮是否有很多重復(fù)計(jì)算。顯然對(duì)于 f(n) = f(n-1) + f(n-2) 的遞歸,是有很多重復(fù)計(jì)算的。如

就有很多重復(fù)計(jì)算了。這個(gè)時(shí)候我們要考慮狀態(tài)保存。例如用hashMap來(lái)進(jìn)行保存,當(dāng)然用一個(gè)數(shù)組也是可以的,這個(gè)時(shí)候就像我們上面說(shuō)的巧用數(shù)組下標(biāo)了。可以當(dāng)arr[n] = 0時(shí),表示n還沒(méi)計(jì)算過(guò),當(dāng)arr[n] != 0時(shí),表示f(n)已經(jīng)計(jì)算過(guò),這時(shí)就可以把計(jì)算過(guò)的值直接返回回去了。因此我們考慮用狀態(tài)保存的做法代碼如下:

//數(shù)組的大小根據(jù)具體情況來(lái),由于int數(shù)組元素的的默認(rèn)值是0 //因此我們不用初始化 int[] arr = new int[1000]; public int f(int n) { if (n <= 2) { ? ? ? ? ? ?return n; ? ? ? ?} else { ? ? ? ? ? ?if (arr[n] != 0) { ? ? ? ? ? ? ? ?return arr[n];//已經(jīng)計(jì)算過(guò),直接返回 ? ? ? ? ? ?} else { ? ? ? ? ? ? ? ?arr[n] = f(n-1) + f(n-2); ? ? ? ? ? ? ? ?return arr[n]; ? ? ? ? ? ?} ? ? ? ?} ? ?}

這樣,可以極大著提高算法的效率。也有人把這種狀態(tài)保存稱(chēng)之為備忘錄法。

(2).考慮自底向上

對(duì)于遞歸的問(wèn)題,我們一般都是從上往下遞歸的,直到遞歸到最底,再一層一層著把值返回。

不過(guò),有時(shí)候當(dāng)n比較大的時(shí)候,例如當(dāng) n = 10000時(shí),那么必須要往下遞歸10000層直到 n <=2 才將結(jié)果慢慢返回,如果n太大的話(huà),可能棧空間會(huì)不夠用。

對(duì)于這種情況,其實(shí)我們是可以考慮自底向上的做法的。例如我知道

f(1) = 1;

f(2) = 2;

那么我們就可以推出f(3) = f(2) + f(1) = 3。從而可以推出f(4),f(5)等直到f(n)。因此,我們可以考慮使用自底向上的方法來(lái)做。

代碼如下:

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

我們也把這種自底向上的做法稱(chēng)之為遞推。

總結(jié)一下

當(dāng)你在使用遞歸解決問(wèn)題的時(shí)候,要考慮以下兩個(gè)問(wèn)題

(1). 是否有狀態(tài)重復(fù)計(jì)算的,可不可以使用備忘錄法來(lái)優(yōu)化。

(2). 是否可以采取遞推的方法來(lái)自底向上做,減少一味遞歸的開(kāi)銷(xiāo)。

今天就先講到這里,之后有時(shí)間再來(lái)多謝一些其他的。如果覺(jué)得不錯(cuò),不妨點(diǎn)個(gè)贊。

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

    關(guān)注

    23

    文章

    4628

    瀏覽量

    93186
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4821

    瀏覽量

    68890

原文標(biāo)題:一些常用的算法技巧總結(jié)

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    干貨總結(jié):室內(nèi)定位技術(shù)的3大常用算法

    的定位模式。室內(nèi)定位種類(lèi)雖然 多 ,但是 室內(nèi)定位 算法很多都是通用的,總結(jié)起來(lái)有下面 3 種常用算法。 一、 近鄰法 最簡(jiǎn)單的方式,直接選定那個(gè)信號(hào)強(qiáng)度最大的 AP 的位置,定位結(jié)
    的頭像 發(fā)表于 07-27 10:50 ?1.2w次閱讀
    干貨<b class='flag-5'>總結(jié)</b>:室內(nèi)定位技術(shù)的3大<b class='flag-5'>常用</b><b class='flag-5'>算法</b>

    數(shù)字圖像基本處理算法小結(jié)

    初學(xué)圖像處理,在常用算法方面,二白實(shí)在是有些頭疼。就在昨天,親愛(ài)的小白師兄,對(duì)迷茫的二白伸出了援手,為二白送來(lái)了一大份干貨——圖像處理常用算法總結(jié)
    的頭像 發(fā)表于 01-29 14:46 ?1185次閱讀

    吳鑒鷹總結(jié)的單片機(jī)常用算法

    本帖最后由 吳鑒鷹 于 2014-9-28 13:32 編輯 吳鑒鷹總結(jié)的單片機(jī)常用算法QQ群1號(hào):332164870【1000人群】(已滿(mǎn))QQ群2號(hào):194314772【1000人群
    發(fā)表于 05-27 08:26

    單片機(jī)C語(yǔ)言常用算法PDF下載

    灰常好哈···值得擁有{:5:}資深工程師總結(jié)的單片機(jī)C語(yǔ)言常用算法.pdf 2015-7-25 13:57 上傳 點(diǎn)擊文件名下載附件 494.04 KB, 下載次數(shù): 12
    發(fā)表于 07-19 04:30

    單片機(jī)C語(yǔ)言常用算法

    【實(shí)用】資深工程師總結(jié)的單片機(jī)C語(yǔ)言常用算法,希望能幫助到大家!
    發(fā)表于 04-10 09:06

    嵌入式單片機(jī)程序架構(gòu)之時(shí)間片輪詢(xún)法

    littlevGLhttps://mp.weixin.qq.com/s/0Ym65yv4w7UEq72QvTDK3w3、單片機(jī)常用算法總結(jié)https://mp.weixin.qq.com/s/OU...
    發(fā)表于 12-20 06:13

    常用貼片電阻阻值總結(jié)

    本人是關(guān)于常用貼片電阻阻值總結(jié)的資料,有需要的可自行下載。
    發(fā)表于 07-03 17:32 ?0次下載
    <b class='flag-5'>常用</b>貼片電阻阻值<b class='flag-5'>總結(jié)</b>

    路由器常用基礎(chǔ)知識(shí)總結(jié)

    路由器常用基礎(chǔ)知識(shí)總結(jié)路由器常用基礎(chǔ)知識(shí)總結(jié)路由器常用基礎(chǔ)知識(shí)總結(jié)
    發(fā)表于 10-30 18:08 ?0次下載

    高手總結(jié)java常用API(免費(fèi)下載)

    高手總結(jié)java常用API(免費(fèi)下載)。
    發(fā)表于 11-06 11:27 ?0次下載

    MATLAB常用函數(shù)總結(jié)(表格)

    MATLAB常用函數(shù)總結(jié),MATLAB函數(shù)速查手冊(cè),方便應(yīng)用MATLAB函數(shù)
    發(fā)表于 01-21 14:31 ?0次下載

    redis常用命令總結(jié)

    本文是對(duì)redis常用命令總結(jié)
    發(fā)表于 02-09 11:25 ?1622次閱讀

    Adaboost算法總結(jié)

    集成學(xué)習(xí)的Boosting算法通過(guò)結(jié)合多個(gè)弱學(xué)習(xí)器組成強(qiáng)學(xué)習(xí)器,AdaBoost算法是Boosting算法中的一種,本文詳細(xì)的總結(jié)了AdaBoost
    的頭像 發(fā)表于 12-29 16:08 ?3123次閱讀
    Adaboost<b class='flag-5'>算法</b><b class='flag-5'>總結(jié)</b>

    機(jī)器學(xué)習(xí)算法常用指標(biāo)匯總

    機(jī)器學(xué)習(xí)性能評(píng)價(jià)標(biāo)準(zhǔn)是模型優(yōu)化的前提,在設(shè)計(jì)機(jī)器學(xué)習(xí)算法過(guò)程中,不同的問(wèn)題需要用到不同的評(píng)價(jià)標(biāo)準(zhǔn),本文對(duì)機(jī)器學(xué)習(xí)算法常用指標(biāo)進(jìn)行了總結(jié)
    的頭像 發(fā)表于 02-13 15:09 ?4841次閱讀
    機(jī)器學(xué)習(xí)<b class='flag-5'>算法</b><b class='flag-5'>常用</b>指標(biāo)匯總

    vc++-CDC常用函數(shù)總結(jié)

    vc++-CDC常用函數(shù)總結(jié)(電源技術(shù)論壇)-該文檔為vc++-CDC常用函數(shù)總結(jié)講解文檔,是一份還算不錯(cuò)的參考文檔,感興趣的可以下載看看,,,,,,,,,,,,,,,,,
    發(fā)表于 09-27 15:40 ?2次下載
    vc++-CDC<b class='flag-5'>常用</b>函數(shù)<b class='flag-5'>總結(jié)</b>

    圖像處理常用算法總結(jié)

    同圖像灰度不同,邊界處一般會(huì)有明顯的邊緣,利用此特征可以分割圖像。需要說(shuō)明的是:邊緣和物體間的邊界并不等同,邊緣指的是圖像中像素的值有突變的地方,而物體間的邊界指的是現(xiàn)實(shí)場(chǎng)景中的存在于物體之間的邊界。有可能有邊緣的地方并非邊界,也有可能邊界的地方并無(wú)邊緣,因?yàn)楝F(xiàn)實(shí)世界中的物體是三維的,而圖像只具有二維信息,從三維到二維的投影成像不可避免的會(huì)丟失一部分信息;另外,成像過(guò)程中的光照和噪聲也是不可避免的重要因素。正是因?yàn)檫@些原因,基于邊緣的圖像分割仍然是當(dāng)前圖像研究中的世界級(jí)難題,目前研究者正在試圖在邊緣提取中加入高層的語(yǔ)義信息。
    的頭像 發(fā)表于 04-27 11:10 ?1105次閱讀
    圖像處理<b class='flag-5'>常用</b><b class='flag-5'>算法</b><b class='flag-5'>總結(jié)</b>
    主站蜘蛛池模板: 国产在线伊人| 99RE8国产这里只有精品| 18动漫在线观看| 国产极品白嫩超清在线观看| 久久久无码精品亚洲A片软件 | 久久青青草原精品国产软件| 日本亚洲精品无码区国产电影| 一线高清视频在线播放| 国产69精品久久久久乱码免费| 邻家美姨在线观看全集免费| 校花在公车上被内射好舒| a级老头和老太xxxx| 花季v3.0.2黄在线观看| 色屁屁影院| 99在线观看免费视频| 久久精品WWW人人爽人人| 小玲被公扒开腿| 成年性生交大片免费看| 理论片午午伦夜理片2021| 亚洲成人中文| 成年色黄APP下载| 免费视频网站嗯啊轻点| 一二三四在线高清中文版免费观看电影| 国产AV午夜精品一区二区入口| 暖暖视频免费观看视频| 伊人精品影院| 国精产品一区一区三区有限| 善良的小峓子2在钱中文版女主角 善良的小峓子2在钱免费中文字 | 日韩AV片无码一区二区三区不卡 | 亚洲精品福利一区二区在线观看| 高H内射NP古文| 欧美乱码卡一卡二卡四卡免费| 诱受H嗯啊巨肉舍友1V1| 国产在线不卡| 天美传媒果冻传媒入口视频| 99热6精品视频6| 凌馨baby| 在线观看永久免费网址| 精品成人在线视频| 小s现场抛胸挤奶| 国产传媒18精品A片在线观看|