Графична матрица за съседство (с примери за кодове в C ++, Java и Python)

В този урок ще научите какво представлява матрица на съседство. Също така ще намерите работни примери за матрица на съседство в C, C ++, Java и Python.

Матрицата на съседство е начин за представяне на графика G = (V, E) като матрица на булеви числа.

Представяне на матрица на съседство

Размерът на матрицата е VxVкъдето Vе броят на върховете в графиката, а стойността на записа Aijе 1 или 0 в зависимост от това дали има ръб от връх i до връх j.

Пример за матрица на съседство

Изображението по-долу показва графика и нейната еквивалентна матрица за съседство.

Матрица на съседство от графика

В случай на неориентирани графики, матрицата е симетрична по отношение на диагонала поради всеки ръб (i,j), има и ръб (j,i).

Плюсове на матрицата за съседство

Основните операции като добавяне на ръб, премахване на ръб и проверка дали има ръб от връх i до връх j са изключително ефективни във времето, постоянни времеви операции.

Ако графиката е плътна и броят на ръбовете е голям, матрицата на съседство трябва да бъде първият избор. Дори ако графиката и матрицата за съседство са оскъдни, можем да я представим, като използваме структури от данни за оскъдни матрици.

Най-голямото предимство обаче идва от използването на матрици. Последният напредък в хардуера ни позволява да изпълняваме дори скъпи матрични операции на графичния процесор.

Чрез извършване на операции върху съседната матрица можем да получим важни прозрения за същността на графиката и връзката между нейните върхове.

Недостатъци на матрицата на съседство

Изискването за VxVпространство на матрицата на съседство го прави свиня на паметта. Графиките в дивата природа обикновено нямат твърде много връзки и това е основната причина списъците за съседство да са по-добрият избор за повечето задачи.

Докато основните операции са лесни, операциите харесват inEdgesи outEdgesса скъпи, когато се използва представяне на матрицата на съседство.

Примери за Python, Java и C / C ++

Ако знаете как да създадете двумерни масиви, вие също знаете как да създадете матрица на съседство.

Python Java C C +
 # Adjacency Matrix representation in Python class Graph(object): # Initialize the matrix def __init__(self, size): self.adjMatrix = () for i in range(size): self.adjMatrix.append((0 for i in range(size))) self.size = size # Add edges def add_edge(self, v1, v2): if v1 == v2: print("Same vertex %d and %d" % (v1, v2)) self.adjMatrix(v1)(v2) = 1 self.adjMatrix(v2)(v1) = 1 # Remove edges def remove_edge(self, v1, v2): if self.adjMatrix(v1)(v2) == 0: print("No edge between %d and %d" % (v1, v2)) return self.adjMatrix(v1)(v2) = 0 self.adjMatrix(v2)(v1) = 0 def __len__(self): return self.size # Print the matrix def print_matrix(self): for row in self.adjMatrix: for val in row: print('(:4)'.format(val)), print def main(): g = Graph(5) g.add_edge(0, 1) g.add_edge(0, 2) g.add_edge(1, 2) g.add_edge(2, 0) g.add_edge(2, 3) g.print_matrix() if __name__ == '__main__': main()
 // Adjacency Matrix representation in Java public class Graph ( private boolean adjMatrix()(); private int numVertices; // Initialize the matrix public Graph(int numVertices) ( this.numVertices = numVertices; adjMatrix = new boolean(numVertices)(numVertices); ) // Add edges public void addEdge(int i, int j) ( adjMatrix(i)(j) = true; adjMatrix(j)(i) = true; ) // Remove edges public void removeEdge(int i, int j) ( adjMatrix(i)(j) = false; adjMatrix(j)(i) = false; ) // Print the matrix public String toString() ( StringBuilder s = new StringBuilder(); for (int i = 0; i < numVertices; i++) ( s.append(i + ": "); for (boolean j : adjMatrix(i)) ( s.append((j ? 1 : 0) + " "); ) s.append(""); ) return s.toString(); ) public static void main(String args()) ( Graph g = new Graph(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); System.out.print(g.toString()); ) )
 // Adjacency Matrix representation in C #include #define V 4 // Initialize the matrix to zero void init(int arr()(V)) ( int i, j; for (i = 0; i < V; i++) for (j = 0; j < V; j++) arr(i)(j) = 0; ) // Add edges void addEdge(int arr()(V), int i, int j) ( arr(i)(j) = 1; arr(j)(i) = 1; ) // Print the matrix void printAdjMatrix(int arr()(V)) ( int i, j; for (i = 0; i < V; i++) ( printf("%d: ", i); for (j = 0; j < V; j++) ( printf("%d ", arr(i)(j)); ) printf(""); ) ) int main() ( int adjMatrix(V)(V); init(adjMatrix); addEdge(adjMatrix, 0, 1); addEdge(adjMatrix, 0, 2); addEdge(adjMatrix, 1, 2); addEdge(adjMatrix, 2, 0); addEdge(adjMatrix, 2, 3); printAdjMatrix(adjMatrix); return 0; )
 // Adjacency Matrix representation in C++ #include using namespace std; class Graph ( private: bool** adjMatrix; int numVertices; public: // Initialize the matrix to zero Graph(int numVertices) ( this->numVertices = numVertices; adjMatrix = new bool*(numVertices); for (int i = 0; i < numVertices; i++) ( adjMatrix(i) = new bool(numVertices); for (int j = 0; j < numVertices; j++) adjMatrix(i)(j) = false; ) ) // Add edges void addEdge(int i, int j) ( adjMatrix(i)(j) = true; adjMatrix(j)(i) = true; ) // Remove edges void removeEdge(int i, int j) ( adjMatrix(i)(j) = false; adjMatrix(j)(i) = false; ) // Print the martix void toString() ( for (int i = 0; i < numVertices; i++) ( cout << i << " : "; for (int j = 0; j < numVertices; j++) cout << adjMatrix(i)(j) << " "; cout << ""; ) ) ~Graph() ( for (int i = 0; i < numVertices; i++) delete() adjMatrix(i); delete() adjMatrix; ) ); int main() ( Graph g(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); g.toString(); )

Матрични приложения за съседство

  1. Създаване на маршрутна таблица в мрежи
  2. Навигационни задачи

Интересни статии...