日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法之前缀数

發布時間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法之前缀数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據結構與算法之前綴數


目錄

  • 前綴數

  • 1. 前綴數

    (一)前綴數描述

    Trie樹,即字典樹,又稱單詞查找樹或鍵樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用于統計和排序大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統用于文本詞頻統計。它的優點是:最大限度地減少無謂的字符串比較,查詢效率比哈希表高。

    Trie的核心思想是空間換時間。利用字符串的公共前綴來降低查詢時間的開銷以達到提高效率的目的。

    它有3個基本性質:

  • 根節點不包含字符,除根節點外每一個節點都只包含一個字符。
  • 從根節點到某一節點,路徑上經過的字符連接起來,為該節點對應的字符串。
  • 每個節點的所有子節點包含的字符都不相同。
  • 引自博客園:https://www.cnblogs.com/luosongchao/p/3239521.html

    示意圖:

    (二)代碼實現

    (1)思路

  • insert操作

  • 判斷輸入的字符串是否為null,null直接返回。
  • 將字符串轉化成char數組,創建TrieNode node指向root節點,并創建變量index用來記錄從哪個桶找
  • 遍歷char數組,index = char[i]-‘a’ ,得到去哪個桶找
  • 如果桶為null,則創建TrieNode,否則node指向下一個節點,path++(表示有多少個節點到達過)
  • 退出for循環,end++(表示有多少個字符串以它結尾)
  • search操作

  • 和insert操作相似,不同點在于如果桶第4步桶為null,返回0.
  • 退出for循環后返回end即可。
  • delete操作

  • 判斷前綴樹是否有要刪除的word。
  • 如同添加一樣,index獲取要刪除單詞的那個桶,沿途找下去–path,循環結束后end–。
  • (2)代碼實現

    public class Code_TrieTree {public static class TrieNode {public int path;public int end;public TrieNode[] nexts;public TrieNode() {path = 0;end = 0;nexts = new TrieNode[26];}}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';if (node.nexts[index] == null) {node.nexts[index] = new TrieNode();}node = node.nexts[index];node.path++;}node.end++;}public void delete(String word) {if (search(word) != 0) {char[] chs = word.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (--node.nexts[index].path == 0) {node.nexts[index] = null;return;}node = node.nexts[index];}node.end--;}}public int search(String word) {if (word == null) {return 0;}char[] chs = word.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (node.nexts[index] == null) {return 0;}node = node.nexts[index];}return node.end;}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.nexts[index] == null) {return 0;}node = node.nexts[index];}return node.path;}}public static void main(String[] args) {Trie trie = new Trie();System.out.println(trie.search("zuo"));trie.insert("zuo");System.out.println(trie.search("zuo"));trie.delete("zuo");System.out.println(trie.search("zuo"));trie.insert("zuo");trie.insert("zuo");trie.delete("zuo");System.out.println(trie.search("zuo"));trie.delete("zuo");System.out.println(trie.search("zuo"));trie.insert("zuoa");trie.insert("zuoac");trie.insert("zuoab");trie.insert("zuoad");trie.delete("zuoa");System.out.println(trie.search("zuoa"));System.out.println(trie.prefixNumber("zuo"));}}

    總結

    以上是生活随笔為你收集整理的数据结构与算法之前缀数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。