Мені сказали, що ми будемо використовувати список, якщо графік розріджений, а матрицю, якщо графік щільний . Для мене це просто сире визначення. Я не бачу багато за цим. Чи можете ви уточнити, коли це був би природний вибір?
Спасибі заздалегідь!
Мені сказали, що ми будемо використовувати список, якщо графік розріджений, а матрицю, якщо графік щільний . Для мене це просто сире визначення. Я не бачу багато за цим. Чи можете ви уточнити, коли це був би природний вибір?
Спасибі заздалегідь!
Відповіді:
Перш за все зауважте, що розріджений означає, що у вас дуже мало ребер, а щільний означає багато ребер або майже повний графік. У повному графіку у вас ребер, де - кількість вузлів.n
Тепер, коли ми використовуємо матричне подання, ми виділяємо матрицю для зберігання інформації про з'єднання вузла, наприклад, якщо між вузлами та є край , інакше .
Але якщо ми використовуємо список суміжності, то у нас є масив вузлів, і кожен вузол вказує на свій список суміжності, що містить ТОЛЬКІ сусідні вузли .M [ i ] [ j ] = 1 i j M [ i ] [ j ] = 0
Тепер, якщо графік є рідким, і ми використовуємо матричне подання, то більшість матричних комірок залишаються невикористаними, що призводить до втрати пам'яті. Таким чином, ми зазвичай не використовуємо матричне подання для розріджених графіків. Ми віддаємо перевагу списку суміжності.
Але якщо графік щільний, то кількість ребер близько до (повного) , або до якщо графік спрямований з самокрутками. Тоді немає переваги використовувати список суміжності над матрицею.n 2
З точки зору складності
простору Матриця суміжності:
Список суміжності:
де - кількість вузлів, - кількість ребер.O ( n + m ) n m
Коли дерево є
непрямим деревом, тоді матриця суміжності:
Список суміжності: є (краще, ніж )O ( n + n ) O ( n ) n 2
Коли графік спрямований, повний, із самозаймами, тоді
матриця суміжності:
Список суміжності: є (різниці немає)O ( n + n 2 ) O ( n 2 )
І нарешті, коли ви реалізуєте за допомогою матриці, перевірка наявності краю між двома вузлами займає разів, тоді як зі списком суміжності це може зайняти лінійний час у .n
Відповісти, запропонувавши просту аналогію. Якби вам довелося зберігати 6 унцій води, чи не зробили б ви це (взагалі кажучи) з контейнером на 5 галонів або з чашкою 8 унцій?
Тепер, повертаючись до свого питання .. Якщо більшість вашої матриці порожня, то навіщо її використовувати? Просто перелічіть кожне значення замість цього. Однак якщо ваш список дійсно довгий, чому б не просто використати матрицю, щоб згустити його?
Міркування за списком проти матриці насправді в цьому випадку прості.
PS список справді просто матриця однієї колонки !!! (намагаюся показати вам, наскільки це довільне рішення / сценарій)
Розглянемо графік з вузлами та ребрами. Ігноруючи умови низького порядку, бітова матриця для графіка використовує біт незалежно від кількості ребер.E N 2
Скільки бітів вам насправді потрібно?
Якщо припустити, що краї є незалежними, кількість графіків з вузлами та ребрами дорівнює . Мінімальна кількість бітів, необхідних для зберігання цього підмножини, є .E ( N 2 журнал2 ( N2)
Будемо вважати без втрати спільності, що , тобто, що половина або менше ребер є. Якщо це не так, ми можемо замість цього зберегти набір "не-ребер".
Якщо , , тож матричне подання є асимптотично оптимальним. Якщо , використовуючи наближення Стірлінга та трохи арифметики, знаходимо:
Якщо ви вважаєте, що - це розмір цілого числа, яке може представляти індекс вузла, оптимальне представлення - це масив ідентифікаторів вузла, тобто масив пар індексів вузлів.
Сказавши це, хорошим показником розрідженості є ентропія, яка також є кількістю бітів на край оптимального подання. Якщо є ймовірність наявності ребра, ентропія . Для ентропія дорівнює 2 (тобто два біти на край в оптимальному поданні), а графік щільний. Якщо ентропія значно більша за 2, і, особливо, якщо вона близька до розміру вказівника, графік є рідким.