Думаю хеш не очень практичен, тк порядок перебора вершин может отличаться что бывает не очень удобно
Если считаешь, что можно так хранить, то провёл бы эксперимент и показал в отчёт можно или нет и если можно, то какой от этого плюс/минус.
У меня была такая мысль:
static class Program
{
[STAThread]
static void Main()
{
int end = 2000000;
DateTime start = DateTime.Now;
Hashtable graph = new Hashtable();
for (int i = 0; i < end; i++)
{
Element element = new Element();
element.ribs = new List<int>();
for (int j = 0; j < rand.Next(1,4); j++)
{
int rib = rand.Next(0, end + 1);
if (!element.ribs.Contains(rib) && rib != i)
element.ribs.Add(rib);
}
graph.Add(i, element);
}
Console.WriteLine("Init " + end + " elements " + (DateTime.Now - start));
start = DateTime.Now;
for (int i = 0; i < end; i++)
{
int nr = rand.Next(0, end + 1);
if (graph.Contains(nr))
((Element)graph[nr]).ribs.Add(0);
}
Console.WriteLine("Search of " + end + " elements " + (DateTime.Now - start));
Console.ReadKey();
}
static Random rand = new Random();
}
struct Element
{
public List<int> ribs;
}
Да, так можно, с простыми объектами всё ок, а для сложных нужно делать кастомный Hashtable. Ещё из всего кода не понравилась строчка:
for (int j = 0; j < rand.Next(1,4); j++)
я бы лучше записал:
int rnd = rand.Next(1,4);
for (int j = 0; j < rnd; j++)
а то при первой итерации будет:
j = 0; j < к примеру 3
на след итерации:
j = 1; j < уже к примеру 1
и тем самым рандом будет каждую итерацию вычисляться, это можно проверить при дебаге, по крайней мере когда-то так было, сейчас надо уточнить в дебаге, будет возможность, обязательно проверю, но чтобы быть уверенным, лучше не использовать в теле цикла for рандом или переменные, в которых может поменяться значение в процессе итерации. Если в этом нет необходимости по логике.