그래프가 희소 한 경우 목록을 사용 하고 그래프가 밀도 가 높은 경우 행렬을 사용하겠다고 들었습니다 . 나를 위해, 그것은 단지 원시 정의입니다. 나는 그 이상을 보지 못합니다. 언제 자연스럽게 선택해야하는지 명확히 할 수 있습니까?
미리 감사드립니다!
그래프가 희소 한 경우 목록을 사용 하고 그래프가 밀도 가 높은 경우 행렬을 사용하겠다고 들었습니다 . 나를 위해, 그것은 단지 원시 정의입니다. 나는 그 이상을 보지 못합니다. 언제 자연스럽게 선택해야하는지 명확히 할 수 있습니까?
미리 감사드립니다!
답변:
우선 희소 는 가장자리가 거의 없음을 의미 하고, 밀도 는 많은 가장자리 또는 거의 완전한 그래프를 의미합니다. 완전한 그래프에서 edge를 가지며, 여기서 n 은 노드 수입니다.
이제 행렬 표현을 사용할 때 노드 연결 정보를 저장하기 위해 행렬을 할당 합니다. 예를 들어 노드 i 와 j 사이에 가장자리가 있으면 M [ i ] [ j ] = 1 이고 , 그렇지 않으면 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 단위로 걸릴 수 있습니다 .
간단한 유추를 제공하여 대답하기 위해. 6oz의 물을 저장해야한다면, 5 갤런 용기 또는 8oz 컵으로 그렇게 하시겠습니까?
이제 질문으로 돌아갑니다. 행렬의 대부분이 비어 있으면 왜 사용합니까? 대신 각 값을 나열하십시오. 그러나 목록이 실제로 긴 경우 행렬을 사용하여 요약하지 않는 이유 는 무엇입니까?
목록과 행렬의 추론은 실제로이 경우 간단합니다.
P.S. a list is really just a single column matrix!!! (trying to show you just how arbitrary of a decision/scenario this is)
Consider a graph with nodes and edges. Ignoring low-order terms, a bit matrix for a graph uses bits no matter how many edges there are.
How many bits do you actually need, though?
Assuming that edges are independent, the number of graphs with nodes and edges is . The minimum number of bits required to store this subset is .
We will assume without loss of generality that , that is, that half or fewer of the edges are present. If this is not the case, we can store the set of "non-edges" instead.
If , , so the matrix representation is asymptotically optimal. If , using Stirling's approximation and a little arithmetic, we find:
If you consider that is the size of an integer which can represent a node index, the optimal representation is an array of node ids, that is, an array of pairs of node indexes.
Having said that, a good measure of sparsity is the entropy, which is also the number of bits per edge of the optimal representation. If is the probability that an edge is present, the entropy is . For , the entropy is 2 (i.e. two bits per edge in the optimal representation), and the graph is dense. If the entropy is significantly greater than 2, and in particular if it's close to the size of a pointer, the graph is sparse.