Как избежать нехватки памяти с помощью Trie by C # - PullRequest
0 голосов
/ 27 июня 2019

как записать миллиарды данных в три с меньшим объемом памяти

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

    public class Node
    {
        public char Value { get; set; }

        public List<Node> Children { get; set; }

        public int Depth { get; set; }

        public string Code { get; set; }

        public bool Terminal { get; set; }

        public Node(char value, int depth)
        {
            Value = value;
            Depth = depth;
            Children = new List<Node>();
        }


        public Node FindChildNode(char c)
        {
            foreach (var child in Children)
                if (child.Value == c)
                    return child;

            return null;
        }


    }

    public class Trie
    {
        private  Node _root;

        public Trie()
        {
            _root = new Node('^',0);
        }

        public Node Prefix(string s)
        {
            var currentNode = _root;
            var result = currentNode;

            foreach (var c in s)
            {
                currentNode = currentNode.FindChildNode(c);
                if (currentNode == null)
                    break;
                result = currentNode;
            }

            return result;
        }



        public void Insert(string randomLength,string code)
        {
            var commonPrefix = Prefix(randomLength);
            var current = commonPrefix;

            for (var i = current.Depth; i < s.Length; i++)
            {
               var newNode = new Node(s[i], current.Depth + 1);
                if (i+1==s.Length)
                {
                    newNode.Terminal = true;
                    newNode.Code = code;
                }
                current.Children.Add(newNode);
                current = newNode;
            }

        }



    }

Trie t = новый Trie ();
t.Insert ( "С", "ABCG00DFD"); Вышеприведенный оператор запускает 1000000000 циклов, и «C» можно заменить другой строкой с разной длиной, так как цикл увеличивается, он выбрасывает исключение памяти, так как его избежать или изменить?

1 Ответ

0 голосов
/ 27 июня 2019

Попробуйте на этом Trie и посмотрите, сможете ли вы заставить его работать на то, что вам нужно:

public class Trie : Dictionary<char, Trie>
{
    public void Add(string value)
    {
        var c = String.IsNullOrEmpty(value) ? '\0' : value[0];
        if (!this.ContainsKey(c))
        {
            this[c] = new Trie();
        }
        if (c != '\0')
        {
            this[c].Add(value.Substring(1));
        }
    }
}
...