-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
深度哈希算法(深度哈希圖像檢索)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于深度哈希算法的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、【深度知識】區(qū)塊鏈之加密原理圖示(加密,簽名)
先放一張以太坊的架構(gòu)圖:
在學(xué)習(xí)的過程中主要是采用單個模塊了學(xué)習(xí)了解的,包括P2P,密碼學(xué),網(wǎng)絡(luò),協(xié)議等。直接開始總結(jié):
秘鑰分配問題也就是秘鑰的傳輸問題,如果對稱秘鑰,那么只能在線下進行秘鑰的交換。如果在線上傳輸秘鑰,那就有可能被攔截。所以采用非對稱加密,兩把鑰匙,一把私鑰自留,一把公鑰公開。公鑰可以在網(wǎng)上傳輸。不用線下交易。保證數(shù)據(jù)的安全性。
如上圖,A節(jié)點發(fā)送數(shù)據(jù)到B節(jié)點,此時采用公鑰加密。A節(jié)點從自己的公鑰中獲取到B節(jié)點的公鑰對明文數(shù)據(jù)加密,得到密文發(fā)送給B節(jié)點。而B節(jié)點采用自己的私鑰解密。
2、無法解決消息篡改。
如上圖,A節(jié)點采用B的公鑰進行加密,然后將密文傳輸給B節(jié)點。B節(jié)點拿A節(jié)點的公鑰將密文解密。
1、由于A的公鑰是公開的,一旦網(wǎng)上黑客攔截消息,密文形同虛設(shè)。說白了,這種加密方式,只要攔截消息,就都能解開。
2、同樣存在無法確定消息來源的問題,和消息篡改的問題。
如上圖,A節(jié)點在發(fā)送數(shù)據(jù)前,先用B的公鑰加密,得到密文1,再用A的私鑰對密文1加密得到密文2。而B節(jié)點得到密文后,先用A的公鑰解密,得到密文1,之后用B的私鑰解密得到明文。
1、當(dāng)網(wǎng)絡(luò)上攔截到數(shù)據(jù)密文2時, 由于A的公鑰是公開的,故可以用A的公鑰對密文2解密,就得到了密文1。所以這樣看起來是雙重加密,其實最后一層的私鑰簽名是無效的。一般來講,我們都希望簽名是簽在最原始的數(shù)據(jù)上。如果簽名放在后面,由于公鑰是公開的,簽名就缺乏安全性。
2、存在性能問題,非對稱加密本身效率就很低下,還進行了兩次加密過程。
如上圖,A節(jié)點先用A的私鑰加密,之后用B的公鑰加密。B節(jié)點收到消息后,先采用B的私鑰解密,然后再利用A的公鑰解密。
1、當(dāng)密文數(shù)據(jù)2被黑客攔截后,由于密文2只能采用B的私鑰解密,而B的私鑰只有B節(jié)點有,其他人無法機密。故安全性最高。
2、當(dāng)B節(jié)點解密得到密文1后, 只能采用A的公鑰來解密。而只有經(jīng)過A的私鑰加密的數(shù)據(jù)才能用A的公鑰解密成功,A的私鑰只有A節(jié)點有,所以可以確定數(shù)據(jù)是由A節(jié)點傳輸過來的。
經(jīng)兩次非對稱加密,性能問題比較嚴(yán)重。
基于以上篡改數(shù)據(jù)的問題,我們引入了消息認(rèn)證。經(jīng)過消息認(rèn)證后的加密流程如下:
當(dāng)A節(jié)點發(fā)送消息前,先對明文數(shù)據(jù)做一次散列計算。得到一個摘要, 之后將照耀與原始數(shù)據(jù)同時發(fā)送給B節(jié)點。當(dāng)B節(jié)點接收到消息后,對消息解密。解析出其中的散列摘要和原始數(shù)據(jù),然后再對原始數(shù)據(jù)進行一次同樣的散列計算得到摘要1, 比較摘要與摘要1。如果相同則未被篡改,如果不同則表示已經(jīng)被篡改。
在傳輸過程中,密文2只要被篡改,最后導(dǎo)致的hash與hash1就會產(chǎn)生不同。
無法解決簽名問題,也就是雙方相互攻擊。A對于自己發(fā)送的消息始終不承認(rèn)。比如A對B發(fā)送了一條錯誤消息,導(dǎo)致B有損失。但A抵賴不是自己發(fā)送的。
在(三)的過程中,沒有辦法解決交互雙方相互攻擊。什么意思呢? 有可能是因為A發(fā)送的消息,對A節(jié)點不利,后來A就抵賴這消息不是它發(fā)送的。
為了解決這個問題,故引入了簽名。這里我們將(二)-4中的加密方式,與消息簽名合并設(shè)計在一起。
在上圖中,我們利用A節(jié)點的私鑰對其發(fā)送的摘要信息進行簽名,然后將簽名+原文,再利用B的公鑰進行加密。而B得到密文后,先用B的私鑰解密,然后 對摘要再用A的公鑰解密,只有比較兩次摘要的內(nèi)容是否相同。這既避免了防篡改問題,有規(guī)避了雙方攻擊問題。因為A對信息進行了簽名,故是無法抵賴的。
為了解決非對稱加密數(shù)據(jù)時的性能問題,故往往采用混合加密。這里就需要引入對稱加密,如下圖:
在對數(shù)據(jù)加密時,我們采用了雙方共享的對稱秘鑰來加密。而對稱秘鑰盡量不要在網(wǎng)絡(luò)上傳輸,以免丟失。這里的共享對稱秘鑰是根據(jù)自己的私鑰和對方的公鑰計算出的,然后適用對稱秘鑰對數(shù)據(jù)加密。而對方接收到數(shù)據(jù)時,也計算出對稱秘鑰然后對密文解密。
以上這種對稱秘鑰是不安全的,因為A的私鑰和B的公鑰一般短期內(nèi)固定,所以共享對稱秘鑰也是固定不變的。為了增強安全性,最好的方式是每次交互都生成一個臨時的共享對稱秘鑰。那么如何才能在每次交互過程中生成一個隨機的對稱秘鑰,且不需要傳輸呢?
那么如何生成隨機的共享秘鑰進行加密呢?
對于發(fā)送方A節(jié)點,在每次發(fā)送時,都生成一個臨時非對稱秘鑰對,然后根據(jù)B節(jié)點的公鑰 和 臨時的非對稱私鑰 可以計算出一個對稱秘鑰(KA算法-Key Agreement)。然后利用該對稱秘鑰對數(shù)據(jù)進行加密,針對共享秘鑰這里的流程如下:
對于B節(jié)點,當(dāng)接收到傳輸過來的數(shù)據(jù)時,解析出其中A節(jié)點的隨機公鑰,之后利用A節(jié)點的隨機公鑰 與 B節(jié)點自身的私鑰 計算出對稱秘鑰(KA算法)。之后利用對稱秘鑰機密數(shù)據(jù)。
對于以上加密方式,其實仍然存在很多問題,比如如何避免重放攻擊(在消息中加入 Nonce ),再比如彩虹表(參考 KDF機制解決 )之類的問題。由于時間及能力有限,故暫時忽略。
那么究竟應(yīng)該采用何種加密呢?
主要還是基于要傳輸?shù)臄?shù)據(jù)的安全等級來考量。不重要的數(shù)據(jù)其實做好認(rèn)證和簽名就可以,但是很重要的數(shù)據(jù)就需要采用安全等級比較高的加密方案了。
密碼套件 是一個網(wǎng)絡(luò)協(xié)議的概念。其中主要包括身份認(rèn)證、加密、消息認(rèn)證(MAC)、秘鑰交換的算法組成。
在整個網(wǎng)絡(luò)的傳輸過程中,根據(jù)密碼套件主要分如下幾大類算法:
秘鑰交換算法:比如ECDHE、RSA。主要用于客戶端和服務(wù)端握手時如何進行身份驗證。
消息認(rèn)證算法:比如SHA1、SHA2、SHA3。主要用于消息摘要。
批量加密算法:比如AES, 主要用于加密信息流。
偽隨機數(shù)算法:例如TLS 1.2的偽隨機函數(shù)使用MAC算法的散列函數(shù)來創(chuàng)建一個 主密鑰 ——連接雙方共享的一個48字節(jié)的私鑰。主密鑰在創(chuàng)建會話密鑰(例如創(chuàng)建MAC)時作為一個熵來源。
在網(wǎng)絡(luò)中,一次消息的傳輸一般需要在如下4個階段分別進行加密,才能保證消息安全、可靠的傳輸。
握手/網(wǎng)絡(luò)協(xié)商階段:
在雙方進行握手階段,需要進行鏈接的協(xié)商。主要的加密算法包括RSA、DH、ECDH等
身份認(rèn)證階段:
身份認(rèn)證階段,需要確定發(fā)送的消息的來源來源。主要采用的加密方式包括RSA、DSA、ECDSA(ECC加密,DSA簽名)等。
消息加密階段:
消息加密指對發(fā)送的信息流進行加密。主要采用的加密方式包括DES、RC4、AES等。
消息身份認(rèn)證階段/防篡改階段:
主要是保證消息在傳輸過程中確保沒有被篡改過。主要的加密方式包括MD5、SHA1、SHA2、SHA3等。
ECC :Elliptic Curves Cryptography,橢圓曲線密碼編碼學(xué)。是一種根據(jù)橢圓上點倍積生成 公鑰、私鑰的算法。用于生成公私秘鑰。
ECDSA :用于數(shù)字簽名,是一種數(shù)字簽名算法。一種有效的數(shù)字簽名使接收者有理由相信消息是由已知的發(fā)送者創(chuàng)建的,從而發(fā)送者不能否認(rèn)已經(jīng)發(fā)送了消息(身份驗證和不可否認(rèn)),并且消息在運輸過程中沒有改變。ECDSA簽名算法是ECC與DSA的結(jié)合,整個簽名過程與DSA類似,所不一樣的是簽名中采取的算法為ECC,最后簽名出來的值也是分為r,s。 主要用于身份認(rèn)證階段 。
ECDH :也是基于ECC算法的霍夫曼樹秘鑰,通過ECDH,雙方可以在不共享任何秘密的前提下協(xié)商出一個共享秘密,并且是這種共享秘鑰是為當(dāng)前的通信暫時性的隨機生成的,通信一旦中斷秘鑰就消失。 主要用于握手磋商階段。
ECIES: 是一種集成加密方案,也可稱為一種混合加密方案,它提供了對所選擇的明文和選擇的密碼文本攻擊的語義安全性。ECIES可以使用不同類型的函數(shù):秘鑰協(xié)商函數(shù)(KA),秘鑰推導(dǎo)函數(shù)(KDF),對稱加密方案(ENC),哈希函數(shù)(HASH), H-MAC函數(shù)(MAC)。
ECC 是橢圓加密算法,主要講述了按照公私鑰怎么在橢圓上產(chǎn)生,并且不可逆。 ECDSA 則主要是采用ECC算法怎么來做簽名, ECDH 則是采用ECC算法怎么生成對稱秘鑰。以上三者都是對ECC加密算法的應(yīng)用。而現(xiàn)實場景中,我們往往會采用混合加密(對稱加密,非對稱加密結(jié)合使用,簽名技術(shù)等一起使用)。 ECIES 就是底層利用ECC算法提供的一套集成(混合)加密方案。其中包括了非對稱加密,對稱加密和簽名的功能。
<meta charset="utf-8">
這個先訂條件是為了保證曲線不包含奇點。
所以,隨著曲線參數(shù)a和b的不斷變化,曲線也呈現(xiàn)出了不同的形狀。比如:
所有的非對稱加密的基本原理基本都是基于一個公式 K = k G。其中K代表公鑰,k代表私鑰,G代表某一個選取的基點。非對稱加密的算法 就是要保證 該公式 不可進行逆運算( 也就是說G/K是無法計算的 )。 *
ECC是如何計算出公私鑰呢?這里我按照我自己的理解來描述。
我理解,ECC的核心思想就是:選擇曲線上的一個基點G,之后隨機在ECC曲線上取一個點k(作為私鑰),然后根據(jù)k G計算出我們的公鑰K。并且保證公鑰K也要在曲線上。*
那么k G怎么計算呢?如何計算k G才能保證最后的結(jié)果不可逆呢?這就是ECC算法要解決的。
首先,我們先隨便選擇一條ECC曲線,a = -3, b = 7 得到如下曲線:
在這個曲線上,我隨機選取兩個點,這兩個點的乘法怎么算呢?我們可以簡化下問題,乘法是都可以用加法表示的,比如2 2 = 2+2,3 5 = 5+5+5。 那么我們只要能在曲線上計算出加法,理論上就能算乘法。所以,只要能在這個曲線上進行加法計算,理論上就可以來計算乘法,理論上也就可以計算k*G這種表達式的值。
曲線上兩點的加法又怎么算呢?這里ECC為了保證不可逆性,在曲線上自定義了加法體系。
現(xiàn)實中,1+1=2,2+2=4,但在ECC算法里,我們理解的這種加法體系是不可能。故需要自定義一套適用于該曲線的加法體系。
ECC定義,在圖形中隨機找一條直線,與ECC曲線相交于三個點(也有可能是兩個點),這三點分別是P、Q、R。
那么P+Q+R = 0。其中0 不是坐標(biāo)軸上的0點,而是ECC中的無窮遠(yuǎn)點。也就是說定義了無窮遠(yuǎn)點為0點。
同樣,我們就能得出 P+Q = -R。 由于R 與-R是關(guān)于X軸對稱的,所以我們就能在曲線上找到其坐標(biāo)。
P+R+Q = 0, 故P+R = -Q , 如上圖。
以上就描述了ECC曲線的世界里是如何進行加法運算的。
從上圖可看出,直線與曲線只有兩個交點,也就是說 直線是曲線的切線。此時P,R 重合了。
也就是P = R, 根據(jù)上述ECC的加法體系,P+R+Q = 0, 就可以得出 P+R+Q = 2P+Q = 2R+Q=0
于是乎得到 2 P = -Q (是不是與我們非對稱算法的公式 K = k G 越來越近了)。
于是我們得出一個結(jié)論,可以算乘法,不過只有在切點的時候才能算乘法,而且只能算2的乘法。
假若 2 可以變成任意個數(shù)進行想乘,那么就能代表在ECC曲線里可以進行乘法運算,那么ECC算法就能滿足非對稱加密算法的要求了。
那么我們是不是可以隨機任何一個數(shù)的乘法都可以算呢? 答案是肯定的。 也就是點倍積 計算方式。
選一個隨機數(shù) k, 那么k * P等于多少呢?
我們知道在計算機的世界里,所有的都是二進制的,ECC既然能算2的乘法,那么我們可以將隨機數(shù)k描 述成二進制然后計算。假若k = 151 = 10010111
由于2 P = -Q 所以 這樣就計算出了k P。 這就是點倍積算法 。所以在ECC的曲線體系下是可以來計算乘法,那么以為這非對稱加密的方式是可行的。
至于為什么這樣計算 是不可逆的。這需要大量的推演,我也不了解。但是我覺得可以這樣理解:
我們的手表上,一般都有時間刻度?,F(xiàn)在如果把1990年01月01日0點0分0秒作為起始點,如果告訴你至起始點為止時間流逝了 整1年,那么我們是可以計算出現(xiàn)在的時間的,也就是能在手表上將時分秒指針應(yīng)該指向00:00:00。但是反過來,我說現(xiàn)在手表上的時分秒指針指向了00:00:00,你能告訴我至起始點算過了有幾年了么?
ECDSA簽名算法和其他DSA、RSA基本相似,都是采用私鑰簽名,公鑰驗證。只不過算法體系采用的是ECC的算法。交互的雙方要采用同一套參數(shù)體系。簽名原理如下:
在曲線上選取一個無窮遠(yuǎn)點為基點 G = (x,y)。隨機在曲線上取一點k 作為私鑰, K = k*G 計算出公鑰。
簽名過程:
生成隨機數(shù)R, 計算出RG.
根據(jù)隨機數(shù)R,消息M的HASH值H,以及私鑰k, 計算出簽名S = (H+kx)/R.
將消息M,RG,S發(fā)送給接收方。
簽名驗證過程:
接收到消息M, RG,S
根據(jù)消息計算出HASH值H
根據(jù)發(fā)送方的公鑰K,計算 HG/S + xK/S, 將計算的結(jié)果與 RG比較。如果相等則驗證成功。
公式推論:
HG/S + xK/S = HG/S + x(kG)/S = (H+xk)/GS = RG
在介紹原理前,說明一下ECC是滿足結(jié)合律和交換律的,也就是說A+B+C = A+C+B = (A+C)+B。
這里舉一個WIKI上的例子說明如何生成共享秘鑰,也可以參考 Alice And Bob 的例子。
Alice 與Bob 要進行通信,雙方前提都是基于 同一參數(shù)體系的ECC生成的 公鑰和私鑰。所以有ECC有共同的基點G。
生成秘鑰階段:
Alice 采用公鑰算法 KA = ka * G ,生成了公鑰KA和私鑰ka, 并公開公鑰KA。
Bob 采用公鑰算法 KB = kb * G ,生成了公鑰KB和私鑰 kb, 并公開公鑰KB。
計算ECDH階段:
Alice 利用計算公式 Q = ka * KB 計算出一個秘鑰Q。
Bob 利用計算公式 Q' = kb * KA 計算出一個秘鑰Q'。
共享秘鑰驗證:
Q = ka KB = ka * kb * G = ka * G * kb = KA * kb = kb * KA = Q'
故 雙方分別計算出的共享秘鑰不需要進行公開就可采用Q進行加密。我們將Q稱為共享秘鑰。
在以太坊中,采用的ECIEC的加密套件中的其他內(nèi)容:
1、其中HASH算法采用的是最安全的SHA3算法 Keccak 。
2、簽名算法采用的是 ECDSA
3、認(rèn)證方式采用的是 H-MAC
4、ECC的參數(shù)體系采用了secp256k1, 其他參數(shù)體系 參考這里
H-MAC 全程叫做 Hash-based Message Authentication Code. 其模型如下:
在 以太坊 的 UDP通信時(RPC通信加密方式不同),則采用了以上的實現(xiàn)方式,并擴展化了。
首先,以太坊的UDP通信的結(jié)構(gòu)如下:
其中,sig是 經(jīng)過 私鑰加密的簽名信息。mac是可以理解為整個消息的摘要, ptype是消息的事件類型,data則是經(jīng)過RLP編碼后的傳輸數(shù)據(jù)。
其UDP的整個的加密,認(rèn)證,簽名模型如下:
二、數(shù)據(jù)庫技術(shù)知識數(shù)據(jù)結(jié)構(gòu)的算法
數(shù)據(jù)庫技術(shù)知識數(shù)據(jù)結(jié)構(gòu)的算法
對于將要參加計算機等級考試的考生來說,計算機等級考試的知識點輔導(dǎo)是非常重要的復(fù)習(xí)資料。以下是我收集的數(shù)據(jù)庫技術(shù)知識數(shù)據(jù)結(jié)構(gòu)的算法,希望大家認(rèn)真閱讀!
1、數(shù)據(jù):數(shù)據(jù)的基本單位是數(shù)據(jù)元素。數(shù)據(jù)元素可由一個或多個數(shù)據(jù)項組成。數(shù)據(jù)項是數(shù)據(jù)的不可分割的最小單位
2、數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)的邏輯結(jié)構(gòu)、數(shù)據(jù)的存儲結(jié)構(gòu)、數(shù)據(jù)的運算
3、主要的數(shù)據(jù)存儲方式:順序存儲結(jié)構(gòu)(邏輯和物理相鄰,存儲密度大)和鏈?zhǔn)酱鎯Y(jié)構(gòu)
順序存儲結(jié)構(gòu):
順序存儲計算公式 Li=L0+(i-1)×K 順序結(jié)構(gòu)可以進行隨機存取;插人、刪除運算會引起相應(yīng)節(jié)點的大量移動
鏈?zhǔn)酱鎯Y(jié)構(gòu):a、指針域可以有多個,可以指向空,比比順序存儲結(jié)構(gòu)的存儲密度小
b、邏輯上相鄰的節(jié)點物理上不一定相鄰。 c、插人、刪除等不需要大量移動節(jié)點
4、順序表:一般情況下,若長度為n的順序表,在任何位置插入或刪除的概率相等,元素移動的平均次數(shù)為n/2(插入)和(n-1)/2(刪除)。
5、鏈表:線性鏈表(單鏈表和雙向鏈表等等)和非線性鏈表
線性鏈表也稱為單鏈表,其每個一節(jié)點中只包含一個指針域,雙鏈表中,每個節(jié)點中設(shè)置有兩個指針域。(注意結(jié)點的插入和刪除操作)
6、棧:“后進先出”(LIFO)表。棧的應(yīng)用:表達式求解、二叉樹對稱序周游、快速排序算法、遞歸過程的實現(xiàn)等
7、隊列:“先進先出”線性表。應(yīng)用:樹的層次遍歷
8、串:由零個或多個字符組成的有限序列。
9、多維數(shù)組的順序存儲:
10、稀疏矩陣的存儲:下三角矩陣順序存儲
其他常見的存儲方法還有三元組法和十字鏈表法
11、廣義表:由零個或多個單元素或子表所組成的有限序列。廣義表的元素可以是子表,而子表的元素還可以是子表
12、樹型結(jié)構(gòu):非線性結(jié)構(gòu)。常用的樹型結(jié)構(gòu)有樹和二叉樹。
二叉樹與樹的區(qū)別:二叉樹不是樹的特殊情況,樹和二叉樹之間最主要的區(qū)別是:二叉樹的節(jié)點的子樹要區(qū)分左子樹和右子樹,即使在節(jié)點只有一棵子樹的情況下也要明確指出該子樹是左子樹還是右子樹。
13、樹(森林)與二叉樹之間的轉(zhuǎn)換(要會轉(zhuǎn)換)
14、二叉樹和樹的周游(遍歷)
二叉樹的周游主要有以下3種方式:前序法(NLR)、對稱序法(LNR)、后序法(LRN)
周游樹和樹林:深度優(yōu)先和按廣度優(yōu)先兩種方式進行。深度優(yōu)先方式又可分為按先根次序和按后根次序周游
樹與二叉樹周游之間的對應(yīng)關(guān)系:按先根次序周游樹正好與按前序法周游樹對應(yīng)的二叉樹等同,后根次序周游樹正好與按對稱序法周游對應(yīng)的`二叉樹等同
按廣度優(yōu)先方式就是層次次序周游
15、二叉樹的存儲和線索
二叉樹的存儲結(jié)構(gòu):二叉樹的llink一rlink法存儲表示
線索二叉樹:在有n個節(jié)點的二叉樹的且llink - rlink法存儲表示中,必定有n+1個空指針域
16、哈夫曼樹:一類帶權(quán)路徑長度最短的樹。樹的帶權(quán)路徑長度為樹中所有葉子節(jié)點的帶權(quán)路徑長度之和WPL。
17、查找:
(1)順序查找:平均查找長度為(n +1 )/2次,時間復(fù)雜度為O(n)
(2)二分法查找:線性表節(jié)點必須按關(guān)鍵碼值排序,且線性表是以順序存儲方式存儲的。查找成功比較次數(shù)log2n,查找失敗比較次數(shù)log2n+1
(3)分塊查找:先是塊間查找,然后塊內(nèi)查找。
(4)散列表(哈希表Hash)的存儲和查找:處理沖突的方法:開地址法(線性探測法)、拉鏈法等
負(fù)載因子(裝填因子)=表實際存儲的結(jié)點個數(shù)/表的最大能存儲結(jié)點個數(shù)(即表長)
二叉排序樹:每個結(jié)點左子樹的所有關(guān)鍵碼值都小于該結(jié)點關(guān)鍵碼值,右子樹所有結(jié)點關(guān)鍵碼值都大于該結(jié)點關(guān)鍵碼值。對稱周游二叉排序樹,得到一個有序序列,時間復(fù)雜度O(log2n)
B樹和B+樹:M階樹,每個結(jié)點至多有M-1個關(guān)鍵碼,至少有M/2(取上界)-1個關(guān)鍵碼。B樹適合隨機查找,不適合順序查找。B+樹適合順序查找。
18、排序
直接插人排序、希爾排序、直接選擇排序、堆排序、起泡排序、快速排序等排序算法要了解。
直接選擇排序、希爾排序、快速排序和堆排序是不穩(wěn)定排序,其他排序為穩(wěn)定排序
;三、2021年你讀了哪些覺得比較好的計算機書籍?
[美] 馬丁·福勒(Martin Fowler) 著,徐昊,鄭曄,熊節(jié) 譯
領(lǐng)域特定語言DSL,通過Java和C語言分析具體案例,講解DSL的構(gòu)造方式和通用原則,軟件開發(fā)程序員的教程,馬丁·福勒新的力作。
《領(lǐng)域特定語言》是領(lǐng)域特定語言(Domain-Specific Language,DSL)領(lǐng)域的豐碑之作,由軟件開發(fā)大師馬丁·福勒(Martin Fowler)歷時多年寫作而成。
全書共57章,分為6個部分,全面介紹了DSL概念、DSL常見主題、外部DSL主題、內(nèi)部DSL主題、備選計算模型以及代碼生成等內(nèi)容,揭示了與編程語言無關(guān)的通用原則和模式,闡釋了如何通過DSL有效提高開發(fā)人員的生產(chǎn)力以及增進與領(lǐng)域?qū)<业挠行贤?,能為開發(fā)人員選擇和使用DSL提供有效的決策依據(jù)和指導(dǎo)方法。
本書適合想要了解各種DSL及其構(gòu)造方式,理解其通用原則、模式和適用場景,以提高開發(fā)生產(chǎn)力和溝通能力的軟件開發(fā)人員閱讀。
[美] 肯尼思·,A.蘭伯特(Kenneth,A.,Lambert,) 著,肖鑒明 譯
數(shù)據(jù)結(jié)構(gòu)算法入門教程,基于Python語言進行講解,國外高等院校教材升級,書中包含大量習(xí)題和編程項目,隨書贈送配套資源。
本書用 Python 語言來講解數(shù)據(jù)結(jié)構(gòu)及實現(xiàn)方法。全書首先概述 Python 編程的功能—這些功能是實際編程和解決問題時所必需的;其次介紹抽象數(shù)據(jù)類型的規(guī)范、實現(xiàn)和應(yīng)用,多項集類型,以及接口和實現(xiàn)之間的重要差異;隨后介紹線性多項集、棧、隊列和列表;最后介紹樹、圖等內(nèi)容。本書附有大量的復(fù)習(xí)題和編程項目,旨在幫助讀者鞏固所學(xué)知識。
本書不僅適合高等院校計算機專業(yè)師生閱讀,也適合對 Python 感興趣的讀者和程序員閱讀。
喬恩·克萊因伯格(Jon Kleinberg) 著,王海鵬 譯
用實際示例闡明枯燥的算法理論,更注重算法設(shè)計思維的培養(yǎng),適合作為算法入門書。
這是一本被眾多名校采用的算法設(shè)計課程教材,強調(diào)用實際示例闡明枯燥的算法理論,更注重算法設(shè)計思路而非算法復(fù)雜度分析。本書采用新穎的教學(xué)方式,通過分析真實世界的問題來激發(fā)算法思想。兩位作者以一種清晰、直接的方式,指導(dǎo)學(xué)生自己分析和定義問題,并從中找出適用于給定場景的算法設(shè)計原則。本書鼓勵讀者更深入地理解算法設(shè)計過程, 探索 算法在計算機科學(xué)的更廣闊領(lǐng)域中的應(yīng)用。
本書具有以下特色:
王爭著
20個數(shù)據(jù)結(jié)構(gòu)與算法,100個真實項目場景案例,300多幅算法手繪圖解
本書分為11章。第1章介紹復(fù)雜度分析方法。第2章介紹數(shù)組、鏈表、棧和隊列這些基礎(chǔ)的線性表數(shù)據(jù)結(jié)構(gòu)。第3章介紹遞歸編程技巧、8種經(jīng)典排序、二分查找及二分查找的變體問題。第4章介紹哈希表、位圖、哈希算法和布隆過濾器。第5章介紹樹相關(guān)的數(shù)據(jù)結(jié)構(gòu),包括二叉樹、二叉查找樹、平衡二叉查找樹、遞歸樹和B+樹。第6章介紹堆,以及堆的各種應(yīng)用,包括堆排序、優(yōu)先級隊列、求Top K、求中位數(shù)和求百分位數(shù)。第7章介紹跳表、并查集、線段樹和樹狀數(shù)組這些比較高級的數(shù)據(jù)結(jié)構(gòu)。第8章介紹字符串匹配算法,包括BF算法、RK算法、BM算法、KMP算法、Trie樹和AC自動機。第9章介紹圖及相關(guān)算法,包括深度優(yōu)先搜索、廣度優(yōu)先搜索、拓?fù)渑判?、Dijkstra算法、Floyd算法、A*算法、Z小生成樹算法、Z大流算法和Z大二分匹配等。第10章介紹4種算法思想,包括貪心、分治、回溯和動態(tài)規(guī)劃。第11章介紹4個經(jīng)典項目中的數(shù)據(jù)結(jié)構(gòu)和算法的應(yīng)用,包括Redis、搜索引擎、鑒權(quán)限流和短網(wǎng)址服務(wù)。另外,附錄A為書中的思考題的解答。
[美] 阿爾·斯維加特(Al Sweigart) 著
Python編程從入門到實踐姊妹篇,零基礎(chǔ)自學(xué)Python教程書籍,提供配套同步教學(xué)視頻、在線編程環(huán)境!針對Python3.X版本更新
在本書中,你將學(xué)習(xí)利用Python編程在幾分鐘內(nèi)完成手動需要幾小時的工作,無須事先具備編程經(jīng)驗。通過閱讀本書,你會學(xué)習(xí)Python的基本知識, 探索 Python豐富的模塊庫,并完成特定的任務(wù)(例如,從網(wǎng)站抓取數(shù)據(jù),讀取PDF和Word文檔等)。本書還包括有關(guān)輸入驗證的實現(xiàn)方法,以及自動更新CSV文件的技巧。一旦掌握了編程的基礎(chǔ)知識,你就可以毫不費力地創(chuàng)建Python程序,自動化地完成很多繁瑣的工作,包括:
何華平 著
Python編程零基礎(chǔ)入門實踐教程,用Python處理Excel、Word、PPT、PDF、圖像文件,提升職場辦公效率,解決辦公難題,附贈學(xué)習(xí)資源和教學(xué)視頻
這是一本關(guān)于如何利用Python提高日常辦公效率的書,書中凝聚了作者多年的實踐經(jīng)驗和獨特思考,旨在幫助讀者準(zhǔn)確、高效地完成大量高重復(fù)度的工作。
《學(xué)Python,不加班:輕松實現(xiàn)辦公自動化》匯集了日常辦公和處理文檔時常見的問題,通過實例的演示與講解,幫助讀者靈活有效地使用Python處理工作中遇到的問題。全書共11章,涵蓋Python的各種應(yīng)用場景,具體包括文件管理自動化,網(wǎng)絡(luò)信息自動獲取,TXT、XLS/XLSX、DOC/DOCX、PPT、PDF、圖片文件的自動化處理,模擬鼠標(biāo)、鍵盤操控本地軟件,自動化運行管理等。本書力圖淡化編程中的抽象概念,貼合工作場景,注重實戰(zhàn)效果,通過對Python技術(shù)的巧妙講解,幫助讀者成為高效率的辦公室“超人”。
雷明 著
人工智能深度學(xué)習(xí)領(lǐng)域教程,AI程序員的數(shù)學(xué)參考書,透徹理解機器學(xué)習(xí)算法,從數(shù)學(xué)層面搞懂核心算法原理的邏輯,python程序講解
本書的目標(biāo)是幫助讀者全面、系統(tǒng)地學(xué)習(xí)機器學(xué)習(xí)所必須的數(shù)學(xué)知識。全書由8章組成,力求精準(zhǔn)、最小地覆蓋機器學(xué)習(xí)的數(shù)學(xué)知識。包括微積分,線性代數(shù)與矩陣論,最優(yōu)化方法,概率論,信息論,隨機過程,以及圖論。本書從機器學(xué)習(xí)的角度講授這些數(shù)學(xué)知識,對它們在該領(lǐng)域的應(yīng)用舉例說明,使讀者對某些抽象的數(shù)學(xué)知識和理論的實際應(yīng)用有直觀、具體的認(rèn)識。 本書內(nèi)容緊湊,結(jié)構(gòu)清晰,深入淺出,講解詳細(xì)。可用作計算機、人工智能、電子工程、自動化、數(shù)學(xué)等相關(guān)專業(yè)的教材與教學(xué)參考書。對人工智能領(lǐng)域的工程技術(shù)人員與產(chǎn)品研發(fā)人員,本書也有很強的參考價值。對于廣大數(shù)學(xué)與應(yīng)用的數(shù)學(xué)愛好者,本書亦為適合自學(xué)的讀本。
張逸 著
DDD領(lǐng)域驅(qū)動設(shè)計教程,進一步精化領(lǐng)域驅(qū)動設(shè)計方法體系,通過實戰(zhàn)案例演示統(tǒng)一過程的實施,可幫助讀者提高領(lǐng)域建模及軟件設(shè)計能力。
本書全面闡釋了領(lǐng)域驅(qū)動設(shè)計(domain-driven design,DDD)的知識體系,內(nèi)容覆蓋領(lǐng)域驅(qū)動設(shè)計的主要模式與主流方法,并在此基礎(chǔ)上提出“領(lǐng)域驅(qū)動設(shè)計統(tǒng)一過程”(domain-driven design unified process,DDDUP),將整個軟件構(gòu)建過程劃分為全局分析、架構(gòu)映射和領(lǐng)域建模3個階段。除給出諸多案例來闡釋領(lǐng)域驅(qū)動設(shè)計統(tǒng)一過程中的方法與模式之外,本書還通過一個真實而完整的案例全面展現(xiàn)了如何進行領(lǐng)域驅(qū)動設(shè)計統(tǒng)一過程的實施和落地。為了更好地運用領(lǐng)域驅(qū)動設(shè)計統(tǒng)一過程,本書還開創(chuàng)性地引入了業(yè)務(wù)服務(wù)、菱形對稱架構(gòu)、領(lǐng)域驅(qū)動架構(gòu)、服務(wù)驅(qū)動設(shè)計等方法與模式,總結(jié)了領(lǐng)域驅(qū)動設(shè)計能力評估模型與參考過程模型。本書提出的一整套方法體系已在多個項目中推廣和落地。
劉遄 著
Linux入門教程書籍,基于Linux系統(tǒng)RHEL8編寫,每章帶有圖表及習(xí)題,知識點覆蓋紅帽認(rèn)證RHCE考試要求。
1.本書耗時近3年時間,修訂1500余次,內(nèi)容源自國內(nèi)每天訪問量近60000人次的同名Linux培訓(xùn)課程;
2.在上一版的基礎(chǔ)上進行了系統(tǒng)的更新,基于Linux系統(tǒng)RHEL 8編寫,適用于CentOS、Fedora、Ubuntu等主流衍生版本;
3.面向零基礎(chǔ)讀者,從Linux基礎(chǔ)知識講起,漸進式地提高內(nèi)容難度。
《Linux就該這么學(xué)(第2版)》在上一版的基礎(chǔ)上進行了大量的更新,基于紅帽RHEL 8系統(tǒng)編寫,且內(nèi)容適用于CentOS、Fedora等系統(tǒng)。本書共分為20章,內(nèi)容涵蓋了部署Linux系統(tǒng),常用的Linux命令,與文件讀寫操作有關(guān)的技術(shù),使用Vim編輯器編寫和修改配置文件,用戶身份與文件權(quán)限的設(shè)置,硬盤設(shè)備分區(qū)、格式化以及掛載等操作,部署RAID磁盤陣列和LVM,firewalld防火墻與iptables防火墻的區(qū)別和配置,使用ssh服務(wù)管理遠(yuǎn)程主機,使用Apache服務(wù)部署靜態(tài)網(wǎng)站,使用vsftpd服務(wù)傳輸文件,使用Samba或NFS實現(xiàn)文件共享,使用BIND提供域名解析服務(wù),使用DHCP動態(tài)管理主機地址,使用Postfix與Dovecot部署郵件系統(tǒng),使用Ansible服務(wù)實現(xiàn)自動化運維,使用iSCSI服務(wù)部署網(wǎng)絡(luò)存儲,使用MariaDB數(shù)據(jù)庫管理系統(tǒng),使用PXE+Kickstart無人值守安裝服務(wù),使用LNMP架構(gòu)部署動態(tài)網(wǎng)站環(huán)境等。此外,本書的配套站點還深度點評了紅帽RHCSA、RHCE、RHCA認(rèn)證,方便讀者備考。
張鑫旭 著
CSS3.0入門到進階教程,前端博客"鑫空間-鑫生活"博主十年經(jīng)驗沉淀之作,大量實戰(zhàn)案例且具有在線Demo演示,配套官方網(wǎng)站,隨時與作者溝通學(xué)習(xí)。
本書是“CSS世界三部曲”的最后一部。這是一本關(guān)于CSS的進階讀物,專門講CSS3及其之后版本的新特性。在本書中,作者結(jié)合自己多年的從業(yè)經(jīng)驗,講解CSS基礎(chǔ)知識,并充分考慮前端開發(fā)者的需求,以CSS新特性的 歷史 背景為線索,去粗取精,注重細(xì)節(jié),深入淺出地介紹了上百個CSS新特性。此外,作者專門還為本書開發(fā)了配套網(wǎng)站,用于書中實例效果的在線展示和問題答疑。
本書的所有內(nèi)容都是作者經(jīng)過深入思考和 探索 后提煉出來的,知識點多且內(nèi)容豐富,注重技術(shù)細(xì)節(jié)、經(jīng)驗分享和解決問題的思路。本書的主要目標(biāo)是幫助前端開發(fā)者突破CSS技能提升的瓶頸,非常適合具有一定CSS基礎(chǔ)的前端開發(fā)者閱讀。
[美] 威廉·肖特斯(William Shotts) 著,門佳,李偉 譯
手把手教你學(xué)Linux操作系統(tǒng),腳本shell編程代碼書寫,系統(tǒng)管理編程運維,學(xué)習(xí)使用bash(LinuxShell)編寫完整的程序。
本書對Linux命令行進行詳細(xì)的介紹,全書內(nèi)容包括4個部分,第一部分由Shell的介紹開啟命令行基礎(chǔ)知識的學(xué)習(xí)之旅;第二部分講述配置文件的編輯,如何通過命令行控制計算機;第三部分探討常見的任務(wù)與必備工具;第四部分全面介紹Shell編程,讀者可通過動手編寫Shell腳本掌握Linux命令的應(yīng)用,從而實現(xiàn)常見計算任務(wù)的自動化。通過閱讀本書,讀者將對Linux命令有更加深入的理解,并且可以將其應(yīng)用到實際的工作中。
本書適合Linux初學(xué)人員、Linux系統(tǒng)管理人員及Linux愛好者閱讀。
[美] 布萊恩·W.克尼漢(Brian,W.,Kernighan) 著,韓磊 譯
UNIX的誕生記與發(fā)展史,計算機先驅(qū)布萊恩·W.克尼漢繼C程序設(shè)計語言后又一力作,講述貝爾實驗室的幕后故事,C/C++等重要發(fā)明的起源,探尋計算科學(xué)之光!
自1969年在貝爾實驗室的閣樓上誕生以來,Unix操作系統(tǒng)的發(fā)展遠(yuǎn)遠(yuǎn)超出其創(chuàng)造者們的想象。它帶動了許多創(chuàng)新軟件的開發(fā),影響了無數(shù)程序員,改變了整個計算機技術(shù)的發(fā)展軌跡。
本書不但書寫Unix的 歷史 ,而且記錄作者的回憶,一探Unix的起源,試圖解釋什么是Unix,Unix是如何產(chǎn)生的,以及Unix為何如此重要。除此之外,本書以輕松的口吻講述了一群在貝爾實驗室工作的發(fā)明天才的有趣往事,本書中每一個故事都是鮮為人知卻又值得傳播的寶貴資源。
本書適合對計算機或相關(guān) 歷史 感興趣的人閱讀。讀者不需要有太多的專業(yè)技術(shù)背景,就可以欣賞Unix背后的思想,了解它的重要性。
[印] 拉胡爾·沙瑪(Rahul Sharma)[芬]韋薩·凱拉維塔 著,鄧世超 譯
Rust系統(tǒng)編程指南自學(xué)教程書籍,學(xué)習(xí)Rust編程語言基礎(chǔ),掌握更高端的編程范式,成就高段位的編程極客。
本書內(nèi)容共17章,由淺入深地講解Rust相關(guān)的知識,涉及基礎(chǔ)語法、軟件包管理器、測試工具、類型系統(tǒng)、內(nèi)存管理、異常處理、高級類型、并發(fā)模型、宏、外部函數(shù)接口、網(wǎng)絡(luò)編程、HTTP、數(shù)據(jù)庫、WebAssembly、GTK+框架和GDB調(diào)試等重要知識點。
本書適合想學(xué)習(xí)Rust編程的讀者閱讀,希望讀者能夠?qū)、C++或者Python有一些了解。書中豐富的代碼示例和詳細(xì)的講解能夠幫助讀者快速上手,高效率掌握Rust編程。
四、數(shù)據(jù)結(jié)構(gòu)廣義表的問題
第一章 數(shù)據(jù)結(jié)構(gòu)基本概念
1、基本概念:理解什么是數(shù)據(jù)、數(shù)據(jù)對象、數(shù)據(jù)元素、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)的邏輯結(jié)構(gòu)與物理結(jié)構(gòu)、邏輯結(jié)構(gòu)與物理結(jié)構(gòu)間的關(guān)系。
2、面向?qū)ο蟾拍睿豪斫馐裁词菙?shù)據(jù)類型、抽象數(shù)據(jù)類型、數(shù)據(jù)抽象和信息隱蔽原則。了解什么是面向?qū)ο?。由于目前關(guān)于這個問題有許多說法,我們采用了一種最流行的說法,即Coad與Yourdon 給出的定義:面向?qū)ο?= 對象 + 類 + 繼承 + 通信。
要點:
·抽象數(shù)據(jù)類型的封裝性
·面向?qū)ο笙到y(tǒng)結(jié)構(gòu)的穩(wěn)定性
·面向?qū)ο蠓椒ㄖ埸c在于應(yīng)用問題所涉及的對象
3、數(shù)據(jù)結(jié)構(gòu)的抽象層次:理解用對象類表示的各種數(shù)據(jù)結(jié)構(gòu)
4、算法與算法分析:理解算法的定義、算法的特性、算法的時間代價、算法的空間代價。
要點:·算法與程序的不同之處需要從算法的特性來解釋
·算法的正確性是最主要的要求
·算法的可讀性是必須考慮的
·程序的程序步數(shù)的計算與算法的事前估計
·程序的時間代價是指算法的漸進時間復(fù)雜性度量
第二章 數(shù)組
1、作為抽象數(shù)據(jù)類型的數(shù)組:數(shù)組的定義、數(shù)組的按行順序存儲與按列順序存儲
要點:
·數(shù)組元素的存放地址計算
2、順序表:順序表的定義、搜索、插入與刪除
要點:
·順序表搜索算法、平均比較次數(shù)的計算
·插入與刪除算法、平均移動次數(shù)的計算
3、多項式:多項式的定義
4、字符串:字符串的定義及其操作的實現(xiàn)
要點:
·串重載操作的定義與實現(xiàn)
第三章 鏈接表
1、單鏈表:單鏈表定義、相應(yīng)操作的實現(xiàn)、單鏈表的游標(biāo)類。
要點:
·單鏈表的兩種定義方式(復(fù)合方式與嵌套方式)
·單鏈表的搜索算法與插入、刪除算法
·單鏈表的遞歸與迭代算法
2、循環(huán)鏈表:單鏈表與循環(huán)鏈表的異同
3、雙向鏈表:雙向鏈表的搜索、插入與刪除算法、鏈表帶表頭結(jié)點的優(yōu)點
4、多項式的鏈接表示
第四章 棧與隊列
1、棧:棧的特性、棧的基本運算
要點:
·棧的數(shù)組實現(xiàn)、棧的鏈表實現(xiàn)
·棧滿及??諚l件、抽象數(shù)據(jù)類型中的先決條件與后置條件
2、棧的應(yīng)用:用后綴表示計算表達式,中綴表示改后綴表示
3、隊列:隊列的特性、隊列的基本運算
要點:
·隊列的數(shù)組實現(xiàn):循環(huán)隊列中隊頭與隊尾指針的表示,隊滿及隊空條件
·隊列的鏈表實現(xiàn):鏈?zhǔn)疥犃兄械年狀^與隊尾指針的表示、
4、雙向隊列:雙向隊列的插入與刪除算法
5、優(yōu)先級隊列:優(yōu)先級隊列的插入與刪除算法
第五章 遞歸與廣義表
1、遞歸:遞歸的定義、遞歸的數(shù)據(jù)結(jié)構(gòu)、遞歸問題用遞歸過程求解
要點:·鏈表是遞歸的數(shù)據(jù)結(jié)構(gòu),可用遞歸過程求解有關(guān)鏈表的問題
2、遞歸實現(xiàn)時棧的應(yīng)用
要點:·遞歸的分層(樹形)表示:遞歸樹
·遞歸深度(遞歸樹的深度)與遞歸工作棧的關(guān)系
·單向遞歸與尾遞歸的迭代實現(xiàn)
3、廣義表:廣義表定義、廣義表長度、廣義表深度、廣義表表頭、廣義表表尾
要點:
·用圖形表示廣義表的存儲結(jié)構(gòu)
·廣義表的遞歸算法
第六章 樹與森林
1、樹:樹的定義、樹的基本運算
要點:
·樹的分層定義是遞歸的
·樹中結(jié)點個數(shù)與高度的關(guān)系
2、二叉樹:二叉樹定義、二叉樹的基本運算
要點:
·二叉樹性質(zhì)、二叉樹中結(jié)點個數(shù)與高度的關(guān)系、不同種類的二叉樹棵數(shù)
·完全二叉樹的順序存儲、完全二叉樹的雙親、子女和兄弟的位置
·二叉樹的前序·中序·后序·層次遍歷
·前序
·中序
·后序的線索化二叉樹、前驅(qū)與后繼的查找方法
3、霍夫曼樹:霍夫曼樹的構(gòu)造方法、霍夫曼編碼、帶權(quán)路徑長度的計算
4、樹的存儲:樹的廣義表表示、樹的雙親表示、樹與二叉樹的對應(yīng)關(guān)系、樹的先根·中根·后根·層次遍歷。
5、堆:堆的定義、堆的插入與刪除算法
要點:
·形成堆時用到的向下調(diào)整算法及形成堆時比較次數(shù)的上界估計
·堆插入時用到的向上調(diào)整算法
第七章 集合與搜索
1、集合的概念:集合的基本運算、集合的存儲表示
要點:
·用位數(shù)組表示集合時集合基本運算的實現(xiàn)
·用有序鏈表表示集合時集合基本運算的實現(xiàn)
2、并查集:并查集定義、并查集的三種基本運算的實現(xiàn)
3、基本搜索方法
要點:
·對一般表的順序搜索算法(包括有監(jiān)視哨和沒有監(jiān)視哨)
·對有序順序表的順序搜索算法、用判定樹(即擴充二叉搜索樹)描述搜索,以及平均搜索長度(成功與不成功)的計算。
·對有序順序表的折半搜索算法、用判定樹(即擴充二叉搜索樹)描述搜索,以及平均搜索長度(成功與不成功)的計算。
4、二叉搜索樹:
要點:
·動態(tài)搜索樹與靜態(tài)搜索樹的特性
·二叉搜索樹的定義、二叉搜索樹上的搜索算法、二叉搜索樹搜索時的平均搜索長度(成功與不成功)的計算。
·AVL樹結(jié)點上的平衡因子、AVL樹的平衡旋轉(zhuǎn)方法
·高度為h的AVL樹上的最少結(jié)點個數(shù)與最多結(jié)點個數(shù)
· AVL樹的搜索方法、插入與刪除方法
第八章 圖
1、圖:圖的定義與圖的存儲表示
要點:
·鄰接矩陣表示(通常是稀疏矩陣)
·鄰接表與逆鄰接表表示
·鄰接多重表(十字鏈表)表示
2、深度優(yōu)先遍歷與廣度優(yōu)先遍歷
要點:
·生成樹與生成樹林的定義
·深度優(yōu)先搜索是個遞歸的過程,而廣度優(yōu)先搜索是個非遞歸的過程
·為防止重復(fù)訪問已經(jīng)訪問過的頂點,需要設(shè)置一個訪問標(biāo)志數(shù)組visited
3、圖的連通性
要點:
·深度優(yōu)先搜索可以遍歷一個連通分量上的所有頂點
·對非連通圖進行遍歷,可以建立一個生成森林
·對強連通圖進行遍歷,可能建立一個生成森林
·關(guān)節(jié)點的計算和以最少的邊構(gòu)成重連通圖
4、最小生成樹
要點:
·對于連通網(wǎng)絡(luò)、可用不會構(gòu)成環(huán)路的權(quán)值最小的n-1條邊構(gòu)成最小生成樹
·會畫出用Kruskal算法及Prim算法構(gòu)造最小生成樹的過程
5、單源最短路徑
要點:
·采用逐步求解的方式求某一頂點到其他頂點的最短路徑
·要求每條邊的權(quán)值必須大于零
6、活動網(wǎng)絡(luò)
要點:
·拓?fù)渑判颉㈥P(guān)鍵路徑、關(guān)鍵活動、AOE網(wǎng)
·拓?fù)渑判驅(qū)⒁粋€偏序圖轉(zhuǎn)化為一個全序圖。
·為實現(xiàn)拓?fù)渑判颍⒁粋€棧,將所有入度為零的頂點進棧
·關(guān)鍵路徑的計算
第九章 排序
1、基本概念:關(guān)鍵碼、初始關(guān)鍵碼排列、關(guān)鍵碼比較次數(shù)、數(shù)據(jù)移動次數(shù)、穩(wěn)定性、附加存儲、內(nèi)部排序、外部排序
2、插入排序:
要點:
·當(dāng)待排序的關(guān)鍵碼序列已經(jīng)基本有序時,用直接插入排序最快
3、選擇排序:
要點:
·用直接選擇排序在一個待排序區(qū)間中選出最小的數(shù)據(jù)時,與區(qū)間第一個數(shù)據(jù)對調(diào),而不是順次后移。這導(dǎo)致方法不穩(wěn)定。
·當(dāng)在n個數(shù)據(jù)(n很大)中選出最小的5 ~ 8個數(shù)據(jù)時,錦標(biāo)賽排序最快
·錦標(biāo)賽排序的算法中將待排序的數(shù)據(jù)個數(shù)n補足到2的k次冪2k-1<n≤2k
·在堆排序中將待排序的數(shù)據(jù)組織成完全二叉樹的順序存儲。
4、交換排序:
要點:
·快速排序是一個遞歸的排序方法
·當(dāng)待排序關(guān)鍵碼序列已經(jīng)基本有序時,快速排序顯著變慢。
5、二路歸并排序:
要點:
·歸并排序可以遞歸執(zhí)行
·歸并排序需要較多的附加存儲。可以采用一種"推拉法"(參見教科書上習(xí)題)實現(xiàn)歸并排序,算法的時間復(fù)雜度為O (n)、空間復(fù)雜度為O(1)
·歸并排序?qū)Υ判蜿P(guān)鍵碼的初始排列不敏感,排序速度較穩(wěn)定
6、外排序
要點:
·多路平衡歸并排序的過程、I/O緩沖區(qū)個數(shù)的配置
·外排序的時間分析、利用敗者樹進行多路平衡歸并
·利用置換選擇方法生成不等長的初始?xì)w并段
·最佳歸并樹的構(gòu)造及WPL的計算
第十章 索引與散列
1、線性索引:
要點:
·密集索引、稀疏索引、索引表計算
·基于屬性查找建立倒排索引、單元式倒排表
2、動態(tài)搜索樹
要點:
·平衡的m路搜索樹的定義、搜索算法
·B樹的定義、B樹與平衡的m路搜索樹的關(guān)系
·B樹的插入(包括結(jié)點分裂)、刪除(包括結(jié)點調(diào)整與合并)方法
·B樹中結(jié)點個數(shù)與高度的關(guān)系
·B+樹的定義、搜索、插入與刪除的方法
3、散列表
要點:
·散列函數(shù)的比較
·裝填因子 a 與平均搜索長度的關(guān)系,平均搜索長度與表長m及表中已有數(shù)據(jù)對象個數(shù)n的關(guān)系
·解決地址沖突的(閉散列)線性探查法的運用,平均探查次數(shù)的計算
·線性探查法的刪除問題、散列表類的設(shè)計中必須為各地址設(shè)置三個狀態(tài)
·線性探查法中的聚集問題
·解決地址沖突的(閉散列)雙散列法的運用,平均探查次數(shù)的計算
·雙散列法中再散列函數(shù)的設(shè)計要求與表長m互質(zhì),為此m設(shè)計為質(zhì)數(shù)較宜
·解決地址沖突的(閉散列)二次散列法的運用,平均探查次數(shù)的計算
·注意:二次散列法中裝填因子 a 與表長m的設(shè)置
·解決地址沖突的(開散列)鏈地址法的運用,平均探查次數(shù)的計算
我們原來也學(xué)過數(shù)據(jù)結(jié)構(gòu),個人覺得數(shù)組,棧與隊列 ,遞歸與廣義表,樹與
森林(尤其是二叉樹),圖 ,排序這些比較重要,應(yīng)該好好看
以上就是關(guān)于深度哈希算法相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
快手網(wǎng)紅的小視頻(快手網(wǎng)紅的小視頻在哪里找)
青島別墅景觀設(shè)計資質(zhì)證書(青島別墅景觀設(shè)計資質(zhì)證書有哪些)