Я думаю, що ваш перший приклад трохи неоднозначний - вузли як об’єкти, а ребра як вказівники. Ви можете відстежувати їх, зберігаючи лише вказівник на якийсь кореневий вузол, і в цьому випадку доступ до даного вузла може бути неефективним (скажімо, ви хочете вузол 4 - якщо об’єкт вузла не наданий, можливо, доведеться його шукати) . У цьому випадку ви також втратите частини графіку, недоступні з кореневого вузла. Я думаю, що це той випадок, коли припускає f64 rainbow, коли він каже, що складність часу для доступу до даного вузла становить O (n).
В іншому випадку ви також можете зберегти масив (або хеш-карту), повний покажчиків на кожен вузол. Це дозволяє O (1) отримати доступ до даного вузла, але трохи збільшує використання пам'яті. Якщо n - кількість вузлів, а e - кількість ребер, просторова складність цього підходу буде O (n + e).
Складність простору для матричного підходу буде уздовж лінії O (n ^ 2) (припускаючи, що ребра односпрямовані). Якщо ваш графік розріджений, у вашій матриці буде багато порожніх комірок. Але якщо ваш графік повністю зв’язаний (e = n ^ 2), це вигідно порівняно з першим підходом. Як каже RG, у вас також може бути менше помилок кеш-пам’яті при такому підході, якщо ви виділите матрицю як один шматок пам’яті, що може зробити швидше дотримання багатьох ребер навколо графіка.
Третій підхід є, мабуть, найефективнішим у більшості випадків - O (e) - але робить пошук усіх країв даного вузла клопотом O (e). Я не можу подумати про випадок, коли це було б дуже корисно.