문제

저는 그래프 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 해야 먼저 실행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top