第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求編程領(lǐng)域上一些經(jīng)典算法同時也是程序員必須掌握的算法?

求編程領(lǐng)域上一些經(jīng)典算法同時也是程序員必須掌握的算法?

紅顏莎娜 2018-10-16 15:11:52
求編程領(lǐng)域上一些經(jīng)典算法同時也是程序員必須掌握的算法
查看完整描述

1 回答

?
拉風(fēng)的咖菲貓

TA貢獻(xiàn)1995條經(jīng)驗 獲得超2個贊

這是我在一個論壇里看到的,你也參考參考吧。C++的虛函數(shù)
======================
C++使用虛函數(shù)實現(xiàn)了其對象的多態(tài),C++對象的開始四個字節(jié)是指向虛函數(shù)表的指針,其初始化順序是先基類后派生類,所以該虛函數(shù)表永遠(yuǎn)指向最后一個派生類,從而實現(xiàn)了相同函數(shù)在不同對象中的不同行為,使得對象既有共性,又有其個性。

內(nèi)存池分配、回收之伙伴算法
=======================
伙伴算法是空閑鏈表法的一個增強算法,依次建立2^0\2^1\2^2\2^3...2^n大小的 內(nèi)存塊空閑鏈表,利用相鄰內(nèi)存塊的伙伴性質(zhì),很容易將互為伙伴的內(nèi)存塊進(jìn)行合并移到相應(yīng)的空閑鏈表或?qū)⒁粔K內(nèi)存拆分成兩塊伙伴內(nèi)存,一塊分配出去,另一塊掛入相應(yīng)空閑鏈表,使得內(nèi)存的分配和回收變得高效。

AVL樹
=======================
AVL樹是一個平衡二叉樹,其中序遍歷是從小到大排序的,該結(jié)構(gòu)插入節(jié)點和檢索非常高效,被廣泛應(yīng)用

快速排序
=======================
通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個排序過程可以遞歸進(jìn)行,以此達(dá)到整個數(shù)據(jù)變成有序序列。效率非常高

密碼學(xué)之非對稱加密協(xié)議(公鑰、私鑰加密協(xié)議)
======================
非對稱加密算法需要兩個密鑰,用其中一個加密產(chǎn)生的密文,只能通過另外一個密鑰解密,密鑰持有者A可以將其中一個公開,稱為公用密鑰,另外一個秘密保存稱為私鑰,這樣當(dāng)某人B想給A傳一封秘信時,只要將密信使用A的公鑰加密后,就可以放心使用各種信道將迷信傳給A了,因為該密信只有A可以解密,第三者截取因為無法解密而毫無意義。
該算法很好地解決了密鑰的安全傳遞的問題,因為公鑰和加密算法都是公開的,私鑰不需要傳輸。

密碼學(xué)之?dāng)?shù)字簽名協(xié)議(身份鑒別、防抵賴)
======================
數(shù)字簽名也是建立在非對稱加密基礎(chǔ)之上的,如果A君用它的私鑰將文件加密后在發(fā)布,A君就無法抵賴該文件是其發(fā)布的,因為其他人能通過A君的公鑰將文件解密就說明,如果算法可靠,該文件一定是A君用其私鑰加密的。
由于非對稱加密算法的加密和解密很慢,現(xiàn)在的數(shù)字簽名并非是將其要發(fā)布的信息用其私鑰加密,而是先用一個單項散列算法如(MD5)產(chǎn)生一個該信息的比較短的指紋(hash值),對其指紋用其私鑰加密后和信息一并發(fā)布,同樣達(dá)到了防抵賴的作用。

無回溯字符串模式匹配-kmp算法
======================
他是根據(jù)子串的特征,當(dāng)匹配失敗時,不需要回溯,而是直接將字串向后滑動若干個字節(jié),繼續(xù)匹配,極大提高了匹配速度。該算法被廣泛使用。詳細(xì)請參考數(shù)據(jù)結(jié)構(gòu)教程。

