LINUX.ORG.RU

Сохранение в файл. Связи между объектами.


0

1

Есть набор из нескольких тысяч объектов. У каждого объекта есть связи с другим объектами из набора, причём связи взаимные. Как бы вы реализовали запись и сохранение таких связей?

Пока представляется так: нумеруем все объекты от 0 до N, сохраняем в виде: номер_объекта параметры_объекта номера_привязанных_объектов. При загрузке делаем обратную операцию, то есть добавляем все объекты, запоминая соответствия адресов в памяти и номеров объектов, после чего преобразуем во всех объектах номера привязанных объектов в адреса в памяти.

Есть ещё варианты?

★★★★★
Ответ на: комментарий от annoynimous

Точно, спасибо.

А вот если связи не взаимные (другой случай), то тут уже как в топике написал надо делать?

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

+сую матрицу инцедентности, но сохранял бы её в сжатом виде
ссылка на объект ссылка на объект
ссылка на объект ссылка на объект
...

будет работать в случае несимметричной матрицы (невзаимных связей)

backbone ★★★★★
()
Ответ на: комментарий от Obey-Kun

> А вот если связи не взаимные (другой случай), то тут уже как в топике написал надо делать?

Если связи не взаимные, то можно просто иначе заполнить Conndectivity Matrix.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от backbone

> +сую матрицу инцедентности, но сохранял бы её в сжатом виде

Тут QDataStream, так что будет просто сохранение QList<QList<bool> >, а оно QDataStream сожмёт.

Obey-Kun ★★★★★
() автор топика

А если mmap'ить область памяти, в которую вы записываете объекты, в файл, а связи с другими объектами задавать указателями относительно начала этой области памяти?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Obey-Kun

Т.е. неориентированные и ориентированный графы не слышал?

Строишь матрицу смежности.

con_matrx[i][j] = 1; - есть ребро между i, j вершинами.

Если con_matrx[i][j] = con_matrx[j][i] = 1 - то объекты зависят друг от друга.

anonymous
()
Ответ на: комментарий от anonymous

Упрощённый случай. Есть объекты типа A, есть объекты типа B. Каждый объект типа B хранит в себе указатель на один объект типа A.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> Т.е. неориентированные и ориентированный графы не слышал?

Я вообще про графы только мочкой уха слышал :).

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от backbone

> зато будет возможность редактировать файл, не перезаписывая сами объекты

в моём случае ни к чему.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

объект1:

объект2, объект3;-перечислены зависящие от объект1

объект2:

объект4, объект3;

...

Так?

anonymous
()
Ответ на: комментарий от anonymous

Это к вопросу топика? Тогда твоё решение не подходит. Ведь если объект 2 есть в списке зависимостей объекта 1, то объект 1 должен быть в списке зависимостей объекта 2.ни туда, ни туда

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

так anonymous Ваш метод и продиктовал, нет?

Ваш вариант предусматривает оба типа связей, но он избыточен в случае неориентированного графа.

backbone ★★★★★
()
Ответ на: комментарий от Obey-Kun

Можно добавить.

Это своеобразная оптимизация матрицы смежности, когда объектов много, а связей мало(все зависит от ситуации).

Зачем нужен адрес объекта, если между ними уже установлено соответствие?

(id, тип объекта, состояние) - достаточно, чтобы восстановить объект.

Т.к. подразумеваются циклы, то нужно будет создать все объекты, а дальше актуализировать ссылки по связям.

У тебя же A зависит от B означает, что у A есть ссылка на B? А взаимная связь, что они имею ссылки на друг друга?

anonymous
()
Ответ на: комментарий от anonymous

У меня объекты в большинстве случаев выстроены в двухмерную сетку, то есть почти у каждого объекта есть по 4 связи (объект сверху, снизу, слева и справа), так что такая оптимизация не в тему будет, наверное...

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

n^2 или 5*n? Экономия очевидна.

anonymous
()
Ответ на: комментарий от anonymous

Блин, значит я не понял, что ты предлагаешь.

Давай так, у меня есть объекты A B C D.

A ссылается на B C D.

B ссылается на A C.

C ссылается на A B D.

D ссылается на A C.

Как ты хочешь это представить?

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

[здесь ссылка на связаные с id_a]->[id_b][id_c][id_d] [здесь ссылка на связаные с id_b]->[id_a][id_c] [здесь ссылка на связаные с id_c]->[id_a][id_b][id_d] [здесь ссылка на связаные с id_d]->[id_a][id_c]

[code=c]

unsigned int **array_communication;

array_communication = malloc(n * sizeof(*array_communication)); /* количество объектов */

..

array_communication[i] = malloc(k * sizeof(**array_communication)); /* количество связанных */ .. [/code]

индекс массива - номер объекта. В массиве ссылки на массивы, в котором лежат связанных с ним номера объектов.

anonymous
()
Ответ на: комментарий от anonymous

> Строишь матрицу смежности.

Поищи ещё на тему «Сильно разреженные матрицы», «Сильно разреженные матрицы смежности».
(там, где в них много нулей)

pacify ★★★★★
()
Ответ на: комментарий от Obey-Kun

Собсно, вопросом является то, как именно представить этот массив связей.

У каждого объекта есть уникальный идентификатор. Пускай для простоты это будет индекс объекта в массиве.

Каждая связь будет описываться: [индекс элемента1],[индекс элемента2],[вспомогательные данные]. Я думаю понятно, что здесь мы описали связь «элемент1 --> элемент2».

pathfinder ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.