2015-01-31 5 views
-1

Я выполняю следующую задачу (в C#): У нас есть группа букв и английский словарь. Найдите все возможные комбинации слов, которые создаются из предоставленных букв. Для этого я использую структуру данных trie - я ищу слова и все возможные дополнительные слова из оставшихся букв (рекурсивная операция). Тем не менее, операция занимает очень много времени/пространства. Любая идея, как справиться с этим более эффективно?Trie - найти все возможные предложения

EDIT Это пример кода я подготовил:

class Trie 
    { 
     private Node root = new Node(null); 

     public void AddWord(string word) 
     { 
      root.Add(word, 0); 
     } 

     public void GetCandidates(string input) 
     { 
      var results = new List<Result>() 
      { 
       new Result() {Rest = input} 
      }; 

      Get(results); 
     } 

     private void Get(List<Result> results) 
     { 
      foreach (var result in results.Where(r => !string.IsNullOrEmpty(r.Rest)).ToList()) 
      { 
       var pattern = result.Rest.Replace(" ", string.Empty); 

       var allWords = new List<Result>(); 
       root.GetWord(string.Empty, allWords, pattern); 
       result.OhterWords = allWords; 

       Get(allWords); 
      } 


     } 
    } 

    class Node 
    { 
     protected Dictionary<char,Node> children = new Dictionary<char, Node>(); 

     public bool End { get; private set; } 

     public char? Key { get; private set; } 

     public Node(char? key) 
     { 
      Key = key; 
     } 

     public void Add(string word, int index) 
     { 
      var letter = word[index]; 
      if (!children.ContainsKey(letter)) 
      { 
       children.Add(letter, new Node(letter)); 

      } 

      var nextIndex = index + 1; 
      if (nextIndex < word.Length) 
      { 
       children[letter].Add(word, nextIndex); 
      } 
      else 
      { 
       children[letter].End = true; 
      } 
     } 

     public virtual void GetWord(string current, List<Result> allWords, string availableLetters) 
     { 
      var newCurrent = string.Concat(current, Key); 
      if (End) 
      { 
       var result = new Result() 
       { 
        Rest = availableLetters, 
        Word = newCurrent, 
       }; 


       if (!allWords.Contains(result)) 
       { 
        allWords.Add(result); 
       } 
      } 

      foreach (var letter in availableLetters) 
      { 
       if (children.ContainsKey(letter)) 
       { 
        var index = availableLetters.IndexOf(letter); 
        var tempAvailableString = availableLetters.Remove(index, 1); 
        children[letter].GetWord(newCurrent, allWords, tempAvailableString); 
       } 
      } 
     } 
    } 

    class Result 
    { 
     public List<Result> OhterWords { get; set; } 

     public string Word { get; set; } 

     public string Rest { get; set; } 

     public override bool Equals(object obj) 
     { 
      var r = obj as Result; 
      if (r == null) 
      { 
       return false; 
      } 

      return r.Word == Word && r.Rest == Rest; 
     } 
    } 
+0

Вы можете указать пример кода, чтобы показать нам, что у вас есть на данный момент? – kevin

+2

Вы должны опубликовать свой код или, по крайней мере, объяснить алгоритм, который вы используете более четко. Мы не знаем, почему операция занимает время/пространство, пока мы не поймем, как вы выполняете операцию. – Jacob

+0

Кроме того, вы говорите, что это занимает много места; не могли бы вы показать нам, как вы храните трю? – Jacob

ответ

0

Вы можете попробовать Ахо-corasick алгоритм. Он использует trie, а также суффикс и альтернативные структуры данных trie.

Смежные вопросы