Pergunta

Então, eu preciso de uma maneira de implementar um não direcionado rede (Eu acho que este é o termo correto) em C#

Digamos que eu tenha os seguintes dados:

Foo1 <-> Bar1
Foo2 <-> Bar1
Foo2 <-> Bar2
Foo2 <-> Bar3
Foo3 <-> Bar2
Foo3 <-> Bar3

Como eu implementaria algo que poderia apoiar isso?

Uma maneira de fazer isso seria criar uma classe contendo um Foo e um bar, e para o meu exemplo eu teria 6 delas, com cada combinação possível, no entanto, isso dobra os dados.

Com esses dados, eu preciso poder executar cálculos no Foo1 com base em quantos bares também apontam, e quantos foo são o ponto do bar também etc.

Não estou procurando uma resposta, prefiro alguma direção sobre como implementar isso, talvez até alguns links.

Foi útil?

Solução

Você basicamente descreveu um modelo de gráfico, tradicionalmente pensado como 'nós' e 'bordas'. Mas os valores mobiliários/empréstimos funcionam.

Existem duas respostas clássicas para esse tipo de coisa.

Depende de quais perguntas você deseja fazer aos seus dados, com que eficiência você deseja armazená -los e quão densos seus dados são.

Se, digamos, 30% das possíveis relações entre valores mobiliários e empréstimos, então uma densa estrutura de dados definitivamente será recompensada. Basta manter uma grande matriz: valores mobiliários em empréstimos X. em Y. (x, y) significa que o empréstimo existe.

Se o conjunto não for muito denso, você começa a usar "estruturas de dados esparsas de borda". Dependendo do seu aplicativo, você pode:

  1. Qualquer objeto S tem uma lista de seu LS.{ S->L,L,L; S->L; S->L,L,L }. Torna muito fácil encontrar os vizinhos de S, mas difícil de encontrar L's

  2. Os objetos s têm uma lista de Ls, LS têm uma lista de S: (S->L,L,L e L->S,S,S). Usa mais espaço, mas oferece consultas diretas.

  3. Armazene um conjunto de apenas (S,L) pares. Muito ruim, a menos que você precise perguntar "isso está e isso está relacionado?"

  4. Armazene uma lista de ambos S,L e L,S e indexá -lo de alguma forma. É isso que queremos dizer com "Faça seu banco de dados fazer o trabalho".

Veja também Estrutura de dados para relacionamentos

Outras dicas

Bem, sem lhe dar uma resposta, pense no que pode ser feito com matrizes bidimensionais e pensar sobre o problema da perspectiva de armazenar informações sobre as bordas.

Isso cheira a um problema de banco de dados relacional para mim. O que você descreveu são duas tabelas com um relacionamento de muitos para muitos. Se essa resposta é apropriada dependerá muito da aparência de seus dados. A sugestão anterior de ter cada objeto contém uma lista do outro objeto é de uma maneira, mas vamos chamar uma pá de pá, este é um banco de dados relacional. Considere usar uma tecnologia como a estrutura ADO.NET ENTITY Framework ou LINQ para definir seus dados como um banco de dados relacional e usar o LINQ para consultar os dados.

Você menciona que está preocupado em dobrar a memória. Novamente, isso depende da aparência dos seus dados do mundo real, mas, a menos que você tenha grandes quantidades de dados, isso provavelmente não será um problema. A única memória desperdiçada é a memória vazia. Use a memória, se ela (a) facilitar o problema de resolver ou (b) fornecer mais flexibilidade. Não otimize a menos que você tenha um problema de desempenho.

Cada classe pode ter uma lista do tipo do outro. Você não duplica os dados dessa maneira, a menos que esteja usando tipos de valor. As referências cruzadas podem fazer vazamentos de memória.

O que Joe disse está no caminho certo. Cada empréstimo teria uma lista de instâncias de segurança e cada segurança teria uma lista de instâncias de empréstimo. O truque é garantir que você nunca tenha um empréstimo que pense que está relacionado a uma segurança, mas essa segurança não concorda. Eu sugeriria permitir adicionar ou remover operações apenas em pares, para garantir que elas sejam feitas em paralelo. Não vejo como isso causaria vazamentos de memória, pois o GC é inteligente o suficiente para lidar com isso. A contagem de referência, por outro lado, não pode lidar com isso sem alguns truques.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top