선형 시간에 슈퍼 스타를 찾는 방법?


28

유 방향 그래프를 고려하십시오. 우리는 다른 노드에 도달 할 수없는 경우에만 노드 수퍼 스타를 호출 하지만 다른 모든 노드에는 있습니다. 공식적으로 :vv v

v superstar :⟺outdeg(v)=0indeg(v)=n1

함께 그래프의 노드 수있다. 예를 들어 아래 그래프에서 채워지지 않은 노드는 슈퍼 스타이며 다른 노드는 그렇지 않습니다.n

슈퍼 스타
[ 출처 ]

시간에 지시 된 그래프에서 모든 수퍼 스타를 어떻게 식별 할 수 있습니까? 적절한 그래프 표현은 일반적인 후보들 로부터 선택 될 수있다 ; 문제의 복잡성을 전처리로 옮기는 표현을 사용하지 마십시오.O(n)

밀도에 관한 가정은 할 수 없습니다. 그래프에 슈퍼 스타가 있다고 가정하지 않습니다. 없는 경우 알고리즘이이를 인식해야합니다.

표기법 : 는 노드의 발신 에지 수이며 은 수신 에지와 유사합니다.I N D 전자 goutdegindeg


1
가 모서리 인 곳에 가 허용 됩니까, 아니면 각 정점에서 모서리 만 봐야 합니까? (K) O ( 1 )O(n+k)kO(1)
Kevin

@Kevin 아니요, 은 엄격한 요구 사항입니다. 두 번째 질문에 관해서는 : 나는 그것이 필요한지도 모르지만 더 이상 할 수는 없습니다. O(n)
Raphael

답을 알고 있습니까? 에서 할 수 있습니까 ? O(n)
Dave Clarke

@DaveClarke : 그렇습니다.
Raphael

표현을 더 제한해야합니다. 인접 목록에는 선형 알고리즘을 사용할 수 없습니다 (정점이 수퍼 스타임을 확인하기 위해 각 정점에서 전체 목록을 검토해야 할 수도 있음).
Gilles 'SO- 악의를 멈춰라'

답변:


18

