Диапазон элементов с быстрым доступом двумя клавишами - PullRequest
1 голос
/ 10 марта 2012

У меня есть эти данные для сохранения в переменной для моего базового моделирования нейронной сети.

  • Node (NodeId, State)
  • Отношение (SourceNodeId, TargetNodeId, Weight, State)

Состояние - это уровень активации, который является единственным значением, которое изменяется во время симуляции. Это число без знака.

Я хочу легко получить все входящие и все исходящие отношения для текущего узла. Под легкостью я подразумеваю очень хорошую производительность. (У меня около 1000000 узлов с каждыми 50 отношениями в среднем.)

Основная часть моей программы выглядит следующим образом (псевдокод).

foreach(Node in Nodes)
{
     Inputs[] = all incomeing relationships;
     Node.State = sum of all Inputs[] elements;

     Outputs[] = all outgoing relationships;
     normalize all Outputs[] elements temporarly; // so that the sum of their weights is 1

     foreach(Output in Outputs[])
     {
          Output.State = Node.State * Output.Weight;
     }
}

Надеюсь, вы понимаете, что я хочу сделать. Если нет, я постараюсь объяснить лучше.

Какой тип объекта лучше всего иметь быстрый доступ к узлам по их SourceNodeId и по их TargetNodeId?

PS: программирование на C # с использованием Visual Studio.

1 Ответ

0 голосов
/ 10 марта 2012

Я думаю, что список с узлами + два синхронизированных словаря будет быстрым.

List<Node> allNodes;
Dictionary<Node,List<Node>> sourceTarget;
Dictionary<Node,List<Node>> targetSource;

Я рекомендую вам заключить их в один объект ... Двусторонний словарь :

class TwoWayDictionary<T1,T2>
{
    private Dictionary<T1,List<T2>> sourceTarget;
    private Dictionary<T2,List<T1>> targetSource;

    // Here shold be public methods and accessors ...
}
...