美文网首页
字典树试学

字典树试学

作者: Celia_QAQ | 来源:发表于2019-04-27 19:20 被阅读0次

网址:计蒜客:字典树试学
trie树:

const int MAX_N = 10000;  // Trie 树上的最大结点数
struct Trie {
    int ch[MAX_N][26];  // ch 保存了每个结点的 26 个可能的子结点编号,26 对应着 26 种小写字母,也就是说,插入的字符串全部由小写字母组成。初始全部为 -1
    int tot;  // 总结点个数,初始为 0
    int cnt[MAX_N];  // 每个结点

    void init() {  // 初始化 Trie 树
        tot = 0;
        memset(cnt, 0, sizeof(cnt));
        memset(ch, -1, sizeof(ch));
    }
};

插入:

void insert(char *str) {
    int p = 0;  // 从根结点(0)出发
    for (int i = 0; str[i]; ++i) {
        if (ch[p][str[i] - 'a'] == -1) {  // 该子结点不存在
            ch[p][str[i] - 'a'] = ++tot;  // 新增结点
        } 
        p = ch[p][str[i] - 'a'];  // 在 Trie 树上继续插入字符串 str
    }
    cnt[p]++;
}

查询:

int find(char *str) {  // 返回字符串 str 的出现次数
    int p = 0;
    for (int i = 0; str[i]; ++i) {
        if (ch[p][str[i] - 'a'] == -1) {
            return 0;
        }
        p = ch[p][str[i] - 'a'];
    }
    return cnt[p];
}

完整代码:

const int MAX_N = 10000;  // Trie 树上的最大结点数
const int MAX_C = 26;  // 每个结点的子结点个数上限
struct Trie {
    int ch[MAX_N][MAX_C];  // ch 保存了每个结点的 26 个可能的子结点编号,26 对应着 26 种小写字母,也就是说,插入的字符串全部由小写字母组成。初始全部为 -1
    int tot;  // 总结点个数(不含根结点),初始为 0
    int cnt[MAX_N];  // 以当前结点为终端结点的 Trie 树中的字符串个数

    void init() {  // 初始化 Trie 树,根结点编号始终为 0
        tot = 0;
        memset(cnt, 0, sizeof(cnt));
        memset(ch, -1, sizeof(ch));
    }

    void insert(char *str) {
        int p = 0;  // 从根结点(0)出发
        for (int i = 0; str[i]; ++i) {
            if (ch[p][str[i] - 'a'] == -1) {  // 该子结点不存在
                ch[p][str[i] - 'a'] = ++tot;  // 新增结点
            } 
            p = ch[p][str[i] - 'a'];  // 在 Trie 树上继续插入字符串 str
        }
        cnt[p]++;
    }

    int find(char *str) {  // 返回字符串 str 的出现次数
        int p = 0;
        for (int i = 0; str[i]; ++i) {
            if (ch[p][str[i] - 'a'] == -1) {
                return 0;
            }
            p = ch[p][str[i] - 'a'];
        }
        return cnt[p];
    }
};

初始动态分配:

const int MAX_N = 10000;  // Trie 树上的最大结点数
const int MAX_C = 26;  // 每个结点的子结点个数上限
struct Trie {
    int *ch[MAX_N];  // ch 保存了每个结点的 26 个可能的子结点编号,26 对应着 26 种小写字母,也就是说,插入的字符串全部由小写字母组成。初始全部为 -1
    int tot;  // 总结点个数(不含根结点),初始为 0
    int cnt[MAX_N];  // 以当前结点为终端结点的 Trie 树中的字符串个数

    void init() {  // 初始化 Trie 树,根结点编号始终为 0
        tot = 0;
        memset(cnt, 0, sizeof(cnt));
        memset(ch, 0, sizeof(ch));  // 将 ch 中的元素初始化为 NULL
    }

    void insert(char *str) {
        int p = 0;  // 从根结点(0)出发
        for (int i = 0; str[i]; ++i) {
            if (ch[p] == NULL) {
                ch[p] = new int[MAX_C];  // 只有 p 当包含子结点的时候才去开辟 ch[p] 的空间
                memset(ch[p], -1, sizeof(int) * MAX_C);  // 初始化为 -1
            }
            if (ch[p][str[i] - 'a'] == -1) {  // 该子结点不存在
                ch[p][str[i] - 'a'] = ++tot;  // 新增结点
            } 
            p = ch[p][str[i] - 'a'];  // 在 Trie 树上继续插入字符串 str
        }
        cnt[p]++;
    }

    int find(char *str) {  // 返回字符串 str 的出现次数
        int p = 0;
        for (int i = 0; str[i]; ++i) {
            if (ch[p][str[i] - 'a'] == -1) {
                return 0;
            }
            p = ch[p][str[i] - 'a'];
        }
        return cnt[p];
    }
};

例题:
一串英文名按字典序从小到大输出

char now[MAX_LEN];
void dfs(int p, int len) {
    if (cnt[p] > 0) {
        now[len] = '\0';
        while (cnt[p] --> 0) {
            cout << now << endl;
        }
    }
    for (int i = 0; i < 26; ++i) {
        if (ch[p][i]) {
            now[len] = 'a' + i;
            dfs(ch[p][i], len + 1);
        }
    }
}

相关文章

  • 字典树试学

    网址:计蒜客:字典树试学trie树: 插入: 查询: 完整代码: 初始动态分配: 例题:一串英文名按字典序从小到大输出

  • 2019-03-31字典树Tire

    字典树图示 字典树案例

  • 2019-09-29

    今天我们学的是语文数学,语文学的是学字典部首查字法,语文还考了试,数学学的是乘法!

  • Trie

    字典树 01字典树

  • (六)树结构---字典树

    1.字典树基础 1.1.字典树 字典树又称前缀树,对于一个字符串在加入字典树结构时,会合并相同的字符,字典树是一种...

  • 字典树

  • 字典树

    需求: 判断文本中是否包含某个词, 以及词频问题:中文分词实际使用的词典往往在几十万个词以上,逐个匹配成本太大。方...

  • 字典树

    功能 字典树是用数组存储大量字符串的一种算法 字典树算法开辟空间非常大,但是对于字符串插入和查询有很快的速度 用法...

  • 字典树

    UVA 11488题目链接https://uva.onlinejudge.org/index.php?option...

  • 字典树

    应用场景: 又称“单词查找树”,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但...

网友评论

      本文标题:字典树试学

      本文链接:https://www.haomeiwen.com/subject/xoxlnqtx.html