最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

前言

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

字典樹有3個(gè)基本性質(zhì):

  1. 根節(jié)點(diǎn)不包含字符,其余的每個(gè)節(jié)點(diǎn)都包含一個(gè)字符;
  2. 從根節(jié)點(diǎn)到某一節(jié)點(diǎn),路徑上經(jīng)過(guò)的字符連接起來(lái),為該節(jié)點(diǎn)對(duì)應(yīng)的字符串;
  3. 每個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)包含的字符都不相同。

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

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

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

算法解析

首先是結(jié)點(diǎn)的參數(shù):

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

下面就是基本功能的實(shí)現(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("該字典樹有這個(gè)" + s + " 單詞");
        }

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

        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'; //以相應(yīng)的ASCII碼值差值,進(jìn)行數(shù)組的下標(biāo)存儲(chǔ)
                if (node.nexts[index] == null) {
                    node.nexts[index] = new Node();
                }
                node = node.nexts[index];
                node.pass++; //經(jīng)過(guò)這個(gè)結(jié)點(diǎn),pass就加1
            }
            node.end++;
        }

        //刪除
        public void delWord(String str) {
            //刪除之前,應(yīng)該查詢一下這顆樹有沒(méi)有這個(gè)單詞
            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; //返回最后那一個(gè)結(jié)點(diǎn)的end值即可
        }
    }
}

到此這篇關(guān)于Java中關(guān)于字典樹的算法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java 字典樹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java DWR內(nèi)存泄漏問(wèn)題解決方案

    Java DWR內(nèi)存泄漏問(wèn)題解決方案

    這篇文章主要介紹了Java DWR內(nèi)存泄漏問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • SpringMVC---配置與使用的示例

    SpringMVC---配置與使用的示例

    這篇文章主要介紹了SpringMVC---配置與使用的示例,幫助大家更好的理解和學(xué)習(xí)spring框架,感興趣的朋友可以了解下
    2020-10-10
  • 深入理解Java class文件格式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    深入理解Java class文件格式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    對(duì)于理解JVM和深入理解Java語(yǔ)言, 學(xué)習(xí)并了解class文件的格式都是必須要掌握的功課
    2017-06-06
  • JAVA發(fā)送HTTP請(qǐng)求的四種方式總結(jié)

    JAVA發(fā)送HTTP請(qǐng)求的四種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于JAVA發(fā)送HTTP請(qǐng)求的多種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • RabbitMQ消息有效期與死信的處理過(guò)程

    RabbitMQ消息有效期與死信的處理過(guò)程

    利用DLX,當(dāng)消息在一個(gè)隊(duì)列中變成死信?(dead?message)?之后,它能被重新publish到另一個(gè)Exchange,這個(gè)Exchange就是DLX,本文重點(diǎn)給大家介紹RabbitMQ消息有效期與死信的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • Kotlin基礎(chǔ)教程之伴生對(duì)象,getter,setter,內(nèi)部,局部,匿名類,可變參數(shù)

    Kotlin基礎(chǔ)教程之伴生對(duì)象,getter,setter,內(nèi)部,局部,匿名類,可變參數(shù)

    這篇文章主要介紹了Kotlin基礎(chǔ)教程之伴生對(duì)象,getter,setter,內(nèi)部,局部,匿名類,可變參數(shù)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • springboot 使用yml配置文件自定義屬性的操作代碼

    springboot 使用yml配置文件自定義屬性的操作代碼

    在SpringBoot中yml/yaml文件可以自定義一些屬性,以供注入給自定義bean對(duì)象的屬性,主要通過(guò)空格和層次來(lái)實(shí)現(xiàn),類似于python代碼,本文通過(guò)實(shí)例代碼給大家介紹springboot 使用yml配置文件自定義屬性,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解

    Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解

    這篇文章主要介紹了Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Struts2源碼分析之ParametersInterceptor攔截器

    Struts2源碼分析之ParametersInterceptor攔截器

    這篇文章主要介紹了Struts2源碼分析之ParametersInterceptor攔截器,ParametersInterceptor攔截器其主要功能是把ActionContext中的請(qǐng)求參數(shù)設(shè)置到ValueStack中,,需要的朋友可以參考下
    2019-06-06
  • Mybatis-plus插入后返回元素id的問(wèn)題

    Mybatis-plus插入后返回元素id的問(wèn)題

    這篇文章主要介紹了Mybatis-plus插入后返回元素id的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評(píng)論

南江县| 商河县| 河西区| 和林格尔县| 湖北省| 时尚| 梓潼县| 瓦房店市| 天柱县| 高碑店市| 资中县| 肇州县| 宝坻区| 浦城县| 荔波县| 农安县| 永新县| 类乌齐县| 福州市| 平舆县| 宁远县| 攀枝花市| 永靖县| 张北县| 大宁县| 普兰店市| 呼伦贝尔市| 济南市| 丽水市| 大安市| 二连浩特市| 克什克腾旗| 邳州市| 辽宁省| 焉耆| 大丰市| 锡林郭勒盟| 新绛县| 同仁县| 华坪县| 新乡县|