å¸¸è§æ°æ®ç»ææ»ç»
è¿æ¯ä¸åæè®¸å¯¹ä½ æå¸®å©çä¿¡æ¯
- é¢è¯æåï¼è¿æ¯ä¸ä»½å¤§å½¬ç²¾å¿æ´çç大åé¢è¯æåææ°çï¼ç®åå·²ç»æ´æ°è¿ä»£äº19ä¸ªçæ¬ï¼è´¨éå¾é«ï¼ä¸ä¸ºé¢è¯æé ï¼
- ç¥è¯æçï¼ä¸å±é¢è¯æå/ä¸å¯¹ä¸äº¤æµ/ç®åä¿®æ¹/è¶ æ£çå¦ä¹ æ°å´/å¦ä¹ 路线è§åï¼æ¬¢è¿å å ¥å¤§å½¬çç¥è¯æçï¼ç¹å»é¾æ¥æ¥çæçç详ç»ä»ç»ï¼
åç§æ°æ®ç»æåºç¨åºæ¯
- æ ï¼éåºè¾åºï¼è¯æ³æ£æ¥ï¼ç¬¦å·æå¯¹å¤æï¼æ¹æ³è°ç¨
- äºåæ ï¼è¡¨è¾¾å¼æ
- B+/B-æ ï¼æä»¶ç³»ç»ï¼æ°æ®åºç´¢å¼
- åå¤«æ¼æ ï¼æ°æ®åç¼©ç®æ³
- åå¸è¡¨ï¼æé«æ¥æ¾æ§è½
- çº¢é»æ ï¼å¤§è´å¹³è¡¡çäºåæ¥æ¾æ ï¼ç¸å¯¹AVLæ ï¼æå ¥å é¤ç»ç¹è¾å¿«ï¼æ¥æ¾æ§è½æ²¡ææå
æ°ç»
æ°ç»çä¼ç¹:
- ååé度快
æ°ç»ç缺ç¹:
- äºå å¿ é¡»ç¥éæ°ç»çé¿åº¦
- æå ¥å é¤å ç´ å¾æ ¢
- 空é´éå¸¸æ¯æéå¶ç
- éè¦å¤§åè¿ç»çå åå
- æå ¥å é¤å ç´ çæçå¾ä½
é¾è¡¨
ä¼ç¹ï¼
- ç©ºé´æ²¡æéå¶
- æå ¥å é¤å ç´ å¾å¿«
缺ç¹ï¼ååéåº¦å¾æ ¢
åç±»
- ååé¾è¡¨ ä¸ä¸ªèç¹æåä¸ä¸ä¸ªèç¹ã
- ååé¾è¡¨ ä¸ä¸ªèç¹æä¸¤ä¸ªæéåã
- 循ç¯é¾è¡¨ è½éè¿ä»»ä½ä¸ä¸ªèç¹æ¾å°å ¶ä»ææçèç¹ï¼å°ä¸¤ç§(åå/åå)é¾è¡¨çæåä¸ä¸ªç»ç¹æå第ä¸ä¸ªç»ç¹ä»èå®ç°å¾ªç¯
åå¸è¡¨
æ£å表ï¼Hash tableï¼ä¹å«åå¸è¡¨ï¼ï¼æ¯æ ¹æ®å ³é®ç å¼(Key value)èç´æ¥è¿è¡è®¿é®çæ°æ®ç»æãä¹å°±æ¯è¯´ï¼å®éè¿æå ³é®ç 弿 å°å°è¡¨ä¸ä¸ä¸ªä½ç½®æ¥è®¿é®è®°å½ï¼ä»¥å å¿«æ¥æ¾çé度ãè¿ä¸ªæ å°å½æ°å«åæ£å彿°ï¼åæ¾è®°å½çæ°ç»å«åæ£å表ã
æ
æä»¬æç±»ä¼¼äºå¼¹å¤¹é£ç§å è¿ååºçæ°æ®ç»æç§°ä¸ºæ ï¼æ æ¯éå®ä» å¨è¡¨å°¾è¿è¡æå ¥åå 餿ä½ç线æ§è¡¨ï¼æä»¬æå 许æå ¥åå é¤çä¸ç«¯ç§°ä¸ºæ é¡¶ï¼å¦ä¸ç«¯ç§°ä¸ºæ åºï¼ä¸å«ä»»ä½æ°æ®å ç´ çæ ç§°ä¸ºç©ºæ ï¼æ åç§°åè¿ååºç线æ§è¡¨ï¼ç®ç§°LIFOç»æã
æ çç¹æ®ä¹å¤å¨äºéå¶äºè¿ä¸ªçº¿æ§è¡¨çæå ¥åå é¤ä½ç½®ï¼å®å§ç»åªå¨æ é¡¶è¿è¡ãè¿ä¹å°±ä½¿å¾ï¼æ åºæ¯åºå®çï¼æå è¿æ çåªè½å¨æ åºã
æ çæå ¥æä½ï¼å«åè¿æ ï¼æ çå 餿ä½å«ååºæ ã
éå
é忝åªå 许å¨ä¸ç«¯è¿è¡æå ¥æä½ï¼èå¨å¦ä¸ç«¯è¿è¡å 餿ä½ç线æ§è¡¨ï¼é忝ä¸ç§å è¿å åºç线æ§è¡¨ï¼ç®ç§°FIFOï¼å 许æå ¥çä¸ç«¯ç§°ä¸ºéå°¾ï¼Rearï¼ï¼å 许å é¤çä¸ç«¯ç§°ä¸ºé头(Front)ãåéä¸æå ¥å ç´ ç§°ä¸ºè¿éï¼æ°å ç´ è¿éåæä¸ºæ°çéå°¾å ç´ ï¼åéä¸å é¤å ç´ ç§°ä¸ºåºéï¼å ç´ åºéåï¼å ¶åç»§å ç´ å°±æä¸ºæ°çé头å ç´ ã
æ
æ æ¯ä¸ç§æ°æ®ç»æï¼å®çä¸å»å䏿£µ "å£è¯æ "ï¼å®çæ ¹å¨ä¸ï¼å¶æä¸ã
æ æå¤ä¸ªèç¹(node)ï¼ç¨ä»¥å¨åå ç´ ãæäºèç¹ä¹é´åå¨ä¸å®çå ³ç³»ï¼ç¨è¿çº¿è¡¨ç¤ºï¼è¿çº¿ç§°ä¸ºè¾¹(edge)ãè¾¹çä¸ç«¯èç¹ç§°ä¸ºç¶èç¹ï¼ä¸ç«¯ç§°ä¸ºåèç¹ãæ 忝ä¸ä¸ªä¸æååçæ æ ¹ã
äºåæ
æå¤æä¸¤æ£µåæ çæ è¢«ç§°ä¸ºäºåæ
满äºåæ : äºåæ 䏿æéå¶åç»ç¹çåº¦é½æ¯2ï¼ä¸å¶åç»ç¹é½å¨åä¸å±æ¬¡ä¸
å®å ¨äºåæ : 妿ä¸ä¸ªäºåæ 䏿»¡äºåæ åm个èç¹çç»æç¸åï¼è¿æ ·çäºåæ 被称为å®å ¨äºåæ
äºåæ¥æ¾æ
æä¸æ£µç©ºæ æè å ·æä¸åæ§è´¨çäºåæ ã
- è¥ä»»æèç¹çå·¦åæ ä¸ç©ºï¼åå·¦åæ ä¸ææèç¹çå¼åå°äºå®çæ ¹èç¹çå¼ï¼
- è¥ä»»æèç¹çå³åæ ä¸ç©ºï¼åå³åæ 䏿æèç¹çå¼å大äºå®çæ ¹èç¹çå¼ï¼
- ä»»æèç¹çå·¦ãå³åæ ä¹åå«ä¸ºäºåæ¥æ¾æ ï¼
- 没æé®å¼ç¸ççèç¹ã
AVLæ
平衡äºåæç´¢æ ï¼å®æ¯ä¸ æ£µç©ºæ æå®çå·¦å³ä¸¤ä¸ªåæ çé«åº¦å·®çç»å¯¹å¼ä¸è¶ è¿1ã

