zoukankan      html  css  js  c++  java
  • 字典树 一种高速插入查询数据结构

    定义

    字典树,又称单词查找树,Trie树,是一种树形结构。典型应用是用于统计。排序和保存大量的字符串,所以常常被搜索引擎系统用于文本词频统计。

    它的长处是:利用字符串的公共前缀来节约存储空间,最大限度的降低无谓的字符串比較,查询效率比哈希表高。

    解释

    这里写图片描写叙述
    这个图片比較经典
    就是在每一次边存的是字符,点标记着个点是否之前的边的字符都存在
    如图存在的字符串有 abc abcd abd。

    。。。

    代码

    #include <cstdio>  
    #include <cstring>  
    #include <algorithm>  
    #include <string>  
    using namespace std;  
    int cnt;  
    struct  node  
    {  
        int id;  
        int prefix;//记录前缀个数  
        node *next[26];//指向字典树下一层。假设全是小写字母是26这视情乱而定  
        node(){  
            for(int i=0;i<26;i++)  
            next[i]=NULL;  
            id =0;  
            prefix=0;  
        }//初始化  
    }*root;  
    
    int  Insert(char *s){  
        int len =strlen (s);  
        node *p= root;  
        for(int i=0;i<len;i++){  
            int k=s[i]-'a';  
            if(p->next[k]==NULL){  
                p->next[k]=new node();  
            }  
            p=p->next[k];  
            p->prefix++;  
        }  
        if(p->id==0)  
        return p->id=++cnt;  
        return p->id;  
    }//插入并分配id  
    
    int  find(char s[]){  
        int len =strlen(s);  
        node *p =root;  
        for(int i=0;i<len;i++){  
            p=p->next[s[i]-'a'];  
        }  
        return p->prefix;  
    }//查找此前缀是多少人的前缀  
    
    int x;//记录总共同拥有多少字符串參与了排序  
    int all[200];//记录排好序的id  
    
    void output(node *p){  
          if(p!=NULL){  
               if(p->id!=0){  
                    all[x++]=p->id;  
                }  
            for(int i=0;i<26;i++){  
    
                if(p->next[i]){  
                output(p->next[i]);  
                }  
            }  
          }  
    }//字符串排序  
    int main(){  
        cnt =0;  
        root =new node();  
        char s[100][100];  
        char s2[100][100];  
        int n;  
        scanf("%d",&n);  
        for(int i=0;i<n;i++){  
            scanf("%s",s[i]);  
            printf("%d
    ",Insert(s[i]));  
            strcpy(s2[Insert(s[i])],s[i]);  
        }  
        for(int i=0;i<n;i++){  
            printf("%d
    ",find(s[i]));  
        }  
        /*排序后*/  
        x=0;  
        output(root);  
        printf("%d
    ",x);  
        for(int i=0;i<x;i++){  
            printf("%d %s
    ",all[i],s2[all[i]]);  
        }  
    
    }  

    一些题及其代码 戳我

  • 相关阅读:
    VS10的一个问题
    有关开发的配置的有用信息
    管理Fragments(转)
    消除SDK更新时的“https://dl-ssl.google.com refused”异常--(转)
    JAVA字符串编码转换常用类
    在 Android 中调用二进制可执行程序(native executable )
    Android NDK 下的宽字符编码转换及icu库的使用(转)
    Linux字符编码转换 UTF8转GB3212
    一键生成JNI头文件方法二
    eclipse中创建NDK和JNI开发环境最简单配置方法
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7163312.html
Copyright © 2011-2022 走看看