를 줄이는 방법은 시간 복잡도?
-
29-09-2020 - |
문제
저는 그래프 G=(V+E)
목록 list Node
는 각 하위는 하위 집합의 V
.I 을 찾으려면 노드의 각 하위 있는지에서 접근할 수 있는 다른 노드의는 하위를 추가 사이에서 가장자리 그 노드입니다.정,Node
=[[1,2,3,4,5,7,8],[9,10],....] 과 하위=[1,2,3,4,5,7,8],{1,7,3,8}에서 연결할 수 있는 서{2,4,5}에서 연결할 수 있도록 서 edge 추가 할 필요가 사 1/7/3/8 및 2/4/5.내가 사용되는 다음과 같다:
for each sublist in Node
SG=node_induced_subgraph(sublist) of G
C=connected_components(SG)
for each component c_i in C
add edge between c_i and c_{i+1}
end
end
의 복잡성 node_induced_subgraph()O(V+E) 의 복잡성 connected_components()O(m+n)#m 은 없습니다.노드 및 n 은 없습니다.의 가장자리에서 그래프
그래서 어떻게 전반적인 복잡성을 줄일 수?
해결책
나소에 있는 당신의 질문에 두 부분으로 구성됩니다.첫 번째을 보장하는 방법은 도달 가능성 간의 노드에서 하나"하위"를 추가한 최소의 가장자리에(있는 경우 추가할 수 있습으로 많은으로 가장자리에 당신은 당신을 통해 갈 수 있는 목록을 연결하는 하나의 요소를 두 개의 이웃소-원가 계산 $O(n)$ 가장자리 또한 작업은 이론적으로는 가장 빠른 방법...).우리가 원하는 경우 추가 몇 가지로 가장자리를 가능한 한 우리가 만을 연결하고자하는"연결된 요소를 사용".나하 그래프 $G$ 으로 저장되 인접 목록입니다.
//reused arrays
visited := bool array of size |V| initialized to false
active := bool array of size |V| initialized to false
//simple dfs
def dfs(node):
if visited[node] or not active[node]: return
visited[node] = true
for child in neighbors(node):
dfs(child)
//algo
def connect_node_list(list):
for node in list: active[node] = true
last := null
for node in list:
if not visited[node]:
dfs(node)
if last != null: add_edge(last,node)
last = node
for node in list:
active[node] = false
visited[node] = false
지금 이 algo 가 런타임의 $O(n+|E|)$ 가 $n$ 의 길이 list
.만 정직하게 그와 같은 당신의 algo 를 강조하고 싶은데 사용하는 bool 어레이는 매우 바람직에 일반;또한 내가 알지 못하는 방법"indcued 를 본다면"방법은-하지만 당신은 피해야 하는 건 그래프입니다.
지금 생각될 수 있는 새로운 기능:을 줄일 수 있습니다수의 하위해 사람들을 연결하는 겹치는 요소입니다.(물론 이것만이 유용하지 않는 경우 반드시 별개입니다.) 사용할 수 있습니다 union 찾 구조 는:
uf := union find structure with |V| elements
for list in sublists:
first = list[0]
for node in list:
uf.unify(first, node)
index := array of length |V|
counter := 0
for element in uf:
index[element] = -1
if uf.parent(element) = element and uf.size(element) > 1:
index[element] = counter
counter++
new_sublists = list of <counter> many lists
for element in uf:
set = uf.find(element)
if index[set] != -1:
new_sublists[index[set]].add(element)
지금 new_sublists 만의 필요한 양을 포함 하위(또한 모든 하위의 크기가 1 인이 제거되).의 절차는 $O(max(|V|N\cdot\alpha(|V|)))$ 가 $N=\sum_i ext{|하위[i]|}$. $\alpha(|V|)$ 할 수 있는 기본적으로 처리되는 일정한할 수 있지만 읽 union 찾 구조 문서입니다.으로 작업하는 경우 많은 겹치는 노드에 목록을 이 algo 해야 먼저 실행됩니다.