ç®åäºè§£ä¸ä¸å·¦æä¸å³æçæ¦å¿µã
å·¦æä¸å³æå°±æ¯ä¸ºäºè§£å³ä¸å¹³è¡¡é®é¢è产ççï¼æä»¬æå»ºä¸é¢AVLæ çè¿ç¨ä¼åºç°ç»ç¹å¹³è¡¡å åï¼å¹³è¡¡å åå°±æ¯äºåæåºæ 䏿¯ä¸ªç»ç¹çå·¦åæ åå³åæ çé«åº¦å·®ãï¼ç»å¯¹å¼å¤§äº1çæ åµï¼è¿æ¶å°±å¯ä»¥éè¿å·¦ææè 峿æä½æ¥è¾¾å°å¹³è¡¡çç®çã
åç§æè½¬æ åµ

çº¢é»æ
çº¢é»æ æ¯å¯¹AVLæ çä¼åï¼åªè¦æ±é¨å平衡ï¼ç¨éä¸¥æ ¼çå¹³è¡¡æ¥æ¢åå¢å èç¹æ¶åæè½¬æ¬¡æ°çéä½ï¼æé«äºæå ¥åå é¤çæ§è½ãæ¥æ¾æ§è½å¹¶æ²¡ææé«ï¼æ¥æ¾çæ¶é´å¤æåº¦æ¯O(logn)ãçº¢é»æ éè¿å·¦æã峿ååè²ç»´æå¹³è¡¡ã

