Ця відповідь стосується не лише C ++, оскільки все, що згадується, стосується самих структур даних, незалежно від мови. І моя відповідь передбачає, що ви знаєте основну структуру списків та матриць суміжності.
Пам'ять
Якщо пам'ять є вашою основною проблемою, ви можете дотримуватися цієї формули для простого графіка, який дозволяє циклів:
Матриця суміжності займає n 2 /8 байт простору (один біт на вході).
Список суміжності займає 8е простір, де e - кількість ребер (32-бітний комп'ютер).
Якщо визначити щільність графіка як d = e / n 2 (кількість ребер, розділене на максимальну кількість ребер), ми можемо знайти «точку розриву», де список займає більше пам’яті, ніж матриця:
8e> п 2 /8 при д> 1/64
Тож із цими числами (все ще 32-бітовими) точка перелому припадає на 1/64 . Якщо щільність (e / n 2 ) більша за 1/64, то матриця краща, якщо ви хочете зберегти пам'ять.
Про це ви можете прочитати на wikipedia (стаття про матриці суміжності) та багатьох інших сайтах.
Бічна примітка : можна підвищити ефективність простору матриці суміжності, використовуючи хеш-таблицю, де ключі - пара вершин (лише непряме).
Ітерація та пошук
Списки суміжності - це компактний спосіб представлення лише існуючих країв. Однак це відбувається за рахунок можливо повільного пошуку конкретних країв. Оскільки кожен список дорівнює мірі вершини, найгіршим часом пошуку для перевірки конкретного краю може стати O (n), якщо список не має порядку. Однак пошук сусідів вершини стає тривіальним, і для розрідженого або невеликого графіка вартість ітерації через списки суміжності може бути незначною.
Матриці суміжності, з іншого боку, використовують більше місця для забезпечення постійного часу пошуку. Оскільки кожен можливий запис існує, ви можете перевірити наявність краю в постійному часі за допомогою індексів. Однак пошук сусідів займає O (n), оскільки вам потрібно перевірити всіх можливих сусідів. Очевидним недоліком простору є те, що для розріджених графіків додається багато прокладки. Див. Обговорення в пам'яті вище для отримання додаткової інформації про це.
Якщо ви все ще не впевнені, що використовувати : Більшість проблем у реальному світі створюють рідкісні та / або великі графіки, які краще підходять для представлення списку суміжності. Вони можуть здатися складнішими для впровадження, але я запевняю вас, що їх немає, і коли ви пишете BFS або DFS і хочете отримати всі сусіди вузла, вони просто в одному рядку коду. Однак зауважте, що я взагалі не рекламую списки суміжності.