原创 字典樹原理分析及實現(支持中文插入)

1.背景 匹配算法的瓶頸之一在於如何判斷字典中是否含有字符串,如果用的是有序集合(TreeMap)的話,複雜度是O(logn),如果用散列表(HashMap),賬面上的時間複雜度雖然下降了,但內存複雜度上去了。我們要尋找一種速度又

原创 AC自動機詳解及實現

1.背景 之前的Trie樹,DBTrie都屬於前綴樹,雖然DAT每次狀態轉移的時間複雜度都是常數,但全切分長度爲n的文本時,時間複雜度爲O(n2)。這是因爲掃描過程中需要不斷的挪動起點,發起新的查詢。所以說,DAT的全切分複雜度爲

原创 停用詞過濾原理及實現

1.停用詞 指語言中一類沒有多少意義的詞語,比如“的”,“甚至”,“不僅”,“吧”… 一個句子去掉了停用詞並不影響理解,停用詞視具體的任務不同而不同。停用詞過濾是一個常見的預處理過程 2.實現思路 加載中止詞:IO加載中止詞(

原创 CSDN博客遷移到Hexo(提供格式轉換)

1.背景 前幾天用GitHub搭好博客後,想把在CSDN上的文章轉換成符合Hexo要求的MarkDown文件,爲避免重複造輪子,我先在GitHub搜了一下項目,最終決定使用這個工具。 2.準備工作 安裝Node.js 安

原创 雙數組字典樹(DATrie)詳解及實現

1.背景 Trie樹本質是一個確定的有限狀態自動機(DFA),核心思想是空間換時間,利用字符串的公共前綴來降低查詢時間的開銷以達到提高效率的目的。但由於Trie樹的稀疏現象嚴重,空間利用率較低爲了讓Trie樹實現佔用較少的空間,同

原创 NLP概述及流派

1.基礎概念 自然語言處理(Nature Language Processing,NLP)是一門融合了計算機科學,人工智能以及語言學的交叉學科。 2.研究目標 通過機器學習等技術,讓計算機學會處理人類語言,乃至實現終極目標——理

原创 數據結構思維筆記(十五)持久化

第十五章 持久化 現在我們回顧一下搜索引擎的構建: 抓取:我們需要一個程序,可以下載一個網頁,解析它,並提取文本和任何其他頁面的鏈接。 索引:我們需要一個索引,可以查找檢索項並找到包含它的頁面。 檢索:我們需要一種方法,從索引中

原创 數據結構思維筆記(十一)哈希

在本章中,我定義了一個比MyLinearMap更好的Map接口實現,MyBetterMap,並引入哈希,這使得MyBetterMap效率更高。 1.哈希 爲了提高MyLinearMap的性能,我們將編寫一個新的類,它被稱爲M

原创 數據結構思維筆記(十七) 布爾搜索

接着上一節的內容,我們已經構建了一個爬取百度百科並持久化的爬蟲。現在客戶使用,我們需要構建一個搜索工具。 1.信息檢索 這個項目的下一個階段是實現一個搜索工具。我們需要的部分包括: 一個界面,其中用戶可以提供檢索詞並查看結果。

原创 數據結構思維筆記(十四)二叉搜索樹

本章繼續承接上章的內容,具體實現TreeMap中的方 1.簡單的TreeMap 這裏比較核心的一個方法是findNode,用來尋找與鍵值相當的節點,下面是它的實現: private Node findNode(Object t

原创 數據結構思維筆記(九)索引器

目前,我們構建了一個基本的 Web 爬蟲;我們下一步將是索引。在網頁搜索的上下文中,索引是一種數據結構,可以查找檢索詞並找到該詞出現的頁面。此外,我們想知道每個頁面上顯示檢索詞的次數,這將有助於確定與該詞最相關的頁面。 例如,如

原创 排序算法(二)歸併排序Java實現及分析

1.歸併排序 歸併操作(merge),也叫歸併算法,指的是將兩個順序序列合併成一個順序序列的方法。 如 設有數列{6,202,100,301,38,8,1} 初始狀態:6,202,100,301,38,8,1 第一次歸併後:{

原创 排序算法(三)堆排序及有界堆排序Java實現及分析

1.堆排序 基數排序適用於大小有界的東西,除了他之外,還有一種你可能遇到的其它專用排序算法:有界堆排序。如果你在處理非常大的數據集,你想要得到前 10 個或者前k個元素,其中k遠小於n,它是很有用的。 例如,假設你正在監視一 個

原创 排序算法(一) 插入排序及Java實現

插入排序是一種簡單的排序算法,從頭遍歷數組,依此比較排序 代碼實現: public void insertionSort(List<T> list, Comparator<T> comparator) {

原创 字典樹原理分析及實現

1.背景 匹配算法的瓶頸之一在於如何判斷字典中是否含有字符串,如果用的是有序集合(TreeMap)的話,複雜度是O(logn),如果用散列表(HashMap),賬面上的時間複雜度雖然下降了,但內存複雜度上去了。我們要尋找一種速度又