å¯¹äºæå ¥èç¹ï¼AVLåçº¢é»æ 齿¯æå¤ä¸¤æ¬¡æè½¬æ¥å®ç°å¹³è¡¡ã对äºå é¤èç¹ï¼avléè¦ç»´æ¤ä»è¢«å é¤èç¹å°æ ¹èç¹rootè¿æ¡è·¯å¾ä¸ææèç¹çå¹³è¡¡ï¼æè½¬çé级为O(logN)ï¼èçº¢é»æ æå¤åªéæè½¬3次ã
çº¢é»æ çç¹æ§ï¼
- æ¯ä¸ªèç¹æè æ¯é»è²ï¼æè æ¯çº¢è²ã
- æ ¹èç¹åå¶åèç¹æ¯é»è²ï¼å¶åèç¹ä¸ºç©ºã
- 红è²èç¹çåèç¹å¿ é¡»æ¯é»è²çã
- ä»ä¸ä¸ªèç¹å°è¯¥èç¹çååèç¹çææè·¯å¾ä¸å å«ç¸åæ°ç®çé»èç¹ï¼ä¿è¯æ²¡æä¸æ¡è·¯å¾ä¼æ¯å ¶ä»è·¯å¾é¿ä¸åã
ä¼ç¹ï¼ç¸æ¯avlæ ï¼çº¢é»æ æå ¥å é¤çæçæ´é«ãçº¢é»æ ç»´æçº¢é»æ§è´¨æåç红é»åæ¢åæè½¬çå¼éï¼ç¸è¾äºavlæ ç»´æå¹³è¡¡çå¼éè¦å°å¾å¤ã
åºç¨åºæ¯
- Java ConcurrentHashMap & TreeMap
- C++ STL: map & set
- linuxè¿ç¨è°åº¦Completely Fair Scheduler,ç¨çº¢é»æ 管çè¿ç¨æ§å¶å
- epollå¨å æ ¸ä¸çå®ç°ï¼ç¨çº¢é»æ 管çäºä»¶å
- nginxä¸ï¼ç¨çº¢é»æ 管çtimerç
Bæ
ä¹ç§°B-æ ï¼å±äºå¤åæ åå平衡å¤è·¯æ¥æ¾æ ã

