使用程式碼列出金庸小說中使用過的所有成語
去年的今天,金庸與世長辭,當時Jerry在成都地鐵一號線下班的路上得知了這個訊息,回到家立即寫了一篇文章來悼念: 金庸的武俠世界和SAP的江湖。
一年的時間轉瞬即逝,大家都忙碌於各自的生活,很多人對金老的離世已經淡忘了,不過Jerry這種金庸的死忠粉,對於這個一週年忌日還是記得很清楚的。
因為Jerry手上事情很多,沒時間在這個特殊的日子寫文章紀念了,就發一小段程式碼吧。
需求:列出金庸任意一本小說裡出現的所有成語。
實現:Jerry部署在Github上的一個web應用,連結如下:
首先點選超連結“成語全集”:
點選之後,儲存於該web應用本地儲存的一個文字檔案裡的全部19830個成語,以樹的形式載入到記憶體中,並顯示在網頁上:
然後複製一本金庸小說的內容,貼上到網頁的“內容”區域,點選按鈕“測試”:
可以看到僅僅用了246毫秒,就將這部一百多萬字的《倚天屠龍記》裡出現的所有成語,以紅色高亮的方式高亮出來。
這個功能咋實現的?Chrome開啟Jerry的網頁,F12開啟開發者工具,就能看到JavaScript原始碼,當然也可以從我的 Github上獲得.
Jerry簡單講下實現原理。Web應用裡有一個文字檔案,裡面維護了漢語裡全部的成語,透過分號分隔。
執行時,這些內容會被載入到記憶體中,構建成一棵樹,如下圖所示:
其中葉節點以屬性end為true區分。
成語檢索的核心邏輯位於search函式里,讓我們用《笑傲江湖》裡一句響亮的口號“日月神教千秋萬載,一統江湖”來單步除錯,瞭解其實現邏輯。
進入165行的外層while迴圈,再進入173行的內層for迴圈,檢測是否有測試字串第一個字元“日”開頭的成語。因為成語是由4個字元組成,所以需要用內層for迴圈逐一試探,如果遇到tblCur.end為true的元素,說明在測試字串中發現了一個成語。
下圖是內層for迴圈第一次執行後的tblCur內容:
內層迴圈執行第二次,此時tblCur指向一棵由所有“日月”開頭的成語組成的樹:
執行內層迴圈的第三次迭代,因為在樹“日-月”這個分支下面沒有“神”這個節點,所以結束當前的內層迴圈,透過break返回到外層的while迴圈,進行輸入字串第二個字元“月”的新一輪試探,以此類推。
最後從“千”這個字元出發,沿著記憶體中的樹經過路徑"秋-萬",最後來到end屬性為true的葉節點“載”,記下“千”在輸入字串中的偏移量,存到一個陣列arrMatch中去。
待輸入字串全部試探完畢後,根據arrMatch中存放的偏移量,高亮顯示對應的字串,完成檢索。
樹這個資料結構在這個需求的實現裡有著完美的表現。
金庸雖然離開了我們,但他筆下那些人物和發生的故事,將永遠流傳於這個世上。
更多閱讀
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2662127/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 金庸筆下的良好程式碼風格
- 使用lsblk命令列出系統中的塊裝置命令列
- 瞭解過、使用過的程式語言及其優勢,瞭解過、使用過的程式設計工具程式設計
- 如何使用簡單程式碼列出Spring Boot暴露的所有端點? - ZaniniSpring Boot
- 【程式語言】C/C++中如何使用Lua指令碼C++指令碼
- 查詢一個事務程式碼所使用的BADI
- 幽默:過度使用Lambda的Java程式碼Java
- 使用Java 8的Stream API列出ZIP檔案中的條目JavaAPI
- 在 JavaScript 中實現私有成員的語法特性JavaScript
- 透過程式碼改變客戶端所顯示的語言型別 (轉)客戶端型別
- js with語句使用程式碼例項JS
- JavaScript 獲取瀏覽器的所使用語言JavaScript瀏覽器
- mySQL語法中的儲存過程及if語句的使用簡例MySql儲存過程
- 金庸逝世兩週年:一個失意程式設計師的囈語程式設計師
- Vue使用中遇到的程式碼問題Vue
- 程式中減少使用 if 語句的方法集錦
- 程式中減少使用if語句的方法集錦
- ASP程式中常使用的幾種指令碼語言指令碼
- sql 中的with 語句使用SQL
- Aix命令:列出使用記憶體和Cpu前幾位的程式AI記憶體
- 使用sqlmap中tamper指令碼繞過wafSQL指令碼
- mysql語法使用詳細程式碼版MySql
- 谷歌、阿里都在使用的dart程式語言,你學過沒?谷歌阿里Dart
- 如何使用air自動過載程式碼AI
- 簡單演示Excel中VBA程式碼的使用Excel
- nltk-構建和使用語料庫-可用於小說的推薦-完整例項
- 使用C語言編寫貪食蛇程式原始碼C語言原始碼
- php中return語句的使用PHP
- MySQL中explain語句的使用MySqlAI
- 你真的使用過低程式碼產品嗎?
- VUE 使用中踩過的坑Vue
- 使用chatgt(GPT-4)將過程式(的java程式碼)改成函式式(的elixir程式碼)GPTJava函式
- 使用dbms_stats列出沒有統計資訊的物件!物件
- goto 語法在 PHP 中的使用GoPHP
- 如何安全的儲存使用者密碼?(中)程式碼篇密碼
- 使用 ESLint + Prettier 簡化程式碼 Review 過程EsLintView
- 【過濾器】web中過濾器的使用與亂碼問題解決過濾器Web
- Postgre 中列出Column情報的命令