最小路徑選路-迪杰斯特拉算法、弗洛伊德算法
======================
學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的時候,印象最深的就要算kmp算法和最小路徑算法了,因為理解他們比較費腦子,我是不可能發(fā)明這些算法了,發(fā)明他們的都是天才,呵呵。
使用最短路徑的算法曾經(jīng)幫人寫過一個小東西,還是很有效的,記得是使用的弗洛伊德算法的一個變種,要詳細(xì)了解的朋友可以查找相關(guān)資料,想將他們使用在你的項目中,代碼直接從教科書上抄就可以了,不需要理解。

tcp協(xié)議之-nagle算法
======================
tcp、ip中令人叫絕的想法很多,印象最深的要算nagle算法了。
tcp出于效率和流量控制的考慮,發(fā)送端的數(shù)據(jù)不是產(chǎn)生多少就馬上發(fā)送多少,一般是等到數(shù)據(jù)集聚到發(fā)送緩沖區(qū)長度的一半或者數(shù)據(jù)達(dá)到最大tcp數(shù)據(jù)包數(shù)據(jù)部分長度(好像是65515)才啟動發(fā)送,而且還要看接受端可用緩沖區(qū)的大小,如果接受端產(chǎn)生一個回應(yīng)報文通知發(fā)送端沒有接受空間了,發(fā)送端哪怕緩沖區(qū)已經(jīng)滿了,也不會啟動發(fā)送,直到接受端通告發(fā)送端其已經(jīng)有了接受數(shù)據(jù)的空間了。
這樣就有一個問題,假如發(fā)送端就是要發(fā)送一個小報文(比如10個字節(jié)),然后等待對方的回應(yīng)。按照上面的方案,tcp會一直等數(shù)據(jù)收集到一定量才發(fā)送,于是矛盾就產(chǎn)生了。應(yīng)用層不再發(fā)數(shù)據(jù),tcp等不到足夠的數(shù)據(jù)不會將10個字的數(shù)據(jù)發(fā)送到網(wǎng)卡,接收端應(yīng)用層收不到數(shù)據(jù)就不會回應(yīng)發(fā)送端。
你也可能說,可以讓修改發(fā)送端發(fā)送條件,不一定要等到足夠的數(shù)據(jù)再發(fā)送,為了效率考慮,可以考慮延時一定的時間,比如說1秒,如果上層還沒有數(shù)據(jù)到來,就將發(fā)送緩沖中的數(shù)據(jù)發(fā)出去。當(dāng)然這樣也是可行的,盡管應(yīng)用端白白等了1秒鐘啥也沒干,呵呵。
其實nagle算法很好解決了該問題,它的做發(fā)是鏈接建立后的第一次發(fā)送不用等待,直接將數(shù)據(jù)組裝成tcp報文發(fā)送出去,以后要么等到數(shù)據(jù)量足夠多、要么是等到接受方的確認(rèn)報文,算法及其簡單,而且很好解決了上面的矛盾。

socket之io模型設(shè)計
======================
windows下socket有兩種工作方式:
1)同步方式
2)異步方式

同步socket又有兩種工作模式:
1)阻塞模式
2)非阻塞模式

阻塞模式是最簡單的工作模式,以tcp的發(fā)送數(shù)據(jù)為例,如果發(fā)送緩沖區(qū)沒有空間,send調(diào)用就不會返回,一直要等到能夠發(fā)出一點數(shù)據(jù)為止,哪怕是一個字節(jié),但是send返回并不表示我要發(fā)送的數(shù)據(jù)已經(jīng)全部提交給了tcp,所以send返回時要檢查這次發(fā)送的數(shù)量,調(diào)整發(fā)送緩沖指針,繼續(xù)發(fā)送,直到所有數(shù)據(jù)都提交給了系統(tǒng)。
由于其阻塞的特性,會阻塞發(fā)送線程,所以單線程的程序是不適合使用阻塞模式通信的,一般使用一個連接一個線程的方法,但是這種方式對于要維護(hù)多個連接的程序,是個不好的選擇,線程越多,開銷越大。

