Trie实现地图

时间:2013-02-15 02:18:44

标签: c++ dictionary data-structures trie

我今天正在解决一个问题。但我被困了。我知道trie是如何工作的,但问题是我知道如何使用静态数组和类来实现它。今天在网上冲浪我读到有一种方法可以使用stl :: map实现尝试。我今天试过,但我还是不知道如何在int上插入元素。 这个结构。

Edit1:我正在尝试解决这个问题:spoj.com/problems/TAP2012D 我想知道如何将单词添加到trie中 edit2:我知道地图是如何工作的,我只是不知道地图的特里如何运作。我想要一个了解尝试的人。

这是我到目前为止所做的事情

const int ALPH_SIZE = 26;
using namespace std;

struct trie{
    map<char,int> M;
    int x,y;
    trie();
};

trie T[1000000];


trie::trie()
{
    x=y=0;
}
int maximo;


void addtrie(string palabra)
{
    int tam=palabra.size();
    int pos=0;
    for(int i=0;i<tam;i++)
    {
        if(T[pos].M.find(palabra[i])==T[pos].M.end())
        {
            T[pos].M[palabra[i]]=new trie();
            T[pos].M[palabra[i]]=
        }

    }

}

3 个答案:

答案 0 :(得分:6)

trie节点存储现有out字符的映射,以及指示节点是否与trie中的单词对应的标志。

struct Node
{   map<char, Node*> a;
    bool flag;

    Node() { flag = false; }
};

现在插入类似于您对静态数组所做的操作,除了您在此处使用地图。

void insert(Node *x, string s)
{   for(int i = 0; i < s.size(); i++)
    {   if(x->a.count(s[i]) == 0)
        /* no outgoing edge with label = s[i] so make one */
        {   x->a[ s[i] ] = new Node;
        }
        x = x->a[ s[i] ];
    }
    x->flag = true; /* new word */
}

答案 1 :(得分:1)

在我看来,使用unordered_map更好。

    struct TrieNode {
        char c;
        unordered_map<char, TrieNode*>links;
        bool end;
    };

    TrieNode* insert(TrieNode* root, string word) {
        TrieNode* current  = root;

        for (auto it: word) {
           if (current->links.find(it) == current->links.end()) {
           TrieNode* node = new TrieNode(); // possible memory leak?
           node->c = it;
           node->links = {};
           node->end = false;

           current->links[it] = node;
           }

        current = current->links[it];
       }

    current->end = true;
    return root;
    };

当然,使用new运算符创建的TrieNode可能存在内存泄漏问题。也许某种树遍历(基于DFS)以自下而上的方式访问所有节点并删除它们,可以帮助避免内存泄漏。

答案 2 :(得分:-5)

将元素插入stl :: map的正确方法应按以下方式完成

std::map<char,int> M;


  M.insert ( std::pair<char,int>('aaa',1) );
  M.insert ( std::pair<char,int>('bbb',2) );