欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中關于字典樹的算法實現(xiàn)

 更新時間:2021年09月15日 17:11:37   作者:飛人01_01  
字典樹,又稱單詞查找樹,Trie樹,是一種樹形結構,哈希表的一個變種。用于統(tǒng)計,排序和保存大量的字符串,本文針對字典樹給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值

字典樹(前綴樹)算法實現(xiàn)

前言

字典樹,又稱單詞查找樹,是一個典型的 一對多的字符串匹配算法?!耙弧敝傅氖且粋€模式串,“多”指的是多個模板串。字典樹經(jīng)常被用來統(tǒng)計、排序和保存大量的字符串。它利用字符串的公共前綴來減少查詢時間,最大限度地減少無謂的字符串比較。

字典樹有3個基本性質:

  1. 根節(jié)點不包含字符,其余的每個節(jié)點都包含一個字符;
  2. 從根節(jié)點到某一節(jié)點,路徑上經(jīng)過的字符連接起來,為該節(jié)點對應的字符串;
  3. 每個節(jié)點的所有子節(jié)點包含的字符都不相同。

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

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

實現(xiàn)的基本功能: 增刪查。

算法解析

首先是結點的參數(shù):

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

下面就是基本功能的實現(xiàn):

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碼值差值,進行數(shù)組的下標存儲
                if (node.nexts[index] == null) {
                    node.nexts[index] = new Node();
                }
                node = node.nexts[index];
                node.pass++; //經(jīng)過這個結點,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中關于字典樹的算法實現(xiàn)的文章就介紹到這了,更多相關Java 字典樹內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java設計模式之享元模式示例詳解

    Java設計模式之享元模式示例詳解

    享元模式(FlyWeight?Pattern),也叫蠅量模式,運用共享技術,有效的支持大量細粒度的對象,享元模式就是池技術的重要實現(xiàn)方式。本文將通過示例詳細講解享元模式,感興趣的可以了解一下
    2022-03-03
  • 詳解Java并發(fā)包中線程池ThreadPoolExecutor

    詳解Java并發(fā)包中線程池ThreadPoolExecutor

    ThreadPoolExecutor是Java語言對于線程池的實現(xiàn)。線程池技術使線程在使用完畢后不回收而是重復利用。如果線程能夠復用,那么我們就可以使用固定數(shù)量的線程來解決并發(fā)問題,這樣一來不僅節(jié)約了系統(tǒng)資源,而且也會減少線程上下文切換的開銷
    2021-06-06
  • Java 全面系統(tǒng)介紹反射的運用

    Java 全面系統(tǒng)介紹反射的運用

    準備入手學習java的安全了,感覺這也是一個大的趨勢,想著盡早進入到java安全的探索中,在反序列化鏈的學習之前,需要先學習反射,不多說了,開干吧
    2022-03-03
  • SpringMVC中的@RequestMapping注解解析

    SpringMVC中的@RequestMapping注解解析

    這篇文章主要介紹了SpringMVC中的@RequestMapping注解解析,SpringMVC使用@RequestMapping注解為控制器指定可以處理哪些?URL?請求,在控制器的類定義及方法定義處都可標注@RequestMapping,需要的朋友可以參考下
    2023-12-12
  • java awt生成簽名圖片如何消除鋸齒化

    java awt生成簽名圖片如何消除鋸齒化

    這篇文章主要介紹了java awt生成簽名圖片如何消除鋸齒化,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring?Boot整合持久層之JdbcTemplate多數(shù)據(jù)源

    Spring?Boot整合持久層之JdbcTemplate多數(shù)據(jù)源

    持久層是JavaEE中訪問數(shù)據(jù)庫的核心操作,SpringBoot中對常見的持久層框架都提供了自動化配置,例如JdbcTemplate、JPA 等,MyBatis 的自動化配置則是MyBatis官方提供的。接下來分別向讀者介紹Spring Boot整合這持久層技術中的整合JdbcTemplate
    2022-08-08
  • Java輕松實現(xiàn)批量插入或刪除Excel行列操作

    Java輕松實現(xiàn)批量插入或刪除Excel行列操作

    在職場生活中,對Excel工作表的行和列進行操作是非常普遍的需求,下面小編就來和大家介紹一下如何在Java中完成批量插入、刪除行和列的操作吧
    2023-10-10
  • java String、Json對象與byte數(shù)組轉換方式

    java String、Json對象與byte數(shù)組轉換方式

    這篇文章主要介紹了java String、Json對象與byte數(shù)組轉換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java中的ReentrantLock解讀

    Java中的ReentrantLock解讀

    這篇文章主要介紹了Java中的ReentrantLock解讀,ReentantLock是java中重入鎖的實現(xiàn),一次只能有一個線程來持有鎖,包含三個內部類,Sync、NonFairSync、FairSync,需要的朋友可以參考下
    2023-09-09
  • 詳解mybatis插入數(shù)據(jù)后返回自增主鍵ID的問題

    詳解mybatis插入數(shù)據(jù)后返回自增主鍵ID的問題

    這篇文章主要介紹了mybatis插入數(shù)據(jù)后返回自增主鍵ID詳解,本文通過場景分析示例代碼相結合給大家介紹的非常詳細,需要的朋友可以參考下
    2021-07-07

最新評論