同步非阻塞模式的socket不會阻塞通信線程,如果發(fā)送緩沖區(qū)滿,send調(diào)用也是立刻返回,接受緩沖區(qū)空,recv也不會阻塞,所以通信線程要反復(fù)調(diào)用send或recv嘗試發(fā)送或接收數(shù)據(jù),對cpu是很大的浪費。
針對非阻塞的尷尬,接口開發(fā)人員發(fā)明了三種io模型來解決該問題:
1)選擇模型(select)
2)異步選擇模型(AsyncSelect)
3)事件選擇模型(EventSeselect)
其思想是根據(jù)io類型,預(yù)先查看1個或n個socket是否能讀、寫等。
其select本身來說,select是阻塞的,可以同時監(jiān)視多個socket,只要所監(jiān)視的其中一個socket可以讀、寫,secect調(diào)用才返回
異步選擇模型其select是異步的(異步是不會阻塞的),是將監(jiān)視任務(wù)委托給系統(tǒng),系統(tǒng)在socket可讀、寫時通過消息通知應(yīng)用程序。有一點需要說明,假如應(yīng)用程序已經(jīng)有很多數(shù)據(jù)需要發(fā)送,當(dāng)收到可寫通知時,一定要盡量多地發(fā)送數(shù)據(jù),直到發(fā)送失敗,lasterror提示“將要阻塞”,將來才可能有新的可寫通知到來,否則永遠(yuǎn)也不會有。
事件選擇模型也是將監(jiān)視socket狀態(tài)的工作委托給系統(tǒng),系統(tǒng)在適當(dāng)?shù)臅r候通過事件通知應(yīng)用程序socket可以的操作。

除了同步工作方式外,還有一種叫異步工作方式
異步工作方式是不會阻塞的,因為是將io操作本身委托給系統(tǒng),系統(tǒng)在io操作完成后通過回調(diào)例程或事件或完成包通知應(yīng)用程序
異步工作方式有兩種io模型和其對應(yīng),其實這兩種模型是window是異步io的實現(xiàn):
1)重疊模型
2)完成端口

重疊模型通過事件或回調(diào)例程通知應(yīng)用程序io已經(jīng)完成
完成端口模型比較復(fù)雜,完成端口本身其實是一個io完成包隊列。
應(yīng)用程序一般創(chuàng)建若干個線程用來監(jiān)視完成端口,這些線程試圖從完成端口移除一個完成包,如果有,移除成功,應(yīng)用程序處理該完成包,否則應(yīng)用程序監(jiān)視完成端口的線程被阻塞。

select模型是從UNIX上的Berkeley Software Distribution(BSD)版本的套接字就實現(xiàn)了的,其它四種io模型windows發(fā)明的,在windows中完成端口和異步選擇模型是使用比較廣泛的,一般分別用于服務(wù)端和客戶端開發(fā)。
這五種io模型設(shè)計還是比較巧妙的:三種選擇模型很好解決了“同步非阻塞”模式編程的不足;重疊模型和完成端口是windows異步io的經(jīng)典實現(xiàn),不局限于網(wǎng)絡(luò)io,對文件io同樣適用。

說點題外話,socket的send完成僅僅是將數(shù)據(jù)(可能是部分)提交給系統(tǒng),而不是已經(jīng)發(fā)送到了網(wǎng)卡上,更不是已經(jīng)發(fā)送到了接收端。所以要知道你的數(shù)據(jù)已經(jīng)發(fā)送到了對方的應(yīng)用層的唯一方法是,讓對方給你發(fā)送一個應(yīng)對包。
發(fā)送數(shù)據(jù)要注意,對應(yīng)tcp,要防止發(fā)送和接收的亂序,對于發(fā)送,一般應(yīng)該為每一個鏈接建立一個發(fā)送隊列,采用類似nagle的算法啟動數(shù)據(jù)發(fā)送。
一次發(fā)送可能是你提交數(shù)據(jù)的一部分,一定要當(dāng)心,否則出問題沒處找去。


查看完整回答
反對 回復(fù) 2018-10-24
  • 1 回答
  • 0 關(guān)注
  • 705 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號