Добре, якщо про ефективність простору все, що вам важливо, тоді найкраще буде стисла структура даних - але, звичайно, це не дуже ефективно для доступу чи оновлення .....
Якщо ваш графік має відносно невелику кількість вузлів і досить щільний (скажімо, щонайменше 5% усіх можливих з'єднань), то, можливо, ви можете вважати, що для створення матриці суміжності більш просторовим є використання, ніж використання крайових списків. Для цього знадобиться лише один біт на можливе (спрямоване) з'єднання, і n * n біт усього, де у вас n вузлів.
В іншому випадку, якщо вам потрібно використовувати сусідні посилання, то ви не можете легко зробити краще, ніж одне посилання на посилання, оскільки це мінімальний інформаційний вміст, який потрібно зберігати. Якщо ви хочете зворотних посилань, вам знадобиться вдвічі більше посилань.
Є кілька хитрощів, які ви можете спробувати на цьому. Наприклад, ви можете спробувати поділитися підмножинами посилань (якщо A і B посилаються на кожен з C, D, E, тоді зберігайте лише список посилань C, D, E .....). Однак це складеться досить швидко, і я сумніваюся, що варто докласти зусиль у більшості випадків.
Ще один трюк - якщо припустити, що ваш графік має достатню кількість вузлів, ви, безумовно, заощадите простір шляхом індексації - наприклад, використовуючи 16-бітний номер індексу вузла, а не повний покажчик / посилання.