国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

扎實(shí)打牢數(shù)據(jù)結(jié)構(gòu)算法根基,從此不怕算法面試系列之008 week01 02-08 通過常見算法,對(duì)常見的時(shí)間復(fù)雜度做梳理

這篇具有很好參考價(jià)值的文章主要介紹了扎實(shí)打牢數(shù)據(jù)結(jié)構(gòu)算法根基,從此不怕算法面試系列之008 week01 02-08 通過常見算法,對(duì)常見的時(shí)間復(fù)雜度做梳理。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、線性查找法的復(fù)雜度

public static <E> int search(E [] data,E target){
    for (int i = 0; i < data.length; i++)
        if (data[i].equals(target))
            return i;
    return -1;
}

很容易看出,這個(gè)算法的復(fù)雜度為 O(n)。


2、一個(gè)數(shù)組中的元素可以兩兩組成哪些數(shù)據(jù)對(duì)? O(n2)

需要實(shí)現(xiàn)一個(gè)算法,這個(gè)算法用于:找到一個(gè)數(shù)組中的元素可以兩兩組成哪些數(shù)據(jù)對(duì)?
①、在不要求順序的情況下,即data[i],data[j]和data[j],data[i]看作同一個(gè)數(shù)據(jù)對(duì);
②、每一個(gè)元素自己和自己不能組成數(shù)據(jù)對(duì),即data[i],data[i]不是數(shù)據(jù)對(duì)。

這個(gè)算法的代碼如下:

  for(int i=0;i<data.length;i++)
    for (int j=i+1; j< data.length;j++) 
        //獲得一個(gè)數(shù)據(jù)對(duì) (data[i],data[j])

注意,j從i+1開始。
可以分析得出,這個(gè)算法的復(fù)雜度為O(n2)。

雖然是2重循環(huán),但是循環(huán)執(zhí)行的次數(shù)并不是nn,其實(shí)執(zhí)行的次數(shù)為1/2n2,但是1/2作為常數(shù),不重要。


3、遍歷一個(gè)n*n的二維數(shù)組 O(n2)

我們來實(shí)現(xiàn)一個(gè)需求:遍歷一個(gè)n*n的二維數(shù)組 ,代碼如下:

for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) 
        //遍歷到A[i][j]

上述代碼的時(shí)間復(fù)雜度是O(n2)。
注:

在做復(fù)雜度分析時(shí),一定要明確n是誰?

假設(shè)遍歷一個(gè)aa的二維數(shù)組 O(a2)=O(n);
而 a
a=n,上面的n表示的是維度為n(每一個(gè)維度的元素個(gè)數(shù)都是n),下面的n表示的是元素總數(shù)為n。

 for (int i = 0; i < a; i++)
    for (int j = 0; j < a; j++) 
        //遍歷到A[i][j]

看時(shí)間復(fù)雜度也好,總結(jié)時(shí)間復(fù)雜度也好,一定一定要明確n到底誰?


4、數(shù)字n的二進(jìn)制位數(shù) O(logn)

我們來實(shí)現(xiàn)一個(gè)需求:求解數(shù)字n的二進(jìn)制位的位數(shù)?
如何理解位數(shù),我們來舉個(gè)例子,一看就懂:
16這個(gè)數(shù)字的10進(jìn)制位數(shù)有幾位?
有2位嘛,1和16

520這個(gè)數(shù)字的10進(jìn)制位數(shù)有幾位?
3位嘛,5、2、0


我們看下這個(gè)算法的實(shí)現(xiàn)的偽碼:

while(n){
    n%2 //n的二進(jìn)制中的一位
    n/=2;
}

上面?zhèn)未a的時(shí)間復(fù)雜度是:O(logn)。


不同的底數(shù)相差的只是一個(gè)常數(shù)而已,可以復(fù)習(xí)下高中數(shù)學(xué)的換底公式;

所以,最終我們對(duì)數(shù)復(fù)雜度都是不關(guān)注底數(shù)的,都是O(logn)。


注意,分析算法復(fù)雜度的時(shí)候,也不能只看循環(huán)個(gè)數(shù)。

這里n每次除以2,而不是每次減1,所以它到0的速度非??臁圆皇荗(n)級(jí)別,而是O(logn)級(jí)別。


5、求解數(shù)字N的所有約數(shù)? O(n)、O(√n) :根號(hào)n

我們來實(shí)現(xiàn)一個(gè)需求:我們來實(shí)現(xiàn)一個(gè)需求。
首先需要回顧下約數(shù)的概念,假設(shè)a是n的約數(shù),表示n除以a沒有余數(shù),即n可以整除a

