è·³è¡¨ç®ææå | AIçæåç¿»è¯
è·³è·è¡¨ï¼å ¨é¢ä»ç»
æ¦è¿°
è·³è·è¡¨ï¼Skip Listï¼æ¯ä¸ç§æ¦çæ§æ°æ®ç»æï¼è½å¤å¨å¹³åæ åµä¸å®ç° $O(\log n)$ çæç´¢ãæå ¥åå 餿ä½å¤æåº¦ãå®ç± William Pugh äº 1989 å¹´åæï¼ä½ä¸ºå¹³è¡¡äºåæç´¢æ ï¼å¦ AVL æ æçº¢é»æ ï¼çä¸ç§æ´ç®åæ¿ä»£æ¹æ¡ã
æ ¸å¿æ¦å¿µ
è·³è·è¡¨çåºæ¬ææ³æ¯ç»´æ¤å¤å±é¾è¡¨ï¼
- åºå±æ¯ä¸ä¸ªæ åçæåºé¾è¡¨ï¼å 嫿æå ç´ ã
- é«å±å å½â快车éâï¼è·³è¿åºå±é¾è¡¨çé¨ååºåï¼å®ç°æ´å¿«çéåã
å¯ä»¥æ³è±¡ä¸ä¸ªå°éç³»ç»ï¼é¨ååè½¦å¨æ¯ä¸ªç«ç¹åé ï¼åºå±ï¼ï¼èå¿«è½¦ä» å¨ä¸»è¦æ¢çº½ç«åé ï¼é«å±ï¼ãè¦å¿«éå°è¾¾ç®çå°ï¼ä½ ä¼å ä¹å快车ï¼ç¶åæ¢ä¹æ®éå车å°è¾¾å ·ä½ç«ç¹ã
ç»æ
è·³è·è¡¨ä¸çæ¯ä¸ªèç¹å å«ï¼
- å¼ï¼Valueï¼ï¼èç¹åå¨çæ°æ®ã
- ååæéï¼Forward Pointersï¼ï¼æååå±ä¸ä¸ä¸ªèç¹çæéæ°ç»ã
å±çº§
- èç¹çå±çº§å¨æå ¥æ¶éæºç¡®å®ã
- å±çº§ä¸º $k$ çèç¹å¨ $0, 1, â¦, k$ å±åææåä¸ä¸ä¸ªèç¹çæéã
- æ´ä¸ªå表çæå¤§å±çº§é常ç±å ç´ æ°éå³å®ï¼$L = \log_{1/p} N$ï¼ã
ç®æ³
1. æç´¢ç®æ³
æç´¢ç®æ å¼ $x$ï¼
- 仿é«å±ç头èç¹å¼å§ã
- å¨å½åå±åå³ç§»å¨ï¼åªè¦ä¸ä¸ä¸ªèç¹çå¼å°äº $x$ã
- 妿ä¸ä¸ä¸ªèç¹çå¼å¤§äº $x$ æä¸ºç©ºï¼ååä¸ç§»å¨ä¸å±ã
- é夿¥éª¤ 2 å 3ï¼ç´å°å°è¾¾ç¬¬ 0 å±ã
- æ£æ¥ç¬¬ 0 å±çä¸ä¸ä¸ªèç¹ãå¦æå ¶å¼çäº $x$ï¼åæç´¢æåã
2. æå ¥ç®æ³
æå ¥å¼ $x$ï¼
- æç´¢ $x$ åºæå ¥çä½ç½®ï¼å¹¶è®°å½æ¯å±æå ¥ç¹åçèç¹ï¼æ´æ°æ ï¼ã
- ç¡®å®å±çº§ï¼éæºçææ°èç¹çå±çº§ $L$ãé常éè¿æç¡¬å¸ï¼æ¦ç $p = 0.5$ï¼å®ç°ãæ£é¢åå¢å å±çº§å¹¶ç»§ç»æç¡¬å¸ï¼åé¢å忢ã
- å建èç¹ï¼åé ä¸ä¸ªå±çº§ä¸º $L$ çæ°èç¹ã
- æ´æ°æéï¼å¨ $0$ å° $L$ çæ¯ä¸å±ï¼æ´æ°å驱èç¹çååæéï¼ä½¿å ¶æåæ°èç¹ï¼å¹¶è®¾ç½®æ°èç¹çæéæååç»èç¹ã
3. å é¤ç®æ³
å é¤å¼ $x$ï¼
- æç´¢ å å« $x$ çèç¹ï¼å¹¶è®°å½æ¯å±çå驱èç¹ã
- 妿æ¾å°ï¼åæ´æ°æ¯å±å驱èç¹çååæéï¼ç»è¿è¢«å é¤èç¹ã
- éæ¾è¢«å é¤èç¹çå åã
- å¯éï¼å¦ææé«å±å空ï¼åéä½å表çæå¤§å±çº§ã
å¤æåº¦åæ
- å¹³åæ åµï¼éè¿éæºåå®ç°ã颿å±çº§æ°ä¸º $\log_{1/p} n$ã
- æåæ åµï¼å½éæºå±çº§çæéå为åå±ç»æï¼å¦ææèç¹å¨ç¬¬ 0 å±ï¼æ¶åçï¼æ¤æ¶éå为ç®åé¾è¡¨ãä½è¿ç§æ åµå¨ç»è®¡ä¸æä¸å¯è½åºç°ã
ä¸å¹³è¡¡æ ç对æ¯
åºç¨åºæ¯
- æ°æ®åºï¼LevelDB å Redis 使ç¨è·³è·è¡¨å®ç°å åæåºéåã
- å¹¶åç³»ç»ï¼Java ç
ConcurrentSkipListMapåConcurrentSkipListSetã - è¿ä¼¼è®¡æ°ï¼ç¨äºæäºæ¦çç®æ³ã
ç»è®º
è·³è·è¡¨ä¸ºå¹³è¡¡äºåæç´¢æ æä¾äºä¸ç§å¥å£®ã髿䏿äºå®ç°çæ¿ä»£æ¹æ¡ãè½ç¶ä¾èµæ¦çèéä¸¥æ ¼å¹³è¡¡è§åï¼ä½å ¶æ§è½ç¹ç¹ä½¿å ¶æä¸ºé«å¹¶åç¯å¢å注éå®ç°ç®æ´æ§çç³»ç»ççæ³éæ©ã
åèæç®ï¼