è§åï¼
- 1<åèç¹æ°<=mï¼m代表ä¸ä¸ªæ èç¹æå¤æå¤å°ä¸ªæ¥æ¾è·¯å¾
- æ¯ä¸ªèç¹æå¤æm-1ä¸ªå ³é®åï¼éæ ¹èç¹è³å°æm/2ä¸ªå ³é®åï¼æ ¹èç¹æå°å¯ä»¥åªæ1ä¸ªå ³é®å
- æ¯ä¸ªèç¹é½ææéæååèç¹ï¼æé个æ°=å ³é®å个æ°+1ï¼å¶åèç¹æéæånull
B-æ çç¹æ§ï¼
- å ³é®åéååå¸å¨æ´é¢æ ä¸ï¼
- ä»»ä½ä¸ä¸ªå ³é®ååªåºç°å¨ä¸ä¸ªèç¹ä¸ï¼
- æç´¢æå¯è½å¨éå¶åç»ç¹ç»æï¼
B+æ æ¯B-æ çåä½ï¼ä¹æ¯ä¸ç§å¤è·¯æç´¢æ ãB+çæç´¢ä¸B-æ åºæ¬ç¸åï¼åºå«æ¯B+æ åªæè¾¾å°å¶åç»ç¹æå½ä¸ï¼B-æ å¯ä»¥å¨éå¶åç»ç¹å½ä¸ãB+æ æ´éåæä»¶ç´¢å¼ç³»ç»ã

B-åB+æ çåºå«ï¼
- B+æ çéå¶åç»ç¹ä¸å å«dataï¼å¶åç»ç¹ä½¿ç¨é¾è¡¨è¿æ¥ï¼ä¾¿äºåºé´æ¥æ¾åéåãB-æ éè¦éåæ´æ£µæ ï¼èå´æ¥è¯¢æ§è½æ²¡æB+æ 好ã
- B-æ çéæ èç¹åæ¾æ°æ®åç´¢å¼ï¼æç´¢å¯è½å¨éå¶åç»ç¹ç»æï¼è®¿é®æ´å¿«ã
å¾
å¾(Graph)æ¯ç±é¡¶ç¹çæç©·é空éååé¡¶ç¹ä¹é´è¾¹çéåç»æï¼é常表示为: G(V,E)ï¼å ¶ä¸ï¼G表示ä¸ä¸ªå¾ï¼Væ¯å¾Gä¸é¡¶ç¹çéåï¼Eæ¯å¾Gä¸è¾¹çéåã
å线æ§è¡¨ï¼æ çå·®å¼:
- 线æ§è¡¨ä¸æä»¬ææ°æ®å ç´ å«å ç´ ï¼æ ä¸å°æ°æ®å ç´ å«ç»ç¹ï¼å¨å¾ä¸æ°æ®å ç´ ï¼æä»¬åç§°ä¹ä¸ºé¡¶ç¹(Vertex)ã
- 线æ§è¡¨å¯ä»¥æ²¡æå ç´ ï¼ç§°ä¸ºç©ºè¡¨ï¼æ ä¸å¯ä»¥æ²¡æèç¹ï¼ç§°ä¸ºç©ºæ ï¼ä½æ¯ï¼å¨å¾ä¸ä¸å 许没æé¡¶ç¹(æç©·é空æ§)ã
- 线æ§è¡¨ä¸çåå ç´ æ¯çº¿æ§å ³ç³»ï¼æ ä¸çåå ç´ æ¯å±æ¬¡å ³ç³»ï¼èå¾ä¸åé¡¶ç¹çå ³ç³»æ¯ç¨è¾¹æ¥è¡¨ç¤º(è¾¹éå¯ä»¥ä¸ºç©º)ã