for (int i = 1; i <= n ; i++)
    if (n%i==0)
        // i是n的一個(gè)約數(shù)

接著,我們來對(duì)上述算法做一個(gè)優(yōu)化:

 for (int i = 1; i*i <= n ; i++)
    if (n%i==0) //i和n/i都是n的約數(shù),同時(shí)找到兩個(gè)約數(shù)(需要排除i=n/i的情況)

再次強(qiáng)調(diào),看算法復(fù)雜度,不能看循環(huán)個(gè)數(shù)。
上述兩個(gè)算法都是一重循環(huán),但他們循環(huán)的結(jié)束條件不同,優(yōu)化前的算法是i<=n,優(yōu)化后的是i*i<n,所以實(shí)際上這兩個(gè)算法的執(zhí)行次數(shù)是非常不同的。
一個(gè)是n,一個(gè)是根號(hào)n。

所以這個(gè)算法的實(shí)現(xiàn),有2種復(fù)雜度:
O(n)和O(√n) :根號(hào)n。。

6、求所有長度位n的二進(jìn)制數(shù)字的個(gè)數(shù)? O(2^n);2的n次方

我們來實(shí)現(xiàn)一個(gè)需求:求所有長度位n的二進(jìn)制數(shù)字的個(gè)數(shù)?


如何理解這個(gè)題目,比如,所有長度位3的二進(jìn)制數(shù)字,一共有幾個(gè)?

一共有8個(gè),分別是從0到7
0、1、10、11、100、101、110、111

比如,所有長度位4的二進(jìn)制數(shù)字。
一共有16個(gè),分別是從0到15
0、1、10、11、100、101、110、111
1000、1001、1010、1011、1100、1101、1110、1111


這里我們就是用排列組合來得到,長度為n,相當(dāng)于有n個(gè)位置,每個(gè)位置或者填0,或者填1;
每個(gè)位置有2種選擇,現(xiàn)在有n個(gè)位置,則相當(dāng)于n個(gè)2連續(xù)乘起來
222……222=2^n,是2的n次方。

所以,這個(gè)算法的復(fù)雜度為:O(2^n),是2的n次方。

7、長度為n的數(shù)組的所有排列 O(n!)

我們來是實(shí)現(xiàn)一個(gè)需求,求解長度為n的數(shù)組的所有排列個(gè)數(shù)。

舉個(gè)例子,比如,1、2、3的排列個(gè)數(shù)為6,
1、2、3、4的排列個(gè)數(shù)為24。
這里用到了數(shù)學(xué)中的全排列公式。

全排列個(gè)數(shù),n??;
所以這個(gè)算法的復(fù)雜度為:O(n!)

O(2^n),n次方復(fù)雜度和 O(n!)階乘復(fù)雜度,都是非常高,性能非常差的復(fù)雜度。。


O(2^n),當(dāng)n為10,基本就是1000了,程序員都熟悉,實(shí)際是1024,
當(dāng)n為20,基本就是1000*1000=100w了,普通程序員都期望追求的年薪數(shù)字是吧哈哈
當(dāng)n為20,基本就是10億了,你的10個(gè)小目標(biāo)?這么小的目標(biāo),MosesMin可不敢有,哈哈哈
甚至當(dāng)n為100時(shí),科學(xué)家統(tǒng)計(jì),它的大小就接近于宇宙中所有原子的個(gè)數(shù)那么多個(gè)了……
所以指數(shù)級(jí)別是一個(gè)非??植赖脑鲩L。


通常,算法設(shè)計(jì)上,如果n<=20,可以考慮指數(shù)級(jí)別的復(fù)雜度;如果n>20,指數(shù)級(jí)別的復(fù)雜度是承受不起的。
所以算法設(shè)計(jì)上,要盡可能避免指數(shù)級(jí)別的復(fù)雜度;
而階乘的復(fù)雜度就更高了,更是需要全力避免。
階乘級(jí)別也一樣,n<20可以考慮,大于20就不能考慮了。


8、判斷n是否是偶數(shù)? O(1)

判斷n是否是偶數(shù)?偽碼如下:

return n%2 == 0

只有一行代碼,所以復(fù)雜度為:O(1)。

9、常見算法復(fù)雜度總結(jié)

結(jié)論很重要,要記?。?br> O(1)<O(logn)<O(√n)<O(n)<O(nlogn)<O(n2)<O(2^n)<O(n!)

注意;
O(nlogn)很重要。

