Возвращать несколько узлов при поиске дерева / дерева? - PullRequest
3 голосов
/ 17 марта 2012

Я построил три суффикса, дерево, содержащее все суффиксы строки, где каждый узел содержит только один символ, с SuffixNode в конце каждого пути, который содержит местоположения суффиксов в строке.

Допустим, в моем дереве содержатся слова "Cat", "Car" и "Can", и я хочу найти "Ca", в результате должно быть возвращено 3 суффиксных узла, поскольку строка поиска находится в 3 разных местах. Мне удалось найти в дереве «Ca», но как только я дошел до этой точки, я не знаю, как продолжить обход дочерних узлов «a», чтобы найти все суффиксные узлы.

Я думал об использовании какой-либо коллекции для добавления узлов суффикса и затем возврата коллекции. Имеет ли этот подход смысл или есть лучшие решения?

Я решил проблему поиска ниже. Причина, по которой он не возвращал какие-либо узлы, связана с созданием дерева и различиями между узлами:

public void SearchTrie(Node parent, String s, List<SuffixNode> suffixes)
    {
        Node n = FindNode(parent, s);
        FindSuffixes(n, suffixes);
    }

    private void FindSuffixes(Node parent,List<SuffixNode> suffixes)
    {            
        if (parent is SuffixNode)
        {
            suffixes.Add((SuffixNode)parent);
        }
        else
        {
            foreach (KeyValuePair<char, Node> child in parent.children)
            {
                FindSuffixes(child.Value, suffixes);
            }
        }
    }

    private Node FindNode(Node parent, String s)
    {
        if ((s.Length == 1) && parent.children.ContainsKey(s[0]))
        {
            Node n = parent.children[s[0]];
            return n;
        }

        while (s[0].ToString() != "")
        {
            if (parent.children.ContainsKey(s[0]))
            {
                if ((s.Length > 1))
                {
                    return FindNode(parent.children[s[0]], s.Substring(1));
                }

            }
            else
            {
                break;
            }

        }

        return null;
    }

Node:

class Node
{
    public char label;
    public Node parent;
    public Dictionary<char,Node> children;

    public Node(Node NewParent, char NewLabel)
    {
        this.parent = NewParent;
        this.label = NewLabel;
        children=new Dictionary<char,Node>();
    }
}

1 Ответ

3 голосов
/ 17 марта 2012

Я думал об использовании какой-либо коллекции для добавления узлов суффикса и затем возврата коллекции.

Это был бы первый выбор.

... или есть лучшие решения?

Существуют и другие решения, например

.
  • заполнение списка, предоставленного абонентом
  • использовать блок итератора с yield return

Но без особых требований заполните List<string> и верните его как IEnumerable<string>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...