ç¸å ³æ¯è¯
- é¡¶ç¹ç度
é¡¶ç¹Viç度(Degree)æ¯æå¨å¾ä¸ä¸Viç¸å ³èçè¾¹çæ¡æ°ãå¯¹äºæå徿¥è¯´ï¼æå ¥åº¦(In-degree)ååºåº¦(Out-degree)ä¹åï¼æåå¾é¡¶ç¹ç度çäºè¯¥é¡¶ç¹çå ¥åº¦ååºåº¦ä¹åã
- 黿¥
è¥æ åå¾ä¸ç两个顶ç¹V1åV2åå¨ä¸æ¡è¾¹(V1,V2)ï¼åç§°é¡¶ç¹V1åV2黿¥(Adjacent)ï¼
è¥æåå¾ä¸åå¨ä¸æ¡è¾¹<V3,V2>ï¼åç§°é¡¶ç¹V3ä¸é¡¶ç¹V2黿¥ï¼ä¸æ¯V3黿¥å°V2æV2黿¥ç´V3ï¼
- è·¯å¾
卿 åå¾ä¸ï¼è¥ä»é¡¶ç¹Viåºåæä¸ç»è¾¹å¯å°è¾¾é¡¶ç¹Vjï¼åç§°é¡¶ç¹Viå°é¡¶ç¹Vjçé¡¶ç¹åºå为ä»é¡¶ç¹Viå°é¡¶ç¹Vjçè·¯å¾(Path)ã
- è¿é
è¥ä»Viå°Vjæè·¯å¾å¯éï¼åç§°é¡¶ç¹Viåé¡¶ç¹Vjæ¯è¿é(Connected)çã
- æ(Weight)
æäºå¾çè¾¹æå¼§å ·æä¸å®ç¸å ³çæ°åï¼è¿ç§ä¸å¾çè¾¹æå¼§ç¸å ³çæ°å«åæ(Weight)ã
ç±»å
æ åå¾
妿å¾ä¸ä»»æä¸¤ä¸ªé¡¶ç¹ä¹é´çè¾¹é½æ¯æ åè¾¹(ç®èè¨ä¹å°±æ¯æ²¡ææ¹åçè¾¹)ï¼å称该å¾ä¸ºæ åå¾(Undirected graphs)ã
æ åå¾ä¸ç边使ç¨å°æ¬å·â()â表示; æ¯å¦ (V1,V2);
æåå¾
妿å¾ä¸ä»»æä¸¤ä¸ªé¡¶ç¹ä¹é´çè¾¹é½æ¯æåè¾¹(ç®èè¨ä¹å°±æ¯ææ¹åçè¾¹)ï¼å称该å¾ä¸ºæåå¾(Directed graphs)ã
æåå¾ä¸ç边使ç¨å°æ¬å·â<>â表示; æ¯å¦/<V1,V2>
å®å ¨å¾
æ åå®å ¨å¾: 卿 åå¾ä¸ï¼å¦æä»»æä¸¤ä¸ªé¡¶ç¹ä¹é´é½åå¨è¾¹ï¼å称该å¾ä¸ºæ åå®å ¨å¾ã(嫿n个顶ç¹çæ åå®å ¨å¾æ(nÃ(n-1))/2æ¡è¾¹)- `æåå®å ¨å¾: 卿åå¾ä¸ï¼å¦æä»»æä¸¤ä¸ªé¡¶ç¹ä¹é´é½å卿¹åäºä¸ºç¸åç两æ¡å¼§ï¼å称该å¾ä¸ºæåå®å ¨å¾ã(嫿n个顶ç¹çæåå®å ¨å¾ænÃ(n-1)æ¡è¾¹
å¾çåå¨ç»æ
1ã黿¥ç©éµ
å¾ç黿¥ç©éµ(Adjacency Matrix)å卿¹å¼æ¯ç¨ä¸¤ä¸ªæ°ç»æ¥è¡¨ç¤ºå¾ãä¸ä¸ªä¸ç»´æ°ç»åå¨å¾ä¸é¡¶ç¹ä¿¡æ¯ï¼ä¸ä¸ªäºç»´æ°ç»(ç§°ä¸ºé»æ¥ç©éµ)åå¨å¾ä¸çè¾¹æå¼§çä¿¡æ¯ã

2ã黿¥è¡¨
黿¥è¡¨ç±è¡¨å¤´èç¹å表èç¹ä¸¤é¨åç»æï¼å¾ä¸æ¯ä¸ªé¡¶ç¹å对åºä¸ä¸ªåå¨å¨æ°ç»ä¸ç表头èç¹ã妿è¿ä¸ªè¡¨å¤´èç¹æå¯¹åºçé¡¶ç¹åå¨é»æ¥èç¹ï¼åæé»æ¥èç¹ä¾æ¬¡åæ¾äºè¡¨å¤´èç¹ææåçååé¾è¡¨ä¸ã

ä¸é¢ç»åºå»ºç«å¾ç黿¥è¡¨ä¸æä½¿ç¨çè¾¹ç»ç¹ç±»çå®ä¹
public class EdgeNode { //å®ä¹é»æ¥è¡¨ä¸çè¾¹ç»ç¹ç±»å
int adjvex; //黿¥ç¹å
int weight; //è¾¹çæå¼åï¼åå®ä¸ºæ´åï¼å¯¹äºæ æå¾ï¼è¾¹çæå¼ä¸º1
EdgeNode next; //æåä¸ä¸ä¸ªè¾¹ç»ç¹ç龿¥å
public EdgeNode(int adj, EdgeNode nt)
{ //å¯¹æ æå¾ä¸çè¾¹ç»ç¹è¿è¡åå§å
adjvex=adj; next=nt; weight=1;
}
public EdgeNode(int adj, int wgt, EdgeNode nt)
{ //对ææå¾ä¸çè¾¹ç»ç¹è¿è¡åå§å
adjvex=adj; next=nt; weight=wgt;
}
}
å¾çæ¥å£ç±»å®ä¹å¦ä¸ï¼
public interface Graph
{
boolean createGraph(EdgeElement[]d); //æ ¹æ®è¾¹éæ°ç»åæ°d建ç«ä¸ä¸ªå¾
int graphType(); //è¿åå¾çç±»å
int vertices(); //è¿åå¾ä¸çé¡¶ç¹æ°
int edges(); //è¿åå¾ä¸çè¾¹æ°
boolean find(int i, int j); //ä»å¾ä¸æ¥æ¾ä¸æ¡è¾¹(i,j)æ¯å¦åå¨
boolean putEdge(EdgeElement theEdge); //åå¾ä¸æå
¥ä¸æ¡è¾¹theEdge
boolean removeEdge(int i, int j); //ä»å¾ä¸å é¤ä¸æ¡è¾¹(i,j)
int degree(int i); //è¿åé¡¶ç¹iç度
int inDegree(int i); //è¿åé¡¶ç¹içå
¥åº¦
int outDegree(int i); //è¿åé¡¶ç¹içåºåº¦
void output(); //以å¾çé¡¶ç¹éåè¾¹éçå½¢å¼è¾åºä¸ä¸ªå¾
void depthFirstSearch(int v); //ä»é¡¶ç¹vå¼å§æ·±åº¦ä¼å
æç´¢éåå¾
void breadthFirstSearch(int v); //ä»é¡¶ç¹vå¼å§å¹¿åº¦ä¼å
æç´¢éåå¾
void clearGraph(); //æ¸
é¤å¾ä¸çææå
容
}
å¾çéå
深度ä¼å éå
private void dfs(int i, boolean[] visited) {
System.out.printl(i + " ");
visited[i] = true;
EdgeNode p = a[i];
while(p != null) {
int j = p.adjvex;
if(!visited[j]) {
dfs(j, visited);
}
p = p.next;
}
}
广度ä¼å æç´¢
private void bfs(int i, boolean[] visited) {
LinkedList<Integer> queue = new LinkedList<>();
System.out.print(i + " ");
visited[i] = true;
queue.offer(i);
while(!queue.isEmpty()) {
int k = queue.poll();
EdgeNode p = a[k];
while(p != null) {
int j = p.adjvex;
if(!visited[j]) {
System.out.print(j + " ");
visited[j] = true;
queue.offer(j);
}
p = p.next;
}
}
}