前綴樹

是一種哈希樹的變種。典型應用是用于統計,排序和保存大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統用于文本詞頻統計。它的優點是:利用字符串的公共前綴來減少查詢時間,最大限度地減少無謂的字符串比較,查詢效率比哈希樹高。

字典樹又稱為前綴樹或Trie樹,是處理字符串常見的數據結構。假設組成所有單詞的字符僅是“a”~"z",請實現字典樹結構,并包含以下四個主要功能:

void insert(String word):添加word,可重復添加。
void delete(String word):刪除word,如果word添加過多次,僅刪除一次。
boolean search(String word):查詢word是否在字典樹中。
int prefixNumber(String pre):返回以字符串pre為前綴的單詞數量。
思考:

字典樹的介紹。字典樹是一種樹形結構,優點是利用字符串的公共前綴來節約存儲空間。

?

基本性質:

字典樹的基本性質如下:

  • 根節點沒有字符路徑。除根節點外,每一個節點都被一個字符路徑找到。
  • 從根節點到某一節點,將路徑上經過的字符連接起來,為掃過的對應字符串。
  • 每個節點向下所有的字符路徑上的字符都不同。

也不需要記,看了實現,很自然的性質就理解了。

每個結點內有一個指針數組,里面有二十六個指針,分別指向二十六個字母。

如果指向某個字母的指針為空,那就是以前沒有遇到過這個前綴。

?

搜索的方法為:

(1) 從根結點開始一次搜索;

(2) 取得要查找關鍵詞的第一個字母,并根據該字母選擇對應的子樹并轉到該子樹繼續進行檢索;

(3) 在相應的子樹上,取得要查找關鍵詞的第二個字母,并進一步選擇對應的子樹進行檢索。

(4) 迭代過程……

(5) 在某個結點處,關鍵詞的所有字母已被取出,則讀取附在該結點上的信息,即完成查找。

其他操作類似處理

插入也一樣,只是轉到某個子樹時,沒有子樹,那就創建一個新節點,然后對應指針指向新節點即可。

我們給出定義就更清楚了:

public static class TrieNode {public int path; //表示由多少個字符串共用這個節點public int end;//表示有多少個字符串是以這個節點結尾的public TrieNode[] map;//哈希表結構,key代表該節點的一條字符路徑,value表示字符路徑指向的節點public TrieNode() {path = 0;end = 0;map = new TrieNode[26];}
}

path和end都是有用的,接下來會說明