검사 하는 각 모서리에 대해 하나의 가능성을 제거 할 수 있으므로 모서리 의 존재를 확인하여 정점 중 하나를 제외한 모든 꼭지점을 제거 할 수 있습니다. 에지에서가 존재하는 경우, 특히, XY는 , 우리는 제거 X 행에 이동 및 Y를 (다른 정점 그것으로부터 도달 할 수있는 바와 같이); 그렇지 않은 경우, 우리는 y 를 제거합니다 ( x 에서 도달 할 수 없기 때문에 ). 마지막 정점에 도달하면 제거되지 않은 정점을 서로 다른 정점과 비교해야합니다 (수퍼 스타 조건이 유지되도록해야합니다. 일부 의사 코드 :n1xyxyyx

vertex superstar(graph g)
    current vertex = first
    # Go through each vertex
    for each subsequent vertex in g ("next")
        # If there's an edge from this to the next, we eliminate this one [move to the new one].
        # If not, we just stay here.
        if edge exists from current to next
            candidate = next
        end if
    end for
    # Now we are on the final remaining candidate, check whether it satisfies the requirements.
    # just a rename for clarity
    candidate = current
    for each other vertex in g
        if edge from current to other exists
            return null 
        else if no edge from other to current
            return null
        end if
    end for
    return candidate
end superstar

방법을 설명하기 위해 예제를 살펴 보겠습니다. 소스 정점이 상단에 있고 대상이 측면에있는이 배열을 가져옵니다. 1은 가장자리를 나타냅니다.

12341101210131114110

잠재적 슈퍼 스타로 배제한 정점을 회색으로 표시하겠습니다. 초록색과 빨간색을 사용하여보고자하는 가장자리를 표시하고 가장자리를 포함하지 않을 때는 파란색을, 파란색은 이미 본 위치를 나타냅니다.

정점 1과 2를 살펴 보는 것으로 시작합니다.

12341101210131114110
녹색 숫자는 2에서 1까지의 모서리가 있음을 나타내므로 2를 제거하고 모서리를 찾습니다 3에서 1까지 :

12341101210131114110

우리는 그러한 가장자리가 없다는 것을 알기 때문에 1을 제거하고 3을 현재 정점으로 사용합니다. 2를 이미 제거 했으므로 4에서 3까지의 모서리가 있는지 확인하십시오.

12341101210131114110

4에서 3까지의 모서리가 있으므로 4를 제거합니다.이 시점에서 정점 중 하나 (3)를 제외한 나머지를 모두 제거 했으므로 모서리를 확인하고 적합한 지 확인하십시오.

12341101210131114110

1에서 3까지의 모서리가 있지만 그 반대는 아니므로 3은 여전히 ​​후보입니다.

12341101210131114110

2에서 3까지의 모서리가 있지만 그 반대는 아니므로 3은 여전히 ​​후보입니다.

12341101210131114110

가장자리는 4 ~ 3이지만 3 ~ 4는 아닙니다. 3의 모서리를 확인한 결과 실제로 슈퍼 스타임을 알았습니다.

우리는 먼저 각각의 슈퍼 가능한 하나 개 정점 제거 이후 에지 검사, 최상의 경우가 있다는 것이다 번째 수표의 복잡성에 대한 최종 정점 제거 . 최악의 경우 (마지막 또는 두 번째-마지막 정점은 수퍼 스타이거나 최종 검사에서 자격을 상실합니다) 첫 번째 비교 후 후보를 더 많은 정점과 비교합니다. 최악의 경우 복잡도는 ( )입니다. 따라서이 알고리즘은 입니다.n n n 1 2 × ( n 1 ) 3 n 3 O ( n ) Θ ( n )n1nnn12×(n1)3n3O(n)Θ(n)


8

이것이 유명인 문제가 아닙니까?

하나의 슈퍼 스타 (연예인)가 하나만있을 것입니다.

우리는 인접 행렬 표현을 사용하여 여기서 에서 지시 된 에지가있는 경우 행 , 그렇지 않은 경우는 . (허용되는 것 같아요).A[i,j]=1ij0

( 시간에 수행 할 수 있음) 를 살펴보면 유명인의 후보로서 이들 중 하나 이상을 제거 할 수 있습니다. 이면 그런 다음 를 제거 할 수 있습니다 . 경우 우리는 제거 할 수 .O ( 1 ) A [ i , j ] = 1 i A [ i , j ] = 0 jA[i,j]O(1)A[i,j]=1iA[i,j]=0j

현재 후보 목록을 하나씩 유지 관리하십시오. 연결된 목록으로 충분합니다.

결국, 후보자가 실제로 슈퍼 스타인지 확인할 수 있습니다.

이 알고리즘은 입니다.O(n)


일정한 시간에 적합한 를 어떻게 선택 합니까? (i,j)
Raphael

3
@Raphael : 링크 된 목록에서 처음 두 후보를 선택하십시오. (머리와 머리-> 다음).
Aryabhata

6

이 답변은 현재 버전의 질문이 아니라 그래프 표현이 가능한 질문의 버전을 설명합니다.

  • 그래프를 인접 목록과 역 인접 목록의 쌍으로 저장하십시오. 여기서 각 목록에는 목록의 길이와 함께 가장자리 및 가장자리가 각각 포함됩니다.

  • 전처리 : 역 인접 목록 (즉, 에지의 목록)을 계산합니다. 비용 .O(|E|)

  • 목록을 탐색하고 아웃 에지 수가 이고 인 에지 수가 노드를 선택하십시오 . 비용 .n 1 O ( | N | )0n1O(|N|)


좋아, 나는 그래프 표현 을 허용 하는 것이 너무 약하다는 것을 알았다 . 나는 그 질문을 내가 의도 한대로 제한했다.
Raphael

2

참고로 이것은 Kevin이 게시 한 재귀 버전의 의사 코드입니다.

superstar(V, E) {
  if ( |V| == 1 ) {
    return V.pop
  }

  a = V.pop
  b = V.pop
  if ( (a,b) ∈ E ) {
    no_ss = a
    keep  = b
  }
  else {
    no_ss = b
    keep = a
  }

  s = superstar(V ++ keep)

  return ( s != null && (no_ss, s) ∈ E && !(s, no_ss) ∈ E ) ? s : null
}

hasSuperstar(V, E) = superstar(V, E) != null
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.