1<!DOCTYPE html> 2<html lang="en"> 3 4<head> 5 <meta charset="utf-8"> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 <meta name="google-site-verification" content="xBT4GhYoi5qRD5tr338pgPM5OWHHIDR6mNg1a3euekI" /> 8 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> 9 <meta name="description" content="è¿éæ¯ Towdium ç个人å客ï¼å享æçä¸äºå¦ä¹ è®°å½ï¼ä»¥åæ¥å¸¸çç¢ç¢å¿µ"> 10 <meta name="keywords" content="Towdium"> 11 <meta name="theme-color" content="#000000"> 12 13 <!-- Open Graph --> 14 <meta property="og:title" content="åè°æ¼é³å¹é ï¼äºï¼ââ æé¡¹ - Towdium's here | A personal blog"> 15 16 <meta property="og:type" content="article"> 17 <meta property="og:description" content=" 18 åè°æ¼é³å¹é ç³»åç®å½ï¼ 19第ä¸è 峿¶å¹é ä¸è¯å¢ 20第äºè ä¼ ç»çåç¬¦ä¸²ç´¢å¼ 21第ä¸è æ¼é³æ ï¼ä¸ï¼ 22第åè æ¼é³æ ï¼ä¸ï¼ 23第äºè æé¡¹ 24 25 26"> 27 28 <meta property="article:published_time" content="2019-11-27T17:42:00Z"> 29 30 31 <meta property="article:author" content="Towdium"> 32 33 34 <meta property="article:tag" content="JECh"> 35 36 <meta property="article:tag" content="Java"> 37 38 <meta property="article:tag" content="å¼å"> 39 40 41 <meta property="og:image" content="http://towdium.github.io/img/site/avatar.jpg"> 42 <meta property="og:url" content="http://towdium.github.io/2019/11/27/pinyin-search-again-5/"> 43 <meta property="og:site_name" content="Towdium's here | A personal blog"> 44 45 <title>åè°æ¼é³å¹é ï¼äºï¼ââ æé¡¹ - Towdium's here | A personal blog</title> 46 47 <!-- Web App Manifest --> 48 <link rel="manifest" href="/pwa/manifest.json"> 49 50 <!-- Favicon --> 51 <link rel="shortcut icon" href="/img/site/favicon.ico"> 52 53 <!-- Canonical URL --> 54 <link rel="canonical" href="https://towdium.github.io/2019/11/27/pinyin-search-again-5/"> 55 56 <!-- Bootstrap Core CSS --> 57 <link rel="stylesheet" href="/css/bootstrap.min.css"> 58 59 <!-- Custom CSS --> 60 <link rel="stylesheet" href="/css/hux-blog.min.css"> 61 62 <!-- Custom Fonts --> 63 <!-- <link href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css"> --> 64 <!-- Hux change font-awesome CDN to qiniu --> 65 <link href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" type="text/css"> 66 67 68 <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> 69 <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> 70 <!--[if lt IE 9]> 71
71<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
71 72
72<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
72 73 <![endif]--> 74 75 <!-- ga & ba script hoook --> 76
76<script></script>
76 77</head> 78 79 80<!-- hack iOS CSS :active style --> 81<body ontouchstart=""> 82 83 <!-- Navigation --> 84 85<nav class="navbar navbar-default navbar-custom navbar-fixed-top"> 86 87 <div class="container-fluid"> 88 <!-- Brand and toggle get grouped for better mobile display --> 89 <div class="navbar-header page-scroll"> 90 <button type="button" class="navbar-toggle"> 91 <span class="sr-only">Toggle navigation</span> 92 <span class="icon-bar"></span> 93 <span class="icon-bar"></span> 94 <span class="icon-bar"></span> 95 </button> 96 <a class="navbar-brand" href="/">Towdium's here</a> 97 </div> 98 99 <!-- Collect the nav links, forms, and other content for toggling --> 100 <div id="huxblog_navbar"> 101 <div class="navbar-collapse"> 102 <ul class="nav navbar-nav navbar-right"> 103 <li> 104 <a href="/">Home</a> 105 </li> 106 107 108 109 110 <li> 111 <a href="/about/">About</a> 112 </li> 113 114 115 116 <li> 117 <a href="/api/">API</a> 118 </li> 119 120 121 122 <li> 123 <a href="/archive/">Archive</a> 124 </li> 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 </ul> 144 </div> 145 </div> 146 <!-- /.navbar-collapse --> 147 </div> 148 <!-- /.container --> 149</nav>
150<script> 151 // Drop Bootstarp low-performance Navbar 152 // Use customize navbar with high-quality material design animation 153 // in high-perf jank-free CSS3 implementation 154 var $body = document.body; 155 var $toggle = document.querySelector('.navbar-toggle'); 156 var $navbar = document.querySelector('#huxblog_navbar'); 157 var $collapse = document.querySelector('.navbar-collapse'); 158 159 var __HuxNav__ = { 160 close: function(){ 161 $navbar.className = " "; 162 // wait until animation end. 163 setTimeout(function(){ 164 // prevent frequently toggle 165 if($navbar.className.indexOf('in') < 0) { 166 $collapse.style.height = "0px" 167 } 168 },400) 169 }, 170 open: function(){ 171 $collapse.style.height = "auto" 172 $navbar.className += " in"; 173 } 174 } 175 176 // Bind Event 177 $toggle.addEventListener('click', function(e){ 178 if ($navbar.className.indexOf('in') > 0) { 179 __HuxNav__.close() 180 }else{ 181 __HuxNav__.open() 182 } 183 }) 184 185 /** 186 * Since Fastclick is used to delegate 'touchstart' globally 187 * to hack 300ms delay in iOS by performing a fake 'click', 188 * Using 'e.stopPropagation' to stop 'touchstart' event from 189 * $toggle/$collapse will break global delegation. 190 * 191 * Instead, we use a 'e.target' filter to prevent handler 192 * added to document close HuxNav. 193 * 194 * Also, we use 'click' instead of 'touchstart' as compromise 195 */ 196 document.addEventListener('click', function(e){ 197 if(e.target == $toggle) return; 198 if(e.target.className == 'icon-bar') return; 199 __HuxNav__.close(); 200 }) 201</script>
201 202 203 204 <!-- Image to hack wechat --> 205<!-- <img src="/img/site/icon.png" width="0" height="0"> --> 206<!-- <img src="/https://api.towdium.me/unsplash/source/collection/645108/2600x500" width="0" height="0"> --> 207 208<!-- Post Header --> 209 210 211 212<style type="text/css"> 213 header.intro-header{ 214 position: relative; 215 background-image: url('https://api.towdium.me/unsplash/source/collection/645108/2600x500'); 216 background: ; 217 } 218 219 220</style> 221 222<header class="intro-header" > 223 224<div style="background: rgba(0, 0, 0,0.5);"> 225 <div class="header-mask"></div> 226 227 <div class="container"> 228 <div class="row"> 229 <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1"> 230 <div class="post-heading"> 231 <div class="tags"> 232 233 <a class="tag" href="/archive/?tag=JECh" title="JECh">JECh</a> 234 235 <a class="tag" href="/archive/?tag=Java" title="Java">Java</a> 236 237 <a class="tag" href="/archive/?tag=%E5%BC%80%E5%8F%91" title="å¼å">å¼å</a> 238 239 </div> 240 <h1>åè°æ¼é³å¹é ï¼äºï¼ââ æé¡¹</h1> 241 242 <h2 class="subheading"></h2> 243 <span class="meta">Posted by Towdium on November 27, 2019</span> 244 </div> 245 </div> 246 </div> 247 </div> 248</div> 249</header> 250 251 252 253 254 255 256<!-- Post Content --> 257<article> 258 <div class="container"> 259 <div class="row"> 260 261 <!-- Post Container --> 262 <div class=" 263 col-lg-8 col-lg-offset-2 264 col-md-10 col-md-offset-1 265 post-container"> 266 267 <!-- Multi-Lingual --> 268 269 270 <blockquote> 271 <p>åè°æ¼é³å¹é ç³»åç®å½ï¼<br /> 272<a href="https://www.towdium.me/2019/11/05/pinyin-search-again-1/">第ä¸è 峿¶å¹é ä¸è¯å¢</a><br /> 273<a href="https://www.towdium.me/2019/11/10/pinyin-search-again-2/">第äºè ä¼ ç»çå符串索å¼</a><br /> 274<a href="https://www.towdium.me/2019/11/17/pinyin-search-again-3/">第ä¸è æ¼é³æ ï¼ä¸ï¼</a><br /> 275<a href="https://www.towdium.me/2019/11/20/pinyin-search-again-4/">第åè æ¼é³æ ï¼ä¸ï¼</a><br /> 276第äºè æé¡¹</p> 277</blockquote> 278 279<blockquote> 280 <p>ææå 容çå®ç°ç»èåè§ <a href="https://github.com/Towdium/PinIn">PinIn</a></p> 281</blockquote> 282 283<h2 id="åè¨">åè¨</h2> 284 285<p>å¨å°å¦äºä¸¤èä¹åï¼æä»¬ç»äºä»ç»å®äºæ¼é³æ ç¸å ³çå 容ãè¿ä¸èä½ä¸ºæ´ä¸ªç³»åçç»æï¼æä¼æå©ä¸çå å®¹å ¨é¨å¡«å®ï¼è¿å ¶ä¸å æ¬äºæ¼é³æ 以å¤çæç´¢ç»æï¼åç±»ç»æçæ§è½æµè¯ï¼è¢«åºå¼çè®¾è®¡è¿ææ½å¨çå¼åæ¹åã</p> 286 287<h2 id="å ¶ä»æç´¢ç»æ">å ¶ä»æç´¢ç»æ</h2> 288 289<p>对æèè¨ï¼æ¼é³æ çæ§è½æ¯«æ çé®å·²ç»è®©æè¶³å¤æ»¡æäºã使¯ä»å¨åé¡¹æ°æ®ä¸ä»ç¶ç®ä¸ä¸æè´ï¼å¯¹äºç´¢å¼æå»ºï¼ä»è¦è±è´¹æ°åäºåå¸è¡¨çæ¶é´ï¼å¯¹äºæç´¢ï¼ä½¿ç¨è¾ççæç´¢ä¸²æ¶ï¼ç¸æ¯èµ·å纯å°ç»ææ·»å å ¥åå¸è¡¨ï¼å®çèæ¶è¦å¤åºæ°åï¼è使ç¨è¾é¿çæç´¢ä¸²æ¶ï¼å°½ç®¡ç»æé常æ´å°ï¼ä½æ¯èæ¶çº¦åçæç´¢ä¸²ç¸å½ï¼å¯¹äºå åæ¶èï¼å®è¦è±è´¹æ°åäºå符串æ¬èº«ç容éãå°½ç®¡å¯¹äºæ¼é³æç´¢èè¨ï¼è¿æ ·çç»æå·²ç»æ¯é常å¯è§äºï¼ä½æ¯å¨æç«¯æ åµä¸ï¼ä½¿ç¨ä»ç¶ä¼åå°éå¶ãå æ¤ï¼è¿éè¿ææ´å¤çæç´¢ç»æå¯ä¾ä½¿ç¨ãæè¿éå¹¶ä¸å°è¿äºç»æç§°ä¸ºç´¢å¼ï¼å 为ä»ä»¬çå¼åè¿äºä¾§éå·¥ç¨ä¸çä¼åï¼æä»¥é常ç®åç²æ´ã使¯ä½ ä¹ç¥éï¼å¨æç«¯åºæ¯ä¸ï¼ç论模åå¾å¾åå°åç§æ¡ä»¶çå¶çº¦ï¼å·¥ç¨ä¸çä¼å忾徿 ¼å¤éè¦ã</p> 290 291<h4 id="simplesearcher">SimpleSearcher</h4> 292 293<p>æ£å¦å®çååï¼è¿ä¸ªæç´¢ç»æç®ç´å°±æ¯ç®åå°ä»¤äººåæï¼æä»¬å°ææå符串åå¨èµ·æ¥ï¼å¨éè¦ä½¿ç¨æ¶éåæç´¢å¹¶è¿åç»æãä¸è¿ï¼æ¢ç¶ææå®å®ç°åºæ¥ï¼èªç¶æä»åå¨çæä¹ãé¦å ï¼æä»¬ä¸éè¦å»ºç«åç§å¤æçæ ç»æï¼æä»¥å®å¨æé ä¸è¦æ¯æ¼é³æ å¿«åºå åãå ¶æ¬¡ï¼ä»ä¸éè¦å ç¨å 容ç¨äºç¼åï¼æä»¥ä»å ç¨çå å乿¯å°å°æè´ãæ¢å¥è¯è¯´ï¼ä»å 乿¯ä½ æè½ç¨å°çæå»ºæå¿«ï¼å ç¨å åæå°çæç´¢ç»æã</p> 294 295<p>é¤å»è¿äºæ¾èæè§çç¹å¾ï¼ä»è¿å©ç¨äºåææè¿°çâå¤é¨å éâåâåççç¥âãè¿ä½¿å¾å®å¨æç´¢æ¶ä½¿ç¨çæ¶é´å¤§çº¦åªæéåæ
295ç´¢çä¸åä¹ä¸ï¼èç¨äºå符串åå¨çå å使ç¨ä» 为éç¨å®¹å¨çä¸åãèä¸ï¼å¦åææè¿°ï¼ææçæç´¢ç»æå¨æ§è¡æç´¢æ¶è¿åçç»æé½ä¼ææå ¥æ¶çé¡ºåºæåãè¿ä¸ç¹æ§å¯¹äºä¸äºæ¶åå°ä¼å 级åæåºçåºæ¯å¯è½å¾æå¸®å©ã</p> 296 297<h4 id="cachedsearcher">CachedSearcher</h4> 298 299<p>åæä¸æä»¬æå°åæç´¢å¼ä¼ééç»åå°å¢ï¼æä»¥å»ºç«å®æ´çåæç´¢å¼å¹¶ä¸ç°å®ãé¤å»å¤§éç»å带æ¥çå åå¼éï¼å»ºç«ç´¢å¼æ¶éåææçæç´¢ä¸²åæ ·æä¸ºèæ¶ãå设æä»¬ä½¿ç¨éåæç´¢ä¸²æ¥å»ºç«ç¼åï¼å¹¶ä¸åªå¯¹ 26 个å°ååæ¯å»ºç« 3 ä½çç¼åï¼æä»¬å°±éè¦æ§è¡å°è¿ä¸¤ä¸æ¬¡æç´¢ãå³ä½¿æ¯æ¬¡æç´¢èæ¶ 1msï¼å®å ¨å»ºç«ç¼åæéçæ¶é´å°è¿ 20 ç§ãä½ä¸ºåèï¼å¯¹äºè¿ä¸ªå®¹éçæ°æ®ï¼å»ºç«æ¼é³æ æéçæ¶é´å¤§çº¦æ¯ 100msã</p> 300 301<p>使¯æä»¬æ¢ä¸ªæè·¯ï¼ä¸åäºä¸»å¨å°éåæç´¢ä¸²ï¼æä»¬åªå¯¹æç´¢ç»æè¿è¡è¢«å¨ç¼åï¼å¨ç¬¬ä¸æ¬¡æç´¢æ¶æ§è¡éåæç´¢ï¼æ¥ä¸æ¥å使ç¨ç¼åçç»æãåç¸å½å¤çç¼åç»æç¸åï¼æä»¬ä¸å¯è½å¯¹ç»ææ ç©·æ å°½å°è¿è¡ç¼åï¼å¦åæä»¬ä»ç¶ä¼é¢å¯¹å åçç¸çå°å¢ãåè代乿¯ï¼æä»¬å¯¹ç¼åéå®ä¸ä¸ªå®¹éï¼è¶ è¿å®¹éåå°ææ©ä½¿ç¨çæ¡ç®ç§»é¤ï¼LRUï¼ã</p> 302 303<p>妿æä»¬æ³è¦ç´¢å¼å¯¹ç»æææ´å çµæ´»çååºï¼page flooding 带æ¥çå½±åå°±é¾ä»¥é¿å ã举个ä¾åï¼å妿们çç¼å容éåªæå个æ¡ç®ï¼æä»¬åªéè¦è¿ç»æç´¢ä¸å¤§å åé¿åç½è§çè¯æ¡ï¼å°±å¯ä»¥ç¨åå¾å 容塿»¡ç¼åï¼å¦ææä»¬ç¨ä¸äºç¨³å¥ççç¥ï¼ä¾å¦LFUï¼ï¼ç»æå°±æ¯ç¼å䏿¦å¡«æ»¡ï¼æ°çå 容就å¾é¾è¿å ¥ï¼è¿å¯¹äºå®¹éå¾å°çç¼åèè¨åæ ·ä¸åéãæ ¹æ¬èè¨ï¼æä»¬éè¦åçæ¯ä»æºå¤´ä¸å µæªåå¾å 容è¿å ¥ï¼è¿éççç¥å°±æ¯éå¶ç¼åæç´¢ä¸²çé¿åº¦ã</p> 304 305<p>ä½ å¯è½æç¹çæï¼å¦ææä»¬åªç¼åç串çç»æï¼é£ä¹å¯¹äºé¿ä¸²æ¯ä¸æ¯å°±æ¯«æ 帮å©å¢ï¼å½ç¶ä¸æ¯ï¼å¦åè¿ä¸ªç¼åç»æçåå¨å°±æ¯«æ æä¹ãå¯¹äºææ¬å¹é æä»¬æè¿ä¸ç»è®ºï¼å¦æ a æ¯ b çå串ï¼b æ¯ c çå串ï¼å a æ¯ c çå串ãå¯¹äºæ¼é³æç´¢ï¼æå¯¹ç®æ³è¿è¡äºè½»åº¦çéæ¹ï¼ä½¿å¾å®æ»¡è¶³è¿ä¸æ¡ä»¶ï¼å¦æ a æ¯ b çåç¼ï¼æ¼é³ b å¹é ææ¬ cï¼åæ¼é³ a å¹é ææ¬ cãè¿æ¯æå¨ä¹åçæç« éåå¤è®¨è®ºè¿çæè·¯ï¼ç±äºè¿ä¸ªå ³ç³»ï¼åªè¦ a æ¯ b çåç¼ï¼å b çæç´¢ç»æçéåå¿ ç¶æ¯ a çç»æçåéãè¿éæä»¬æä¸ç§°ä¹ä¸ºâæ¸è¿ç¹æ§âãåºäºè¿ä¸ç¹æ§ï¼å½æä»¬æç´¢ä¸ä¸ªé¿ä¸²æ¶ï¼åªéè¦å¯»æ¾å®åç¼æå¯¹åºç»æçéåï¼å对è¿ä¸ªéåå çæ¡ç®ï¼è䏿¯æ»éï¼è¿è¡éåæç´¢å³å¯ã</p> 306 307<p>è¿ä¸æè·¯å¬èµ·æ¥ä¸æ¯ç¹å«è¯±äººï¼ä½æ¯å¯¹äºä¸ä¸ªå符é¿åº¦çæç´¢ä¸²ï¼å¹é çç»æå¾æå¯è½åªæ¯æ»éçç¾åä¹ä¸ãä¹å°±æ¯è¯´å¯¹äºæææ´é¿çæç´¢ä¸²ï¼æ¯èµ·å¯¹æ»éæ§è¡éåæç´¢ï¼è¿ä¸ªç¼åæå¯è½å°æ§è½æåä¸ç¾åãè¿å®é ä¸åé´äº q-gram çææ³ï¼ä»»æçå符å¯è½æ¯é常常è§çï¼ä½æ¯ç¨é¿ä¸äºçåºåå°±ä¼åå¾ç½è§å¾å¤ãä¸ºäºæ´é«æå°ä½¿ç¨ç¼åï¼æä»¬å¯¹ç¼å串çé¿åº¦éå¶æ¯éå¸¸ä¸¥æ ¼çã尽管ç¼å容鿝éè¿ä¸äºæ°å¦å ³ç³»è¡¨è¾¾çï¼ä½æ¯å¯¹äºææçåç¼å¹é åç»å¤§é¨åçå å«å¹é ï¼ç¼åæ»å®¹éåºè¯¥å¨ 200 æ¡ç®ä»¥ä¸ï¼æ¯ä¸ªæ¡ç®è¢«éå¶å¨ 3 个å符以å ãåªæå¯¹ç¸å½é¿çææ¬è¿è¡å å«æç´¢æ¶ï¼ç¼å容éæä¼æææ¾å¢é¿ï¼å¹¶ä¸å 许 4 个å符é¿çç¼åæ¡ç®ãæ´ä½èè¨ï¼ç¼åç空é´å¤æåº¦äºæ¼é³æ ä¸è´ï¼å¹¶ä¸å®é å åæ¶è被æ§å¶å¨ç¥å°äºæ¼é³æ æ»å®¹éçç¨åº¦ãåæ¶ï¼ç¼å容éä¹å¯ä»¥è¢«æå¨ä¿®æ¹ä»¥éç¨äºä¸åçåºæ¯ã</p> 308 309<p>ç±äºè¿ä¸ªç¼åççææ¯å®å ¨è¢«å¨çï¼ä¸ä¸ªæ¾èæè§çä¼å¿å°±æ¯å®æé æå¿«ã餿¤ä¹å¤ï¼å½ç¼åå 容é¢ç宿ï¼å®çæç´¢é度ä¹å¹¶ä¸ä¼è½åæ¼é³æ 太å¤ã使¯å¨é¢çä¸å®å ¨æè ç¼åä¸è¶³æ¶ï¼ç±äºå®å¨æ§è¡æç´¢ä¹åè¿è¦ç
309æå¯¹åºçç¼åå å®¹ï¼æç´¢é度å®é ä¸è¦æ¯ <code class="language-plaintext highlighter-rouge">SimpleSeacher</code> æ´æ ¢ï¼åæªå éçéåæç´¢ç¸è¿ã仿ç个人è§åº¦èè¨ï¼å¦æå¯¹ç´¢å¼å»ºç«çèæ¶æ²¡ææç«¯è¦æ±ï¼ç±äºç¼åä¸ç¡®å®é æçæ§è½ä¸ç¨³å®ï¼æå»ºè®®ç´æ¥ä½¿ç¨æ¼é³æ <code class="language-plaintext highlighter-rouge">TreeSearcher</code> ä½ä¸ºéç¨çè§£å³æ¹æ¡ãå¼å¾ä¸æçæ¯ï¼ç¼åçå®ç°å¯ä»¥è¢«è½»æ¾ä¿®æ¹ä»¥è§£é¤æ¡ç®çé¿åº¦éå¶ï¼è¿å¯¹äºæå°æ°æ¡ç®æé«é¢çæ¥è¯¢å¯è½æå¥æï¼ä½æ¯èèå°è¯¥åºæ¯æ´å æç«¯ï¼æä»¬è¿éå°±ä¸è®¨è®ºäºã</p> 310 311<h2 id="æ§è½æµè¯">æ§è½æµè¯</h2> 312 313<p>æµè¯ä½¿ç¨ä¸¤ç»æ°æ®ã第ä¸ç»æåèª Enigmatica 模ç»å ï¼å¯ä»¥è¿ä¼¼æ¨¡ææç«¯æ¡ä»¶ä¸ç Minecraft ç¯å¢ï¼ææ¬æä»¶ 902KBï¼å ± 37k è¯æ¡ï¼424k å符ã第äºç»æåèªè ¾è®¯ AILab çæ±è¯çè¯ <a href="https://ai.tencent.com/ailab/nlp/embedding.html">è¯æåº</a>ï¼ææ¬æä»¶ 14.4MBï¼å ± 1M è¯æ¡ï¼4.81M åç¬¦ãæµè¯å¨ i7-7700HQ ä¸è¿è¡ï¼ä» 使ç¨åæ ¸è¿ç®ãå¯¹äºæ¯ç»ææ¬ï¼æä»¬å嫿µéäºç¨äºåç¼å¹é ä¸ç¨äºå å«å¹é çä¸¤ç»æ¶é´æ°æ®ã对äºå ¨æå¹é ï¼æ§è½å ä¹çåäºåç¼å¹é ï¼æè¿éå°±ä¸åç¬ååºäºã</p> 314 315<p><strong>å°æ°æ®é + å å«å¹é </strong></p> 316 317<table> 318 <thead> 319 <tr> 320 <th style="text-align: center">å¹é é»è¾</th> 321 <th style="text-align: center">æå»ºèæ¶</th> 322 <th style="text-align: center">é¢çèæ¶</th> 323 <th style="text-align: center">æç´¢èæ¶</th> 324 <th>å å使ç¨</th> 325 </tr> 326 </thead> 327 <tbody> 328 <tr> 329 <td style="text-align: center">TreeSearcher</td> 330 <td style="text-align: center">210ms</td> 331 <td style="text-align: center">N/A</td> 332 <td style="text-align: center">0.19ms</td> 333 <td>9.50MB</td> 334 </tr> 335 <tr> 336 <td style="text-align: center">SimpleSearcher</td> 337 <td style="text-align: center">27ms</td> 338 <td style="text-align: center">N/A</td> 339 <td style="text-align: center">9.1ms</td> 340 <td>1.84MB</td> 341 </tr> 342 <tr> 343 <td style="text-align: center">CachedSearcher</td> 344 <td style="text-align: center">28ms</td> 345 <td style="text-align: center">16ms</td> 346 <td style="text-align: center">0.55ms</td> 347 <td>è§å¤æ³¨</td> 348 </tr> 349 <tr> 350 <td style="text-align: center">éåæ¼é³å¹é </td> 351 <td style="text-align: center">N/A</td> 352 <td style="text-align: center">N/A</td> 353 <td style="text-align: center">23ms</td> 354 <td>N/A</td> 355 </tr> 356 <tr> 357 <td style="text-align: center">éå contains</td> 358 <td style="text-align: center">N/A</td> 359 <td style="text-align: center">N/A</td> 360 <td style="text-align: center">0.53ms</td> 361 <td>N/A</td> 362 </tr> 363 </tbody> 364</table> 365 366<p><strong>å°æ°æ®é + åç¼å¹é </strong></p> 367 368<table> 369 <thead> 370 <tr> 371 <th style="text-align: center">å¹é é»è¾</th> 372 <th style="text-align: center">æå»ºèæ¶</th> 373 <th style="text-align: center">é¢çèæ¶</th> 374 <th style="text-align: center">æç´¢èæ¶</th> 375 <th style="text-align: center">å å使ç¨</th> 376 </tr> 377 </thead> 378 <tbody> 379 <tr> 380 <td style="text-align: center">TreeSearcher</td> 381 <td style="text-align: center">62.5ms</td> 382 <td style="text-align: center">N/A</td> 383 <td style="text-align: center">0.083ms</td> 384 <td style="text-align: center">2.80MB</td> 385 </tr> 386 <tr> 387 <td style="text-align: center">SimpleSearcher</td> 388 <td style="text-align: center">30ms</td> 389 <td style="text-align: center">N/A</td> 390 <td style="text-align: center">2.4ms</td> 391 <td style="text-align: center">1.84MB</td> 392 </tr> 393 <tr> 394 <td style="text-align: center">CachedSearcher</td> 395 <td style="text-align: center">28ms</td> 396 <td style="text-align: center">2.8ms</td> 397 <td style="text-align: center">0.10ms</td> 398 <td style="text-align: center">è§å¤æ³¨</td> 399 </tr> 400 <tr> 401 <td style="text-align: center">éåæ¼é³å¹é </td> 402 <td style="text-align: center">N/A</td> 403 <td style="text-align: center">N/A</td> 404 <td style="text-align: center">8.8ms</td> 405 <td style="text-align: center">N/A</td> 406 </tr> 407 <tr> 408 <td style="text-align: center">éå startsWith</td> 409 <td style="text-align: center">N/A</td> 410 <td style="text-align: center">N/A</td> 411 <td style="text-align: center">0.53ms</td> 412 <td style="text-align: center">N/A</td> 413 </tr> 414 </tbody> 415</table> 416 417<p><strong>å¤§æ°æ®é + å å«å¹é </strong></p> 418 419<table> 420 <thead> 421 <tr> 422 <th style="text-align: center">å¹é é»è¾</th> 423 <th style="text-align: center">æå»ºèæ¶</th> 424 <th style="text-align: center">é¢çèæ¶</th> 425 <th style="text-align: center">æç´¢èæ¶</th> 426 <th style="text-align: center">å å使ç¨</th> 427 </tr> 428 </thead> 429 <tbody> 430 <tr> 431 <td style="text-align: center">TreeSearcher</td> 432 <td style="text-align: center">5000ms</td> 433 <td style="text-align: center">N/A</td> 434 <td style="text-align: center">0.66ms</td> 435 <td style="text-align: center">159MB</td> 436 </tr> 437 <tr> 438 <td style="text-align: center">SimpleSearcher</td> 439 <td style="text-align: center">120ms</td> 440 <td style="text-align: center">N/A</td> 441 <td style="text-align: center">200ms</td> 442 <td style="text-align: center">22.8MB</td> 443 </tr> 444 <tr> 445 <td style="text-align: center">CachedSearcher</td> 446 <td style="text-align: center">150ms</td> 447 <td style="text-align: center">260ms</td> 448 <td style="text-align: center">6.5ms</td> 449 <td style="text-align: center">è§å¤æ³¨</td> 450 </tr> 451 <tr> 452 <td style="text-align: center">éåæ¼é³å¹é </td> 453 <td style="text-align: center">N/A</td> 454 <td style="text-align: center">N/A</td> 455 <td style="text-align: center">430ms</td> 456 <td style="text-align: center">N/A</td> 457 </tr> 458 <tr> 459 <td style="text-align: center">éå contains</td> 460 <td style="text-align: center">N/A</td> 461 <td style="text-align: center">N/A</td> 462 <td style="text-align: center">12ms</td> 463 <td style="text-align: center">N/A</td> 464 </tr> 465 </tbody> 466</table> 467 468<p><strong>å¤§æ°æ®é + åç¼å¹é </strong></p> 469 470<table> 471 <thead> 472 <tr> 473 <th style="text-align: center">å¹é é»è¾</th> 474 <th style="text-align: center">æå»ºèæ¶</th> 475 <th style="text-align: center">é¢çèæ¶</th> 476 <th style="text-align: center">æç´¢èæ¶</th> 477 <th style="text-align: center">å å使ç¨</th> 478 </tr> 479 </thead> 480 <tbody> 481 <tr> 482 <td style="text-align: center">TreeSearcher</td> 483 <td style="text-align: center">1300ms</td> 484 <td style="text-align: center">N/A</td> 485 <td style="text-align: center">0.42ms</td> 486 <td style="text-align: center">70.4MB</td> 487 </tr> 488 <tr> 489 <td style="text-align: center">SimpleSearcher</td> 490 <td style="text-align: center">120ms</td> 491 <td style="text-align: center">N/A</td> 492 <td style="text-align: center">48ms</td> 493 <td style="text-align: center">22.8MB</td> 494 </tr> 495 <tr> 496 <td style="text-align: center">CachedSearcher</td> 497 <td style="text-align: center">150ms</td> 498 <td style="text-align: center">64ms</td> 499 <td style="text-align: center">1.8ms</td> 500 <td style="text-align: center">è§å¤æ³¨</td> 501 </tr> 502 <tr> 503 <td style="text-align: center">éåæ¼é³å¹é </td> 504 <td style="text-align: center">N/A</td> 505 <td style="text-align: center">N/A</td> 506 <td style="text-align: center">120ms</td> 507 <td style="text-align: center">N/A</td> 508 </tr> 509 <tr> 510 <td style="text-align: center">éå startsWith</td> 511 <td style="text-align: center">N/A</td> 512 <td style="text-align: center">N/A</td> 513 <td style="text-align: center">10ms</td> 514 <td style="text-align: center">N/A</td> 515 </tr> 516 </tbody> 517</table> 518 519<blockquote> 520 <p>夿³¨ï¼<code class="language-plaintext highlighter-rouge">CachedSearcher</code> çå åå ç¨å¨ä¸åçåºæ¯ä¸ä¼æææ¾æ³¢å¨ï¼å¨ç»å¤§é¨åæ åµä¸å°äº <code class="language-plaintext highlighter-rouge">TreeSearcher</code> çç¨éã</p> 521</blockquote> 522 523<p>
523éè¦æ³¨æçæ¯ï¼æææç´¢ç»æçå å使ç¨å¼åå å«ææææ¬ï¼ä¸è¬æ åµä¸ä½¿ç¨è æ éé¢å¤æ¶èå åè¿è¡åå¨ã对äºå°æ°æ®éï¼ä½¿ç¨ <code class="language-plaintext highlighter-rouge">ArrayList<String></code> å卿æ¬çº¦å ç¨ 2.6MB å åï¼èå¤§æ°æ®é约å ç¨ 56MB å åã</p> 524 525<p>尽管æä»¬å¨è®¨è®ºæ¼é³ç´¢å¼çæ§è½æ¶ï¼å¸¸å¸¸æ¿å®ä¸è¾å ¥æ³ç¸æ¯ï¼ä½æ¯ä»æ¬è´¨ä¸èè¨ï¼å ¶ä¸æ¶åå°çæ¦å¿µæ¯å®å ¨ä¸åçï¼</p> 526 527<ul> 528 <li>ç¸å½å¤çè¾å ¥æ³ä½¿ç¨æ°æ®åºè¿è¡æç´¢ï¼æè 使ç¨å ¶ä»æ¹æ³å°ç¼åå 容åå¨å¨ç¡¬çä¸ï¼ä»èåå°å åæ¶èãå æ¤ï¼æäºè¾å ¥æ³æå¯è½å ç¨ä¸ç¾ MB ç硬ç空é´ã</li> 529 <li>è¾å ¥æ³æ§è¡çæ¯å ¨æå¹é ï¼ä¹å°±æ¯è¯´è¾å ¥âzhongâæ¶ï¼ä¸å¯è½èæ³å°âä¸å½âãè¿ç§å¹é æ¨¡å¼æ´å èå»ï¼å æ¤å¯ä»¥ææ´å¤æ¹æ³æ¥ä¼åæ§è¡é度ã</li> 530 <li>对äºç¸å½å¤æ°è¾å ¥æ³ï¼çè¯çåé³å¨è¯åºä¸æ¯ç¡®å®çï¼ä¹å°±æ¯è¯´è¾å ¥âhuopingâå¹¶ä¸ä¼èæ³å°âåå¹³âãè¿å¨å¾å¤§ç¨åº¦ä¸è§£å³äºå¤é³åçæ··åé®é¢ï¼èå¨è¿è¡æ¶æä»¬å 乿 æ³å®å ¨æ£ç¡®å°ç¡®å®å¤é³åçåé³ã</li> 531 <li>å 乿æè¾å ¥æ³é½ä¾èµäºæç´¢ä¸²çååï¼è¿å¯¹äºç®ååè¯æç´¢å 容æä¸ºæå©ãå¯¹äºæ¯æä¸è±æ··è¾çè¾å ¥æ³ï¼å¾æå¯è½å¨ååæ¶é¢å åèäºè±æè¯åºï¼ä¾å¦å¹é å ¬å ±å串ï¼ãè卿们çåºæ¯ä¸ï¼æä»¬æ æ³å°è¯æ¡ä¸çè±æé¨ååç¬åååºæ¥ï¼å èåè¯ä¼åå¾æä¸ºç¹çã</li> 532 <li>è¾å ¥æ³å¯ä»¥å¯¹è¯åºè¿è¡ç¸å½å¤æçé¢å¤çï¼å¹¶å°ç»ææä¹ åï¼èæä»¬çåºæ¯è¦æ±æææä½å¨è¿è¡æ¶å¨å åä¸å®æãä¸ä¸ªæ¾èæè§çä¾åå°±æ¯ Rime å¯ä»¥ä½¿ç¨ç¸å½å¤§çéæè¯åºï¼ä½æ¯å½ç¨æ·ï¼å¨æï¼è¯åºå®¹éç¨å¤§æ¶å°±æå¯è½å¸¦æ¥æ§è½é®é¢ã</li> 533</ul> 534 535<p>ç±äºä»¥ä¸çåç±»åå ï¼æä»¬æé¢å¯¹çæ§è½ååå®é ä¸è¿é«äºè¾å ¥æ³ã对äºè¾å ¥æ³èè¨ï¼æ¼é³å¹é çé»è¾åªè½ç®å¾ä¸æ¯åºç³ï¼èæ ¸å¿åæ¯åç§è¯è¨æ¨¡åãèè¿ä¸ªé¡¹ç®åæ¯å®å ¨ä¾§éäºæç«¯åºæ¯ä¸çæ§è½ãéè¿æµè¯æ°æ®ä½ ä¹è½çåºæ¥ï¼å¨å项æ§è½ææ ä¸å¯ä»¥å缩ç空é´å·²ç»æ¯é常å°äºã</p> 536 537<h2 id="åæä¸è®¡å">åæä¸è®¡å</h2> 538 539<p>å¦æä½ å¾çæ JECh è¿ä¸ªé¡¹ç®çè¯ï¼ä½ å¯è½ç¥éæªè³ç®åç´¢å¼ç»æå·²ç»è¿ä»£å°ç¬¬ä¸ä¸ªå¤§çæ¬äºã第ä¸ä¸ªçæ¬ç»§æ¿èª JEIï¼ä½¿ç¨ç¼åå 宿¶æç´¢ãè¿ä¸ªçæ¬åç®åç CachedSearcher 徿¥è¿ï¼ä½æ¯å¯¹ç¼åä¸æç´¢ä¸²çé¿åº¦ä¸å éå¶ãå¨ç»å¤§é¨ååºæ¯ä¸ï¼å®çæ§è½é½å强å¯ç¨ï¼ä½æ¯å¨é¢çé¶æ®µæè æ§è¡é«é¢æç´¢æ¶ä¼äº§çå¡é¡¿ã第äºä¸ªçæ¬ä½¿ç¨äºä¸ä¸ªå·¨å¤§çç¼åï¼å°ä»»ä½æç´¢è¿çæç´¢ä¸²åç´¢å¼ä¸²ç»å产ççç»æå®å ¨ç¼å䏿¥ãè¿ä¸ªç»ææ¯å®å ¨å¤±è´¥çï¼å®ä¸ä» å ç¨ç¸å½å¤çå åï¼åæ¶å¨æç´¢æ§è½ä¸ä¹å¹¶æ²¡æææ¾çæåãæ¯æ¬¡æç´¢æ¶ï¼æä»¬é½è¦å¨ç¼åä¸éåæ¥æ¾ææç´¢å¼ä¸²å¯¹åºçç»æï¼èè¿ä¸æä½å¹¶ä¸æ¯éåå¹é 快太å¤ãææ¾ç»å æ¤åæ§½è¿ HashMap çæ§è½ï¼ä½æ¯è¿ä¸é®é¢çç¶é¢å®é ä¸ä¸å¨ HashMapï¼èå¨ç¼å设计æ¬èº«ãä¸è¿è¯åè¯´åæ¥ï¼ç®å该项ç®ä¸å¹¿æ³ä½¿ç¨çå¤é¨å éæºå¶åè¿ä¸è®¾è®¡é常æ¥è¿ï¼ä½æ¯å®ä¸ä» æçæ´å è°¨æ çæ§è½ä¼åï¼èä¸ä»è®¾è®¡ä¸å¨æ³ç¨æ§åå©ç¨çä¸å ·æå³å®æ§çä¼å¿ã</p> 540 541<p>ç¸æ¯èµ·ä¹åçæ¹æ¡ï¼ç®ååºäºæ¼é³æ çå®ç°å¨æ´ä½ä¸æ´å 平衡ä¸é«æï¼å¯ä¸ä»¤äººæ å¿çé¨åå°±æ¯ç¸æ¯èµ·ä¸éè¦å»ºç«çæç´¢ç»æï¼å®å¨ç¼åæå»ºä¸èæ¶ç¨å¤ãå¨ä¹åçæ¬ç MC ä¸ï¼ç¼åæé æ¯å¨æ¸¸æå¯å¨åæ§è¡çï¼ç¸æ¯èµ·å¨è¾åå äºååéçå¯å¨æ¶é´ï¼è¿å ç§éå®å ¨å¯ä»¥å¿½ç¥ä¸è®¡ãè卿°çæ¬ç MC ä¸ï¼ç¸å ³çæä½è¢«ç§»å¨å°äºå è½½ä¸ççç¯èã尽管å¨ç»å¤§é¨åæ åµä¸å»ºç«ç´¢å¼åªéè¦ 5 ç§ä»¥ä¸çæ¶é´ï¼æä»¬ä»ç¶éè¦å¨æ§è½é®é¢ä¸ä¿æå ³æ³¨ã</p> 542 543<p>说å°ç´¢å¼æé çæ§è½é®é¢ï¼è¿ä¸ªé¡¹ç®ä¸ä½¿ç¨çåç¼æ°å®ç°å®é 䏿¯é常ç²ç³çã卿é ç¯èï¼ä¸åäºå¤§é¨åæ§è½ä¼åè¿çå®ç°ï¼ä»å®é ä¸ä» ä» æ¯å°ä¸ä¸ªåç¬¦ä¸²çææåç¼é¡ºåºå å ¥åå ¸æ ãæåå 认为è¿åºè¯¥å°±æ¯æè°ç $n^2$ æ´åæé ï¼ä½æ¯æµè¯ä¸æ¥å®çæ§è½è¿ä¼¼å¨ $n$ å $nlogn$ ä¹é´ãå¾çäºå缩æ çåçè
543ç¹ï¼å¨æå ¥æ¡ç®æ¶ï¼ä¸æ¦æä»¬å¨æ ç»æä¸ç§»å¨å°é¡¶ç«¯ï¼å°±å¯ä»¥ç´æ¥æå ¥ä¸ä¸ªåçèç¹æ¥æä»£å©ä¸çææå 容ãä¹å°±æ¯è¯´ï¼æå ¥æ¡ç®çæ§è½ä¸»è¦åå°æ 屿°çéå¶ãè¿æ¾ç¶è¦æ ¢äºåç±»çº¿æ§æé çç®æ³ï¼ä½æ¯å¤§é¨åçº¿æ§æé ç®æ³éè¦ç»´æ¤ suffix linkï¼å离èç¹åè¾¹ï¼è¿éè¦å ç¨æ´å¤å åï¼èä¸ä¹ä¸éç¨äºå¯éèç¹ï¼æä»¥åºç¨è¿äºç®æ³å¯è½ä¼ä½¿å åå ç¨ç¿»åçè³å¢å æ°åãèèå°è¿äºå ç´ ï¼ç®åå¨è¿æ¹é¢å¹¶æ²¡ææ¹å¨ç计åã</p> 544 545<h2 id="å°ç»">å°ç»</h2> 546 547<p>说å°è¿éï¼æä»¬è¿ä¸ªç³»åå°±å䏿®µè½äºãå¯¹äºæ¼é³ç¯å¢ä¸çåä¸²æ¥æ¾é®é¢ï¼æä»¬ç»åºäºå®æ¶å¹é çå®ç°ï¼åºäºåç¼æ°çæ¼é³æ çå®ç°ï¼ä»¥å两ç§å¨å®æ¶å¹é ä¸å éçå®ç°ãå°½ç®¡å¨æ§è½ä¸è¿åå¨ä¸äºä¼åç空é´ï¼ææ³å®åºè¯¥å¯ä»¥åºå¯¹å¤§é¨ååºæ¯äºã妿æ´ä¸ªç³»ç»æä»ä¹æ°çæ¹å¨ï¼æä¹ä¼ä»¥éè¨çå½¢å¼è¿è¡æ´æ°ãé£ä¹ï¼æä»¬ä¸æ¬¡è§å§ï¼</p> 548 549 550 551 <div class="copyright"> 552 <p align = "center" > 553 <font size="2.5px", color="grey"> 554 è¥éç¹æ®æ³¨æï¼æç« å为å主ååï¼éè¿ CC 4.0 BY License ææè½¬è½½ 555 </font> 556 </p> 557 </div> 558 559 <hr style="visibility: hidden;"> 560 <ul class="pager"> 561 562 <li class="previous"> 563 <a href="/2019/11/20/pinyin-search-again-4/" data-toggle="tooltip" data-placement="top" title="åè°æ¼é³å¹é ï¼åï¼ââ æ¼é³æ ï¼ä¸ï¼"> 564 Previous<br> 565 <span>åè°æ¼é³å¹é ï¼åï¼ââ æ¼é³æ ï¼ä¸ï¼</span> 566 </a> 567 </li> 568 569 570 <li class="next"> 571 <a href="/2019/12/08/algorithm-array-rotation/" data-toggle="tooltip" data-placement="top" title="ä»è´¹é©¬å°å®çå°æ°ç»æè½¬"> 572 Next<br> 573 <span>ä»è´¹é©¬å°å®çå°æ°ç»æè½¬</span> 574 </a> 575 </li> 576 577 </ul> 578 <hr style="visibility: hidden;"> 579 580 581 <!-- disqus è¯è®ºæ¡ start --> 582 <div class="comment"> 583 <div id="disqus_thread" class="disqus-thread"></div> 584 </div> 585 <!-- disqus è¯è®ºæ¡ end --> 586 587 588 589 </div> 590 591 <!-- Side Catalog Container --> 592 593 <div class=" 594 col-lg-2 col-lg-offset-0 595 visible-lg-block 596 sidebar-container 597 catalog-container"> 598 <div class="side-catalog"> 599 <hr class="hidden-sm hidden-xs"> 600 <h5> 601 <a class="catalog-toggle" href="#">CATALOG</a> 602 </h5> 603 <ul class="catalog-body"></ul> 604 </div> 605 </div> 606 607 608 <!-- Sidebar Container --> 609 <div class=" 610 col-lg-8 col-lg-offset-2 611 col-md-10 col-md-offset-1 612 sidebar-container"> 613 614 <!-- Featured Tags --> 615 616 617 618<section> 619 620 <hr class="hidden-sm hidden-xs"> 621 622 <h5><a href="/archive/">FEATURED TAGS</a></h5> 623 <div class="tags"> 624 625 626 627 </a> 628 629 630 <a data-sort="0029" 631 href="/archive/?tag=%E6%97%A5%E5%B8%B8" 632 title="æ¥å¸¸" 633 rel="8">æ¥å¸¸</a> 634 635 <a data-sort="0024" 636 href="/archive/?tag=Java" 637 title="Java" 638 rel="13">Java</a> 639 640 <a data-sort="0030" 641 href="/archive/?tag=%E5%BC%80%E5%8F%91" 642 title="å¼å" 643 rel="7">å¼å</a> 644 645 <a data-sort="0030" 646 href="/archive/?tag=JECh" 647 title="JECh" 648 rel="7">JECh</a> 649 650 <a data-sort="0031" 651 href="/archive/?tag=Atom" 652 title="Atom" 653 rel="6">Atom</a> 654 655 <a data-sort="0031" 656 href="/archive/?tag=LaTeX" 657 title="LaTeX" 658 rel="6">LaTeX</a> 659 660 <a data-sort="0034" 661 href="/archive/?tag=%E7%BD%91%E7%BB%9C" 662 title="ç½ç»" 663 rel="3">ç½ç»</a> 664 665 <a data-sort="0035" 666 href="/archive/?tag=C" 667 title="C" 668 rel="2">C</a> 669 670 <a data-sort="0035" 671 href="/archive/?tag=Jekyll" 672 title="Jekyll" 673 rel="2">Jekyll</a> 674 675 <a data-sort="0035" 676 href="/archive/?tag=OOP" 677 title="OOP" 678 rel="2">OOP 679 </div> 680</section> 681 682 683 <!-- Friends Blog --> 684 685<hr> 686<h5>FRIENDS</h5> 687<ul class="list-inline"> 688 689 <li><a href="http://shellcottage.me/">Shell Cottage</a></li> 690 691 <li><a href="https://tartaricacid.github.io/">é ç³é ¸è</a></li> 692 693</ul> 694 695 </div> 696 </div> 697 </div> 698</article> 699 700<!-- add support for mathjax by voleking--> 701
701<script type="text/x-mathjax-config"> 702 MathJax.Hub.Config({ 703 "fast-preview": {disabled: true}, 704 tex2jax: {preview: "none"}, 705 CommonHTML: { linebreaks: { automatic: true } }, 706 SVG: { linebreaks: { automatic: true } }, 707 "TeX": { 708 equationNumbers: {autoNumber: ["none"]}, 709 Macros: { 710 AA : "{\\unicode{x212B}}", 711 oiiint : "{\\rlap{\\subset}\\mkern-0.11em\\rlap\\int\\mkern0.3em\\rlap\\int\\mkern0.14em\\int\\mkern-1.1em\\supset}", 712 oiint : "{\\subset\\hspace{-11pt}\\iint\\hspace{-11pt}\\supset}" 713 } 714 }, 715 "HTML-CSS": { 716 scale: 90, 717 linebreaks: { automatic: true } 718 }, 719 "tex2jax": { 720 inlineMath: [ ['$','$'], ["\\(","\\)"] ], 721 processEscapes: true 722 } 723 }); 724 725 MathJax.Hub.Register.StartupHook("Begin",function () { 726 MathJax.Hub.Queue(function () { 727 var math = document.getElementById("rescale"); 728 var w = math.offsetWidth, W = math.parentNode.offsetWidth-40; 729 if (w > W) { 730 math.style.fontSize = (95*W/w)+"%"; 731 MathJax.Hub.getAllJax(math)[0].Rerender(); 732 } 733 }); 734 }); 735 </script>
vendor: 1 bytes, line 735
735
736<script type="text/javascript" 737 src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML"> 738</script>
738 739 740 741 742 743 744<!-- disqus å ¬å ±JS代ç start (ä¸ä¸ªç½é¡µåªéæå ¥ä¸æ¬¡) -->
745<script type="text/javascript"> 746 /* * * CONFIGURATION VARIABLES * * */ 747 var disqus_shortname = "towdium"; 748 var disqus_identifier = "/2019/11/27/pinyin-search-again-5"; 749 var disqus_url = "http://towdium.github.io/2019/11/27/pinyin-search-again-5/"; 750 751 (function() { 752 var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; 753 dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; 754 (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); 755 })(); 756</script>
756 757<!-- disqus å ¬å ±JS代ç end --> 758 759 760 761 762<!-- async load function -->
763<script> 764 function async(u, c) { 765 var d = document, t = 'script', 766 o = d.createElement(t), 767 s = d.getElementsByTagName(t)[0]; 768 o.src = u; 769 if (c) { o.addEventListener('load', function (e) { c(null, e); }, false); } 770 s.parentNode.insertBefore(o, s); 771 } 772</script>
772 773<!-- anchor-js, Doc:http://bryanbraun.github.io/anchorjs/ -->
774<script> 775 async("//cdnjs.cloudflare.com/ajax/libs/anchor-js/1.1.1/anchor.min.js",function(){ 776 anchors.options = { 777 visible: 'hover', 778 placement: 'right', 779 // icon: '#' 780 }; 781 anchors.add().remove('.intro-header h1').remove('.subheading').remove('.sidebar-container h5'); 782 }) 783</script>
783 784<style> 785 /* place left on bigger screen */ 786 @media all and (min-width: 800px) { 787 .anchorjs-link{ 788 position: absolute; 789 left: -0.75em; 790 font-size: 1.1em; 791 margin-top : -0.1em; 792 } 793 } 794</style> 795 796 797 798 <!-- Footer --> 799<footer> 800 <div class="container"> 801 <div class="row"> 802 <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1"> 803 <!-- SNS Link --> 804 805 806 807<ul class="list-inline text-center"> 808 809 810 811 <li> 812 <a href="/feed.xml"> 813 <span class="fa-stack fa-lg"> 814 <i class="fa fa-circle fa-stack-2x"></i> 815 <i class="fa fa-rss fa-stack-1x fa-inverse"></i> 816 </span> 817 </a> 818 </li> 819 820 821 822 823 <li> 824 <a target="_blank" href="http://weibo.com/5092127194"> 825 <span class="fa-stack fa-lg"> 826 <i class="fa fa-circle fa-stack-2x"></i> 827 <i class="fa fa-weibo fa-stack-1x fa-inverse"></i> 828 </span> 829 </a> 830 </li> 831 832 833 834 <li> 835 <a target="_blank" href="https://github.com/towdium"> 836 <span class="fa-stack fa-lg"> 837 <i class="fa fa-circle fa-stack-2x"></i> 838 <i class="fa fa-github fa-stack-1x fa-inverse"></i> 839 </span> 840 </a> 841 </li> 842 843 844</ul> 845 846 <p class="copyright text-muted"> 847 Copyright © Towdium's here 2022 848 <br> 849 Powered by <a href="http://huangxuan.me">Hux Blog</a> | 850 <iframe 851 style="margin-left: 2px; margin-bottom:-5px;" 852 frameborder="0" scrolling="0" width="100px" height="20px" 853 src="https://ghbtns.com/github-btn.html?user=huxpro&repo=huxpro.github.io&type=star&count=true" > 854 </iframe> 855 </p> 856 </div> 857 </div> 858 </div> 859</footer> 860 861<!-- jQuery -->
862<script src="/js/jquery.min.js "></script>
862 863 864<!-- Bootstrap Core JavaScript --> 865<!-- Currently, only navbar scroll-down effect at desktop still depends on this -->
866<script src="/js/bootstrap.min.js "></script>
866 867 868<!-- Custom Theme JavaScript -->
869<script src="/js/hux-blog.min.js "></script>
869 870 871<!-- Service Worker --> 872
873<script src="/js/snackbar.js "></script>
vendor: 1 bytes, line 873
873
874<script src="/js/sw-registration.js "></script>
874 875 876 877<!-- async load function -->
878<script> 879 function async(u, c) { 880 var d = document, t = 'script', 881 o = d.createElement(t), 882 s = d.getElementsByTagName(t)[0]; 883 o.src = u; 884 if (c) { o.addEventListener('load', function (e) { c(null, e); }, false); } 885 s.parentNode.insertBefore(o, s); 886 } 887</script>
887 888 889<!-- 890 Because of the native support for backtick-style fenced code blocks 891 right within the Markdown is landed in Github Pages, 892 From V1.6, There is no need for Highlight.js, 893 so Huxblog drops it officially. 894 895 - https://github.com/blog/2100-github-pages-now-faster-and-simpler-with-jekyll-3-0 896 - https://help.github.com/articles/creating-and-highlighting-code-blocks/ 897 - https://github.com/jneen/rouge/wiki/list-of-supported-languages-and-lexers 898--> 899<!-- 900
900<script> 901 async("http://cdn.bootcss.com/highlight.js/8.6/highlight.min.js", function(){ 902 hljs.initHighlightingOnLoad(); 903 }) 904 </script>
904 905 <link href="http://cdn.bootcss.com/highlight.js/8.6/styles/github.min.css" rel="stylesheet"> 906--> 907 908 909 910 911 912<!--fastClick.js -->
913<script> 914 async("//cdnjs.cloudflare.com/ajax/libs/fastclick/1.0.6/fastclick.min.js", function(){ 915 var $nav = document.querySelector("nav"); 916 if($nav) FastClick.attach($nav); 917 }) 918</script>
918 919 920 921<!-- Google Analytics --> 922
923<script> 924 // dynamic User by Hux 925 var _gaId = 'UA-73095900-1'; 926 var _gaDomain = 'www.towdium.me'; 927 928 // Originial 929 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 930 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 931 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 932 })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 933 934 ga('create', _gaId, _gaDomain); 935 ga('send', 'pageview'); 936</script>
936 937 938 939 940<!-- Baidu Tongji --> 941 942 943 944<!-- Side Catalog --> 945
946<script type="text/javascript"> 947 function generateCatalog (selector) { 948 949 // interop with multilangual 950 if ('' == 'true') { 951 _containerSelector = 'div.post-container.active' 952 } else { 953 _containerSelector = 'div.post-container' 954 } 955 956 // init 957 var P = $(_containerSelector),a,n,t,l,i,c; 958 a = P.find('h1,h2,h3,h4,h5,h6'); 959 960 // clean 961 $(selector).html('') 962 963 // appending 964 a.each(function () { 965 n = $(this).prop('tagName').toLowerCase(); 966 i = "#"+$(this).prop('id'); 967 t = $(this).text(); 968 c = $('<a href="'+i+'" rel="nofollow">'+t+'</a>'); 969 l = $('<li class="'+n+'_nav"></li>').append(c); 970 $(selector).append(l); 971 }); 972 return true; 973 } 974 975 generateCatalog(".catalog-body"); 976 977 // toggle side catalog 978 $(".catalog-toggle").click((function(e){ 979 e.preventDefault(); 980 $('.side-catalog').toggleClass("fold") 981 })) 982 983 /* 984 * Doc: https://github.com/davist11/jQuery-One-Page-Nav 985 * Fork by Hux to support padding 986 */ 987 async("/js/jquery.nav.js", function () { 988 $('.catalog-body').onePageNav({ 989 currentClass: "active", 990 changeHash: !1, 991 easing: "swing", 992 filter: "", 993 scrollSpeed: 700, 994 scrollOffset: 0, 995 scrollThreshold: .2, 996 begin: null, 997 end: null, 998 scrollChange: null, 999 padding: 80 1000 }); 1001 }); 1002</script>
1002 1003 1004 1005 1006<!-- Multi-Lingual --> 1007 1008 1009 1010 1011<!-- Image to hack wechat --> 1012<img src="/img/site/icon.png" width="0" height="0" /> 1013<!-- Migrate from head to bottom, no longer block render and still work --> 1014
1015<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"cc8aae5433c64f15922ee641785c7a8d","r":1,"spa":2}' crossorigin="anonymous"></script>
1015 1016</body> 1017 1018</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.