insert:

	    public static class Trie {private TrieNode root;//頭public Trie() {root = new TrieNode();}public void insert(String word) {if (word == null) {return;}//空串char[] chs = word.toCharArray();TrieNode node = root;int index = 0; //哪條路for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a'; //0~25if (node.map[index] == null) {node.map[index] = new TrieNode();}//創建,繼續node = node.map[index];//指向子樹node.path++;//經過加1}node.end++;//本單詞個數加1}
	        public boolean search(String word) {if (word == null) {return false;}char[] chs = word.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (node.map[index] == null) {return false;//找不到}node = node.map[index];}return node.end != 0;//end標記有沒有以這個字符為結尾的字符串}

delete:?

	        public void delete(String word) {//如果有if (search(word)) {char[] chs = word.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (node.map[index].path-- == 1) {//path減完之后為0node.map[index] = null;return;}node = node.map[index];//去子樹}node.end--;//次數減1}}

prefixNumber:

 public int prefixNumber(String pre) {if (pre == null) {return 0;}char[] chs = pre.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (node.map[index] == null) {return 0;//找不到}node = node.map[index];}return node.path;//返回經過的次數即可}

好處:

1.利用字符串的公共前綴來節約存儲空間。

2.最大限度地減少無謂的字符串比較,查詢效率比較高。例如:若要查找的字符長度是5,而總共有單詞的數目是26^5=11881376,利用trie樹,利用5次比較可以從11881376個可能的關鍵字中檢索出指定的關鍵字,而利用二叉查找樹時間復雜度是O( log2n?),所以至少要進行log211881376=23.5次比較。可以看出來利用字典樹進行查找速度是比較快的。

?

應用:

<1.字符串的快速檢索

<2.字符串排序

<3.最長公共前綴:abdh和abdi的最長公共前綴是abd,遍歷字典樹到字母d時,此時這些單詞的公共前綴是abd。

<4.自動匹配前綴顯示后綴

我們使用辭典或者是搜索引擎的時候,輸入appl,后面會自動顯示一堆前綴是appl的東東吧。

那么有可能是通過字典樹實現的,前面也說了字典樹可以找到公共前綴,我們只需要把剩余的后綴遍歷顯示出來即可。

?

相關題目:

一個字符串類型的數組arr1,另一個字符串類型的數組arr2。

arr2中有哪些字符,是arr1中出現的?請打印。

arr2中有哪些字符,是作為arr1中某個字符串前綴出現的?請打印。

arr2中有哪些字符,是作為arr1中某個字符串前綴出現的?請打印arr2中出現次數最大的前綴。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445530.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445530.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445530.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習4層板設計

今天是第一天嘗試設計四層PCB板&#xff0c;以前只畫過雙層板&#xff0c;所以今天花了好多時間來熟悉多層板的設計方法&#xff0c;現在做一下整理&#xff0c;也方便其他同胞少走彎路~~~我用的軟件是Altium Designer 6&#xff08;AD6&#xff09;步驟如下&#xff1a; 1、隨…

PCB設計的基本步驟

一.方案的設計 1.與客戶溝通&#xff0c;確定電路的功能和相關設計指標&#xff08;如&#xff1a;電源&#xff0c;功耗等&#xff09;。 2.畫出項目的硬件功能框圖。 3.設計出多種方案&#xff0c;并對多種方案進行對比&#xff0c;最終選出最合適的方案。 4.根據上述所…

堆應用例題三連

一個數據流中&#xff0c;隨時可以取得中位數。 題目描述&#xff1a;有一個源源不斷地吐出整數的數據流&#xff0c;假設你有足夠的空間來保存吐出的數。請設計一個名叫MedianHolder的結構&#xff0c;MedianHolder可以隨時取得之前吐出所有樹的中位數。 要求&#xff1a; 1…

HistCite 的使用方法

摘要 讀文獻自然要讀精品&#xff0c;在面對一個陌生領域&#xff0c;如何才能以最快速度定位精品文獻呢&#xff1f;本文將詳細介紹 HistCite 的使用方法&#xff0c;結合 Web of Science 和 Endnote &#xff0c;演示如何在幾個小時之內&#xff0c;對某個陌生領域的文獻進行…

數組基操三連(2)

轉圈打印矩陣 題目&#xff1a; 給定一個整型矩陣matrix&#xff0c;請按照轉圈的方式打印它。例如&#xff1a;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,打印結果為&#xff1a;1,2,3,4,5,12,16,15,14,13,9,5,6,7,11,10 要求&#xff1a; 額外空間復雜度為O&#xff08;1&a…

數據結構課上筆記7

介紹棧和隊列基本概念和用法。 設輸入序列1、2、3、4&#xff0c;則下述序列中&#xff08; &#xff09;不可能是出棧序列。【中科院中國科技大學2005】 A. 1、2、3、4 B. 4、 3、2、1 C. 1、3、4、2 D.&#xff14;、1、2、3 選…

ROC曲線與AUC值

ROC曲線與AUC值 1.概述AUC&#xff08;Area Under roc Curve&#xff09;是一種用來度量分類模型好壞的一個標準。這樣的標準其實有很多&#xff0c;例如&#xff1a;大約10年前在machine learning文獻中一統天下的標準&#xff1a;分類精度&#xff1b;在信息檢索(IR)領域中常…

設置SSH免密碼自動登錄(使用別名)

每次登錄服務器都要寫一大串的用戶名&#xff08;username服務器地址&#xff09;和登錄密碼十分的繁瑣&#xff0c;所以本文就告訴大家如何通過修改配置文件&#xff0c;達到只需要輸入&#xff1a;ssh jack(你起的別名)就可以一鍵登錄到服務器中。 1.創建公鑰&#xff08;相當…

串的定長表示

思想和代碼都不難&#xff0c;和線性表也差不多&#xff0c;串本來就是數據受限的線性表。 串連接&#xff1a; #include <stdio.h> #include <string.h> //串的定長順序存儲表示 #define MAXSTRLEN 255 //用戶可在255以內定義最大串長 typedef unsigned cha…

周志華《Machine Learning》 學習筆記系列(1)--緒論

機器學習致力于研究如何通過計算手段&#xff0c;利用經驗來改善系統本身的性能&#xff0c;在計算機系統中&#xff0c;“經驗”通常是以“數據”形式存在的&#xff0c;所以&#xff0c;機器學習的主要內容是關于在計算機上從數據中產生“模型”的算法&#xff0c;即學習算法…

輕松理解牛頓迭代法且用其求平方根

牛頓迭代法概述 牛頓迭代法&#xff08;Newton’s method&#xff09;又稱為牛頓-拉弗森方法&#xff08;Newton-Raphson method&#xff09;&#xff0c;它是牛頓在17世紀提出的一種在實數域和復數域上近似求解方程的方法。 牛頓迭代公式 設rrr是f(x)0f(x)0f(x)0的根&#…

map+DP leetcode446

如果數字序列由至少三個元素組成并且任何兩個連續元素之間的差異相同&#xff0c;則稱為算術序列。 例如&#xff0c;這些是算術序列&#xff1a; 1&#xff0c;3&#xff0c;5&#xff0c;7&#xff0c;9 7&#xff0c;7,7&#xff0c;7 3&#xff0c;-1&#xff0c;-5&am…

如何使用cookie信息,完成自動登錄

在做爬蟲任務的時候&#xff0c;我們常常會遇到很多網頁必須登錄后&#xff0c;才可以開放某些頁面。所以登錄是爬取網頁的第一步。但是&#xff0c;通過post表單&#xff08;包含用戶名和密碼&#xff09;的方法&#xff0c;對于那些不需要輸入比較復雜的驗證碼的網頁&#xf…

Spring Cloud 學習筆記(1 / 3)

Spring Cloud 學習筆記&#xff08;2 / 3&#xff09; Spring Cloud 學習筆記&#xff08;3 / 3&#xff09; ---01_前言閑聊和課程說明02_零基礎微服務架構理論入門03_第二季Boot和Cloud版本選型04_Cloud組件停更說明05_父工程Project空間新建06_父工程pom文件07_復習Depend…

后綴樹/后綴數組

字典樹&#xff1a;https://blog.csdn.net/hebtu666/article/details/83141560 后綴樹&#xff1a;后綴樹&#xff0c;就是把一串字符的所有后綴保存并且壓縮的字典樹。 相對于字典樹來說&#xff0c;后綴樹并不是針對大量字符串的&#xff0c;而是針對一個或幾個字符串來解決…

kaggle(02)-房價預測案例(基礎版)

房價預測案例 Step 1: 檢視源數據集 import numpy as np import pandas as pd讀入數據 一般來說源數據的index那一欄沒什么用&#xff0c;我們可以用來作為我們pandas dataframe的index。這樣之后要是檢索起來也省事兒。 有人的地方就有鄙視鏈。跟知乎一樣。Kaggle的也是個處…

為什么Python中整型不會溢出

前言 本次分析基于 CPython 解釋器&#xff0c;python3.x版本 在python2時代&#xff0c;整型有 int 類型和 long 長整型&#xff0c;長整型不存在溢出問題&#xff0c;即可以存放任意大小的整數。在python3后&#xff0c;統一使用了長整型。這也是吸引科研人員的一部分了&am…

如何使用github中的pull request功能?

* pull request是社會化編程的象征&#xff0c;通過這個功能&#xff0c;你可以參與到別人開發的項目中&#xff0c;并做出自己的貢獻。pull request是自己修改源代碼后&#xff0c;請求對方倉庫采納的一種行為*–《github入門與實踐》 下面具體說一下github中使用pull reque…

「假裝努力」

有多少人在「假裝努力」&#xff1f; 又有多少人在「真正成長」&#xff1f; 再努力努力 回想起當年畢業后&#xff0c;在北京和室友合租的日子。 那時&#xff0c;我在工作&#xff0c;室友在培訓。 一天&#xff0c;我下班回來&#xff0c;聽見他在電話里和家人爭吵&…

如何閱讀論文?

本文主要講述了如何才能高效的閱讀一篇論文&#xff01;&#xff01;