zoukankan      html  css  js  c++  java
  • 字典树以及模板

         字典树又称为单词查找树。用于统计排序大量字符串(不限于字符串),利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。字典树的性质:

       1.根节点不包含任何字符(空根节点)

       2.从根节点到某一节点路径上的字符连起来就是一个字符串

       3.每个节点的所有子节点包含的字符串不相同。

    一般的每一个节点需要一个统计量count,来记录当前前缀重复的次数。每个节点还可以用一个布尔变量标记当前节点是否构成单词。Trie主要操作有插入单词,删除单词,查找单词。

    #define _CRT_SECURE_NO_DEPRECATE
    #include<iostream>
    using namespace std;
    int const MAXN = 26;
    struct TrieNode{
    	TrieNode(){      //构造函数,包含初始化
    		memset(next, 0, sizeof(next));
    		exist = false;
    		count = 0;
    	}
    	TrieNode*next[MAXN];
    	bool exist;  //记录当前节点是否构成单词
    	int count;  //记录当前前缀重复次数
    };
    TrieNode *root = new TrieNode;
    void Insert(char *str){
    	TrieNode*p = root;
    	while (*str != ''){
    		int id = *(str++) - 'a';
    		if (p->next[id] == NULL)
    			p->next[id] = new TrieNode;
    		p = p->next[id];
    		p->count++;
    	}
    	p->exist = true;   //串的最后一个节点标志为构成单词
    }
    //查询单词
    bool Search(char*str){
    	TrieNode*p = root;
    	while (*str != ''){
    		int id = *(str++) - 'a';
    		if (p->next[id] == NULL)  //节点不存在
    			return NULL;
    		p = p->next[id];
    	}
    	return p->exist;   //返回是否存在单词
    }
    //删除一个单词
    void Delete(char*str){
    	//确保树中原来一定含该单词
    	TrieNode*p = root;
    	while (*str != ''){
    		int id = *(str++) - 'a';
    		p = p->next[id];
    		p->count--;
    	}
    	p->exist = false;   //串的最后一个节点标志为构
    }
    //删除一颗字典树
    void Delete(TrieNode*T){
    	if (T){
    		for (int i = 0; i < MAXN; i++)
    			Delete(T->next[i]);
    		free(T);
    		T = NULL;
    	}
    }
    

      

  • 相关阅读:
    JS判断数组中是否有重复元素的方法
    根据类名找到元素
    JS获取页面元素并修改
    JS实现会动的小车
    动态规划------最长公共子串(连续)
    动态规划------最长递增子序列
    买卖股票的最佳时期
    操作系统清华大学版笔记(十一)死锁、银行家算法和进程间通信(直接通信、间接通信)
    128 最长连续序列
    链表------删除有序单链表中重复的节点
  • 原文地址:https://www.cnblogs.com/td15980891505/p/5745959.html
Copyright © 2011-2022 走看看