模板 - 数据结构 - Trie

房东的猫 提交于 2019-12-04 11:32:43

使用静态数组的nxt指针的设计,大概比使用map作为nxt指针的设计要快1倍,但空间花费大概也大1倍。在数据量小的情况下,时间和空间效率都不及map<vector,int>。map<vector,int>的最坏情况下效率为O(nlogn*len),而Trie的效率为O(n*len),但是实际上测出来还是map快一点,有可能在vector实际比较的时候很快就得出大小了。

struct TrieNode {
    int data;
    int nxt[26];

    void init() {
        data = 0;
        memset(nxt, 0, sizeof(nxt));
    }
};

struct Trie {
    TrieNode tn[200005];
    int root, top;

    int newnode() {
        tn[++top].init();
        return top;
    }

    void init() {
        top = 0;
        root = newnode();
    }

    void insert(int *a, int len, int data) {
        int cur = root;
        for(int i = 1; i <= len; ++i) {
            int &nxt = tn[cur].nxt[a[i] - 'a'];
            if(!nxt)
                nxt = newnode();
            cur = nxt;
        }
        tn[cur].data = data;
    }

    int query(int *a, int len) {
        int cur = root;
        for(int i = 1; i <= len; ++i) {
            int &nxt = tn[cur].nxt[a[i] - 'a'];
            if(!nxt)
                return -1;
            cur = nxt;
        }
        return tn[cur].data;
    }
} trie;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!