Вопрос - что это за стоимость?Что касается памяти, то подход b), вероятно, в конечном итоге потребляет больше памяти, так как в этом списке есть как изменяемые списки, так и целочисленные значения в коробках, а также другая глобальная структура, содержащая все индексы.Кроме того, это, вероятно, будет медленнее, потому что вам потребуется несколько уровней косвенности для достижения соседнего узла.
Одно важное замечание - как только вы начнете хранить целые числа в изменяемых списках, они будут подвергаться боксу.Итак, у вас будет список объектов кучи в обоих случаях.Чтобы избежать этого и, кроме того, сохранить память, в подходе b) вы должны будете хранить динамически растущий массив целых чисел, которые являются индексами соседей.
Теперь, даже если вы измените подход b)как предложено выше, и убедитесь, что индексированный список в классе Network
действительно является эффективной структурой (таблица прямого просмотра или хеш-таблица), вы все равно заплатите непрямую цену, чтобы найти свой Node
.И потребление памяти все равно будет выше.Единственное преимущество, которое я вижу, состоит в том, чтобы хранить какую-то таблицу слабых ссылок, если вы обеспокоены тем, что вам может не хватить памяти, и воссоздать объект Node
, когда вам это нужно, и вы не можете найти его в вашем indexed_list
,сохраняет набор слабых ссылок.
Это, конечно, всего лишь гипотеза, вам придется профилировать / тестировать свой код, чтобы увидеть разницу.
Мое предложение было бы использовать что-токак ArrayBuffer
в Node
и использовать его для хранения прямых ссылок на узлы.
Если проблемы с памятью являются проблемой, и вы хотите использовать b) подход вместе со слабыми ссылками, то я бы также предложилдобавление собственного динамически растущего целочисленного массива для соседей, чтобы избежать объединения с ArrayBuffer[Int]
.