O(logn)<O(√n)如何比較,不做數(shù)學(xué)推導(dǎo)了,舉個(gè)例子記一下:
log以2為底的1000是多少,大概是10,因?yàn)?的10次方是1024嘛,所以log以2為底的1000大概是10;
1000的根號(hào)值是30多,因?yàn)?0*30=900嘛,所以大概是30。
10<30,所以我們這樣記得:O(logn)<O(√n)

logn比n快很多。
n取100w,logn大概是20次左右,而n要100w次;
數(shù)據(jù)規(guī)模100w的時(shí)候,n和logn的性能差距在5w倍。

logn和nlogn這樣的算法,會(huì)非常多,需要學(xué)習(xí)。
空間復(fù)雜度和時(shí)間復(fù)雜度的計(jì)算基本差不多。

時(shí)間更值錢,空間不太值錢;
所以算法設(shè)計(jì)更重視時(shí)間復(fù)雜度,所以很多算法設(shè)計(jì)思想的本質(zhì)更多是以空間換時(shí)間。
即:可不可以考慮使用緩存等等.

我們常見算法的復(fù)雜度梳理就到這里。文章來源地址http://www.zghlxwxcb.cn/news/detail-418674.html

到了這里,關(guān)于扎實(shí)打牢數(shù)據(jù)結(jié)構(gòu)算法根基,從此不怕算法面試系列之008 week01 02-08 通過常見算法,對(duì)常見的時(shí)間復(fù)雜度做梳理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 扎實(shí)打牢數(shù)據(jù)結(jié)構(gòu)算法根基,從此不怕算法面試系列之010 week02 01-01 最簡單的排序算法-選擇排序法的設(shè)計(jì)思想

    接下類,我們學(xué)習(xí)另外一類非?;A(chǔ)的算法,即排序算法。 排序算法是計(jì)算機(jī)科學(xué)領(lǐng)域研究的非常深入的一類算法,排序這個(gè)動(dòng)作本身也是非常重要的, 很多時(shí)候面對(duì)無需的數(shù)據(jù),首先需要做的就是對(duì)他們進(jìn)行排序。 排序算法——目的:讓數(shù)據(jù)有序。 排序算法——種類:種

    2023年04月21日
    瀏覽(29)
  • 算法 數(shù)據(jù)結(jié)構(gòu)分類 數(shù)據(jù)結(jié)構(gòu)類型介紹 數(shù)據(jù)結(jié)構(gòu)線性非線性結(jié)構(gòu) 算法合集 (一)

    ?數(shù)據(jù)結(jié)構(gòu)分為: ?????????????????????????? a.線性結(jié)構(gòu) ?????????????????????????? b.非線性結(jié)構(gòu) ?a.線性結(jié)構(gòu):? ? ? ? ? ? ?? ? ? ? ? 數(shù)據(jù)與結(jié)構(gòu)存在一對(duì)一的線性關(guān)系; a . 線性結(jié)構(gòu) 存儲(chǔ) 分為: ? ? ?? ? ?? ? ? ? ? ? ? ? ? ? ? ? 順序存儲(chǔ)

    2024年02月10日
    瀏覽(27)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】--算法應(yīng)用--算法和數(shù)據(jù)結(jié)構(gòu)的案例研究

    一、項(xiàng)目管理中的算法應(yīng)用 在項(xiàng)目管理中,算法和數(shù)據(jù)結(jié)構(gòu)的應(yīng)用涉及項(xiàng)目進(jìn)度、資源分配、風(fēng)險(xiǎn)管理等方面。以下是一些案例研究,展示了算法在項(xiàng)目管理中的實(shí)際應(yīng)用: 項(xiàng)目進(jìn)度管理 : 甘特圖算法 :甘特圖是一種項(xiàng)目進(jìn)度管理工具,它使用甘特圖算法來展示項(xiàng)目任務(wù)

    2024年02月08日
    瀏覽(32)
  • 數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)分析—— 數(shù)據(jù)結(jié)構(gòu)及常用算法

    數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)分析—— 數(shù)據(jù)結(jié)構(gòu)及常用算法

    1、順序表與鏈表 線性表是 線性結(jié)構(gòu) ,是包含n個(gè)數(shù)據(jù)元素的有限序列,通過順序存儲(chǔ)的線性表稱為 順序表 ,它是將線性表中所有元素按照其邏輯順序,依次存儲(chǔ)到指定存儲(chǔ)位置開始的一塊連續(xù)的存儲(chǔ)空間里;而通過鏈?zhǔn)酱鎯?chǔ)的 鏈表 中,每個(gè)結(jié)點(diǎn)不僅包含該元素的信息,還

    2024年02月07日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)和算法——數(shù)據(jù)結(jié)構(gòu)

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

    目錄 線性結(jié)構(gòu) ?隊(duì)列結(jié)構(gòu)的隊(duì)列 鏈表結(jié)構(gòu)的隊(duì)列 鏈表的面試題 單向鏈表應(yīng)用場景 約瑟夫環(huán)問題 棧結(jié)構(gòu) 中綴表達(dá)式 前綴表達(dá)式 后綴表達(dá)式 非線性結(jié)構(gòu) 圖 遞歸解決迷宮問題 遞歸解決八皇后問題 順序存儲(chǔ)方式,順序表 常見的順序存儲(chǔ)結(jié)構(gòu)有:數(shù)組、隊(duì)列、鏈表、棧 鏈?zhǔn)酱?/p>

    2024年02月07日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)與算法 --- 數(shù)據(jù)結(jié)構(gòu)緒論

    早期人們都把計(jì)算機(jī)理解為數(shù)值計(jì)算工具,就是感覺計(jì)算機(jī)當(dāng)然是用來計(jì)算的,所以計(jì)算機(jī)解決問題,應(yīng)該是先從具體問題中抽象出一個(gè)適當(dāng)?shù)臄?shù)據(jù)模型,設(shè)計(jì)出一個(gè)解此數(shù)據(jù)模型的算法,然后再編寫程序,得到一個(gè)實(shí)際的軟件。 可現(xiàn)實(shí)中,我們更多的不是解決數(shù)值計(jì)算的問

    2024年02月14日
    瀏覽(20)
  • 數(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)有哪些,常用數(shù)據(jù)結(jié)構(gòu)詳解

    數(shù)據(jù)結(jié)構(gòu)是學(xué)習(xí)數(shù)據(jù)存儲(chǔ)方式的一門學(xué)科,那么,數(shù)據(jù)存儲(chǔ)方式有哪幾種呢?下面將對(duì)數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)內(nèi)容做一個(gè)簡要的總結(jié)。 數(shù)據(jù)結(jié)構(gòu)大致包含以下幾種存儲(chǔ)結(jié)構(gòu): 線性表,還可細(xì)分為順序表、鏈表、棧和隊(duì)列; 樹結(jié)構(gòu),包括普通樹,二叉樹,線索二叉樹等; 圖存儲(chǔ)結(jié)構(gòu)

    2024年02月15日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】1.數(shù)據(jù)結(jié)構(gòu)緒論

    【數(shù)據(jù)結(jié)構(gòu)與算法】1.數(shù)據(jù)結(jié)構(gòu)緒論

    ??博客主頁:愛敲代碼的小楊. ?專欄:《Java SE語法》 ??感謝大家點(diǎn)贊????收藏?評(píng)論???,您的三連就是我持續(xù)更新的動(dòng)力?? ??小楊水平有限,歡迎各位大佬指點(diǎn),相互學(xué)習(xí)進(jìn)步! 數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)中存儲(chǔ)、組織數(shù)據(jù)的方式。 數(shù)據(jù)結(jié)構(gòu)是一種具有一定邏輯關(guān)系,

    2024年01月23日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)與算法——什么是數(shù)據(jù)結(jié)構(gòu)

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

    當(dāng)你決定看這篇文章,就意味著系統(tǒng)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的開始。下面我們先來講什么是數(shù)據(jù)結(jié)構(gòu)。 數(shù)據(jù)結(jié)構(gòu),直白地理解,就是研究數(shù)據(jù)的存儲(chǔ)方式。 我們知道,數(shù)據(jù)存儲(chǔ)只有一個(gè)目的,即為了方便后期對(duì)數(shù)據(jù)的再利用,就如同我們使用數(shù)組存儲(chǔ)? {1,2,3,4,5} ?是為了后期取得它們

    2024年02月15日
    瀏覽(17)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】不就是數(shù)據(jù)結(jié)構(gòu)

    【數(shù)據(jù)結(jié)構(gòu)與算法】不就是數(shù)據(jù)結(jié)構(gòu)

    ? 嗨嘍小伙伴們你們好呀,好久不見了,我已經(jīng)好久沒更新博文了!之前因?yàn)閷?shí)習(xí)沒有時(shí)間去寫博文,現(xiàn)在已經(jīng)回歸校園了。我看了本學(xué)期的課程中有數(shù)據(jù)結(jié)構(gòu)這門課程(這么課程特別重要),因?yàn)橹皩W(xué)過一點(diǎn),所以就想著深入學(xué)習(xí)一下子。畢竟這門課程對(duì)于 考研 和 就業(yè)

    2024年02月07日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包