91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中字典樹的算法實現

發布時間:2021-09-15 20:02:27 來源:億速云 閱讀:126 作者:chen 欄目:開發技術

這篇文章主要講解了“Java中字典樹的算法實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java中字典樹的算法實現”吧!

前言

字典樹,又稱單詞查找樹,是一個典型的 一對多的字符串匹配算法。“一”指的是一個模式串,“多”指的是多個模板串。字典樹經常被用來統計、排序和保存大量的字符串。它利用字符串的公共前綴來減少查詢時間,最大限度地減少無謂的字符串比較。

字典樹有3個基本性質:

  1. 根節點不包含字符,其余的每個節點都包含一個字符;

  2. 從根節點到某一節點,路徑上經過的字符連接起來,為該節點對應的字符串;

  3. 每個節點的所有子節點包含的字符都不相同。

Java中字典樹的算法實現

pass參數:代表從這個點經過的單詞數量。root根即就是整棵樹有多少單詞。

end參數: 代表在這個點結束的單詞有幾個。例如: 上圖有兩個 hello,在o結點的end參數就是2。

實現的基本功能: 增刪查。

算法解析

首先是結點的參數:

public class Node {
    public int pass;
    public int end;
    public Node[] nexts; //下一個字母的地址
    
    public Node() {
        pass = 0;
        end = 0;
        nexts = new Node[26]; //這里我們就以小寫字母為例
    }
}

下面就是基本功能的實現:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        String[] arr = {"hello", "hello"};

        Trie root = new Trie();
        for (int i = 0; i < arr.length; i++) {
            root.addWord(arr[i]);
        }
        //root.delWord("hello");
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();

        if (root.searchWord(s) != 0) {
            System.out.println("該字典樹有這個" + s + " 單詞");
        }

    }
    public static class Node {
        public int pass;
        public int end;
        public Node[] nexts; //下一個字母的地址

        public Node() {
            pass = 0;
            end = 0;
            nexts = new Node[26];
        }
    }
    public static class Trie {
        private Node root;

        public Trie() {
            root = new Node();
        }
        //增加
        public void addWord(String str) {
            char[] arr = str.toCharArray();
            root.pass++;
            Node node = root;
            for (char s : arr) {
                int index = s - 'a'; //以相應的ASCII碼值差值,進行數組的下標存儲
                if (node.nexts[index] == null) {
                    node.nexts[index] = new Node();
                }
                node = node.nexts[index];
                node.pass++; //經過這個結點,pass就加1
            }
            node.end++;
        }

        //刪除
        public void delWord(String str) {
            //刪除之前,應該查詢一下這顆樹有沒有這個單詞
            while (searchWord(str) != 0) {
                char[] arr = str.toCharArray();
                Node node = root;
                  node.pass--;
                for (int i = 0; i < str.length(); i++) {
                    int index = arr[i] - 'a';
                    node = node.nexts[index];
                    node.pass--;
                }
                node.end--;
            }
        }

        //查找
        public int searchWord(String str) {
            if (str == null) {
                return 0;
            }
            char[] arr = str.toCharArray();
            Node node = root;
            for (int i = 0; i < str.length(); i++) {
                int index = arr[i] - 'a';
                if (node.nexts[index] == null) {
                    return 0;
                }
                node = node.nexts[index];
            }
            return node.end; //返回最后那一個結點的end值即可
        }
    }
}

感謝各位的閱讀,以上就是“Java中字典樹的算法實現”的內容了,經過本文的學習后,相信大家對Java中字典樹的算法實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安多县| 民勤县| 敖汉旗| 丽水市| 德钦县| 浦县| 商水县| 莆田市| 东源县| 淮南市| 怀远县| 土默特右旗| 三台县| 嘉祥县| 石柱| 普定县| 杭锦后旗| 马尔康县| 霞浦县| 重庆市| 如东县| 弥勒县| 南昌市| 常德市| 巍山| 宁晋县| 株洲市| 毕节市| 广宁县| 新安县| 鄄城县| 牡丹江市| 潞西市| 太原市| 遵化市| 津南区| 沭阳县| 固阳县| 时尚| 清远市| 忻城县|