인피 마로 부분적으로 정렬 된 우선 순위에 대한 우선 순위 큐


16

나는 우선 순위가 복합 형이고 일부만 정렬 된 객체를 가지고 있습니다 . 이 우선 순위에 따라 객체를 선택해야합니다 (즉, 매번 최소 항목 생성 ). 그러나 임의로 주문을 완료하는 대신 큐가 안정된 경우 최소 요소가 두 개 이상인 경우 가장 오래된 요소를 먼저 반환해야합니다.

부분 순서와 작동하는 힙 데이터 구조가 있습니까? 또는 일반 우선 순위 대기열을 수정하여 작업합니까? 필요한 알고리즘에 대한 일반적인 선택은 간단한 이진 또는 4 진 힙이지만 부분 순서로는 작동하지 않습니다.

우선 순위 값은 다음을 지원합니다.

  1. 작업을 사용한 부분 순서 . 부분 순서이므로 ab 는 false이고 ba 는 false 일 수도 있습니다. 나는 쓰기 ̸ 그 경우입니다.a⋚̸b
  2. y y x i n O ( n )inf(xi)yyxinO(n)
  3. 부분 순서에 대한 선형 확장을 정의 할 수 있습니다. 알고리즘이 그런 식으로 작동하므로 우선 순위 대기열에 사용하는 것이 쉬운 방법입니다. 그러나 순서는 성능에 영향을 미치며 삽입 순서는 최악의 경우를 피하는 것이 가장 좋습니다.

또한 이것을 사용하려는 알고리즘은 대기열의 모든 우선 순위를 파악해야합니다.

우선 순위는 실제 의미를 갖지만 변경 될 수 있으므로 다른 속성에 의존 할 수는 없습니다.


참고 : 이진 힙은 부분 순서로 작동하지 않습니다. a , bc 로 이진 힙을 가정합니다 c. 여기서 aca⋚̸ba⋚̸c 입니다. 순서대로 배치되므로

     a (0)
   /   \
 b (1)   c (2)

이제 d 가 삽입되었습니다. 다음 자유 위치는 b 의 왼쪽 자식 인 3 b이므로

        a (0)
      /   \
    b (1)   c (2)
  /
d (3)

경우 (의미하는 이행 성에서, 그러나에 대해 아무것도 말하지 않는다 와 )와 , 다음 함께 교환되지 않습니다 는 이하이기 때문에. 그러나 실제로는 보다 작지만 비교되지 않으므로 주 힙 불변은 유지되지 않습니다. 최고는 최소가 아닙니다.d c d b d ̸ b d b adadcdbd⋚̸bdba

나는 이항 힙 스타일의 힙 포리스트가 작동 할 수 있다고 생각합니다. 기본적으로 항상 새로운 값을 루트와 비교하고 비교 가능한 요소 만 함께 연결하는 것이 중요합니다. 따라서 포리스트의 트리가 임의의 크기로 만들어 지므로 힙에서 서로 비교할 수없는 세트 수에 따라 복잡성이 달라집니다. 다소 복잡성을 해결할 수 없다고 생각합니다 (비슷한 요소에 도달 할 때까지 비교를 계속해야합니다). 내가 놓친 것일 수도 있으므로 이것을 열어 둡니다.


참고 : 순서는 부분적 이며 선형 확장을 정의하는 방법이 있지만 타임 스탬프를 추가하고이를 보조 기준으로 사용하는 것은 그 중 하나 가 아닙니다 . 우리는 타임 스탬프에 할당한다고 가정 각 상기 순서 정의 로서 IFF 또는 ( 및 . 그런 다음 우리는 별개 있다고 가정 , , , 등 그 및 . 그런 다음 와a a b a b b a t ( a ) t ( b ) a b c t ( a ) t ( b ) t ( c ) c a a bt(a)aababbat(a)t(b)abct(a)t(b)t(c)caabbc 이지만 이므로 관계는 전 이적이지 않으므로 순서가 아닙니다. 이러한 종류의 확장은 약한 주문에만 적용되지만 부분적인 주문에는 적용되지 않습니다.ca


편집 : 나는 정의 된 집합에 충실하지 않을뿐만 아니라 실제로 대기열에있는 요소를 효율적으로 얻을 수 있어야한다는 것을 깨달았습니다. 따라서 하위 힙을 포함하는 특수 노드를 공통 힙 구조에 추가하는 것이 도움이 될지 여부를 고려하고 있습니다.


인덱싱 된 우선 순위 큐를 고려 했습니까?

@ hulkmeister : 대기열을 색인화하여 부분 순서로 작동시키는 방법을 설명해 주시겠습니까? (일반 바이너리 힙은 부분 순서로 작동하지 않습니다)?

1
내 생각에는 두 항목을 비교할 수 없을 때 색인을 사용하여 삽입 순서를 추적 할 수 있다고 생각했습니다. 따라서 인덱스로 우선 순위를 구성하면 우선 순위가 아닌 경우에도 비슷한 고유 키가 있습니다. 이것이 원하는 것처럼 들리면 완전한 답을 넣을 수 있습니다.

1
@ hulkmeister : 글쎄, 문제는 그것보다 훨씬 더 깊다. 새 항목이 삽입되면 우선 순위 큐는 일반적으로 항목을 일부 요소와 비교합니다. 그러나 비교할 수없는 경우 삽입 할 위치를 모릅니다. 인덱스가 변경되고 어쨌든 우선 순위와 일치하는 총 정렬을 제공하지 않기 때문에 인덱스와의 명확성이 작동하지 않습니다.

이 복합 유형의 예와 비교할 수없는 경우를 제시 할 수 있습니까? 이 '비교할 수없는'값을 동일하게 고려할 수 있습니까? 그렇다면 삽입 순서대로 동일한 노드에 저장할 수 있습니다.

답변:


3

원래 질문에 제기 된 정확한 문제는 어려운 것처럼 보이지만 (그리고 나는 그 문제에 대한 해결책, 특히 infima 찾기 부분에 관심이있을 것입니다). 부분적으로 순서가 지정된 세트가 실제로 제품 순서를 사용하는 벡터로 구성되어 있고 우선 순위 대기열이 부분 순서와 "호환되는"순서로 값을 반환한다고 보장하는 것으로 충분하다면 즉, 작은 요소는 항상 큰 요소보다 먼저 반환됩니다), 그렇게하는 쉬운 방법이 있습니다.

아이디어는 본질적으로 부분적으로 정렬 된 세트의 토폴로지 순서를 찾는 것입니다. 즉, 총 순서 ' '이므로 abT . 제품 주문을 사용하는 벡터의 경우 이것은 매우 쉽습니다 : 사전 식 순서 'S '를 사용하십시오. 여기서 첫 번째 "구성 요소"는 제품 주문에 사용 된 모든 구성 요소의 합계입니다 (나머지 구성 요소는 본질적으로 임의의 따라서 약한 순서를 고수 할 수도 있습니다). 우리는 그 볼 수 < B를abaTbS a = b

a<bi(aibi) and i(ai<bi)(iai)<(ibi)aSb
따라서 그B
a=bi(ai=bi)(iai)=(ibi)aSb,
. 따라서 우선 순위 대기열과 함께이 순서를 사용할 수 있으며 더 큰 요소보다 작은 요소 (제품 순서로)를 항상 추출 할 수 있습니다.abaSb

더 많은 옵션이 있습니다. 최소, 최대의 성분 중 하나를 사용하고, 음이 아닌 계수를 가진 선형 조합을 사용하십시오. 확장의 선택은 오버레이 알고리즘의 속도에 영향을줍니다.
Jan Hudec

2

부분 주문을 완료하는 데 어떤 문제가 있습니까?

그러나 임의로 주문을 완료하는 대신 큐가 안정된 경우 최소 요소가 두 개 이상인 경우 가장 오래된 요소를 먼저 반환해야합니다.

'가장 오래된 것'을 선호하면 주문이 효과적으로 완료됩니다. '비교할 수없는'항목은 연령별로 비교할 수 있습니다.

각 항목에 타임 스탬프 (또는 기타 단조 증가하는 정수)를 추가하고 '실제'비교가 불가능한 경우 사용하십시오.


3
부분 순서의 선형 확장이 가능하다면 좋을 것입니다. 그러나 그렇지 않습니다. 가자는 순서에 삽입 3 개 고유 값이 , B , C 와 같은 것을, C가 ≤B가 하나와 비교할 수있다. 타임 스탬프가있는 확장은 a ≤ 'bb ≤'c를 채 웁니다 . 따라서 transitivity에서 ac 보다 작아야 하지만 실제 순서와 모순됩니다.

아마도 당신은 그것을 약한 순서와 혼동했을 것입니다. 약한 순서로 비교할 수없는 요소는 동등 클래스를 형성하므로 임의의 추가 기준을 추가 할 수 있습니다. 부분 주문의 경우 할 수 없습니다.

1

편집 : 이것은 흥미로운 문제인 것 같습니다. 그리고 그것에 대해 약간의 연구가있었습니다. 나는 당신이 다음을 읽을 것을 제안합니다 :

  1. 대럴 레이몬드 University of Waterloo의 박사 학위 논문의 일부 주문 데이터베이스.

Daskalakis, Constantinos, et al. "포셋에서 정렬 및 선택." SIAM Journal on Computing 40.3 (2011) : 597-622.

저자는 여기에 poset과 체인 으로의 체인 분해를 허용하는 ChainMerge라는 데이터 구조를 제시합니다 . 상기 데이터 구조의 크기는 O ( N에서 Q ) . 저자는 O ( w n ) 에서 실행되는 최소값을 찾기위한 알고리즘을 제시합니다. 여기서 w 는 포셋 너비의 상한입니다. .. 나는 이것이 흥미로울 것이라고 생각했다.qO(nq)O(wn)w

참고 : 이전 순진한 답변을 삭제했습니다. 그것을 보려면 편집을 클릭하십시오.


0

용어를 잘못 사용했을 수 있습니다. 찾은 문제를 해결하려면 답변을 직접 수정하십시오.


먼저 입력에서 서로 비교할 수없는 세트를 감지해야합니다.

예를 들어, 5 개의 객체가있을 수 a, b, c, d, e있지만 부분 순서는 두 개의 연결이 끊어진 그래프를 형성합니다.

  • a ≤ b ≤ c
  • d ≤ e
  • 그러나 어느 것도 어느 {a, b, c}것과도 비교할 수 없습니다 {d, e}.

객체를 적절한 데이터 구조에 저장하려면 먼저 서로 비교할 수없는 세트를 먼저 감지해야합니다. 이것은 Union find 알고리즘 으로 수행 할 수 있습니다


효율성을 높이려면 새 개체를 삽입 할 때 "이 새 개체와 비슷한 기존 개체 목록"을 찾는 효율적인 방법이 필요합니다.


이제 각 하위 집합 내 (각각 {a, b, c}{d, e}) 내 에서 최소값을 잘 정의해야합니다. (각 서브 세트마다 부분 순서로 인해 하나 이상의 최소값 이있을 수 있습니다 .)

나는 이것을 방향성 비순환 그래프 로 본다 . 그것을 힙에 맞추려고 노력하는 것은 비참한 것 같습니다.


이 복합 데이터 구조에서 최소값을 추출하려면 다음 단계는 모든 서브 세트에서 모든 최소값 목록을 가져 와서 시간 소인이 가장 빠른 것을 선택하고이 오브젝트를 제거하고 리턴하는 것입니다.


불행히도 필자는 비슷한 객체 목록을 효율적으로 찾는 방법을 찾지 못했습니다.

부분적으로 정렬 된 세트는 실제로 방향성 비순환 그래프로 볼 수 있습니다. 그러나 하나는 인접 목록이 아닌 인접 테이블 (실제로 기능)로 제공됩니다. 인접 목록에 의해 주어진 poset의 최소값을 찾는 것은 쉽지만, 인접 테이블의 경우 문제가됩니다.

Minima는 원본 세트에도 잘 정의되어 있습니다. 연결된 구성 요소를 찾는 것이 완전한 그래프가 아니기 때문에 어떻게 도움이 될 수 있는지 모르겠습니다.

1
Hasse 다이어그램은 단항 트리 (동일한 경로 그래프)의 포리스트라고 가정하지만 질문은 이미 제품 순서이므로 다차원 격자라고합니다.
피터 테일러

0

내가 작업중 인 프로젝트에는 비슷한 문제가 있습니다 (우연히 벡터의 일부 순서를 사용하고 있습니다). 우리는 이미 무작위로 정렬 된리스트를 정렬하기위한 2 차 시간 알고리즘을 가지고 있었고, 하나의 객체 만 고장 났을 때의 동작을 관찰하여 삽입 알고리즘을 개발했습니다. 이것이 가장 빠른 구현인지는 알 수 없습니다.

여기 의사 코드가 있습니다.

class PartialOrderPriorityQueue
   q <- empty list
   method insert (n):
     for i <- 0 to (q.length - 1):
       if q[i] <= n:
         t <- q[i]
         q[i] <- n
         n <- t
     q.append(n)

   method pop():
     return q.remove(0)

-1

일반적인 힙 동작은 새 값을 뒷면에 추가 한 다음 상위보다 큰 값을 비교하는 것입니다.

부모에 대해 동일한 결과를 반환하는 비교를 작성하고 parent가 child보다 큰 경우와 비교할 수없는 경우 sift up은 여전히 ​​올바른 지점에서 종료되어야합니다.

그것은 당신의 목적을 위해 충분히 안정적인 주문으로 간주됩니까?


명확히하기 위해 귀하의 의견에서 예를 들어보십시오 : a> b , ca 또는 b 와 비교할 수 없습니다 :

  • a 다음 b 다음 c => a, b, c ... 이것은 이미 힙 순서이며, sift-up에서 아무것도 움직이지 않습니다.
  • b, a, c => a, b, c ... a는 올바른 위치로 분류되고 다시 올바른 힙 순서입니다.
  • a, c, b => a, c, b ... b는 c와 비교할 수 없으므로 체로 거를 수 없지만 요청 한대로 FIFO 순서로 남겨 둡니다.
  • c, b, a => c, a, b ... a 및 b는 올바른 상대 순서이지만 c와 비교할 수 없기 때문에 c보다 앞서 갈 수는 없습니다.

따라서 결과는 삽입 순서에 따라 다릅니다. 이것은 요청한 것과 일치하는 것 같지만 실제로 원하는지 확실하지 않습니다. 그렇지 않은 경우 원하는 결과를 보여줄 수 있습니까?


여러분의 의견 (및 질문에 대한 편집)에서 "비교할 수있는"요소가 "비교할 수없는"요소를 뛰어 넘고 순서에 따라 올바른 장소를 찾는 것이 좋습니다. 어떻게 해석해야할지 모르겠 기 때문에 이에 대해 물었습니다.

일부 요소가 비교할 수없는 경우 삽입 된 순서대로 요소를 반환합니다.

(d와 b는 편집에서 쌍으로 비교할 수 없지만 삽입 된 순서대로 원하지 는 않습니다 ).

다음 질문은 "비교할 수있는"요소와 "비교할 수없는"요소 사이의 관계에 관한 것이었지만 이제는 제품 순서에 따라 벡터라는 것을 알았습니다. NaN과 같은 모든 것과 비교할 수 없음 ).

따라서 새로운 예를 들어 벡터 값을 할당하면 b가 다른 것과 비교할 수없는 예인 것이 맞습니까?

        a (1,1)
      /      \
    b (0,4)   c (3,3)
  /
d (2,2)

그리고 이것으로 정렬해야합니다 :

        a (1,1)
      /      \
    d (2,2)   c (3,3)
  /
b (0,4)

?


나는 반례가 있다고 생각했기 때문에 작동하지 않을 것이라고 명시 적으로 언급했지만 지금은 확실하지 않습니다. 그러한 큐가 건전 하다는 것을 증명할 수 있습니까 (삭제, 삽입 및 업데이트도 가능)? 그리고 a ≤ b 이지만 c 는 둘 중 하나와 비교할 수 없으며 (따라서 위의 규칙과 "같음"을 비교할 수 있음) 기억할 수 있습니다.

글쎄, 그건 아직 증거가 아닙니다. 순서를 신경 쓰지 말고 힙이 항상 맨 위에 최소 요소를 가지고 있음을 증명하십시오 (참고 : (더 많은) 공통 규칙과 알고리즘의 실제 요구가 맨 위에 최소 이므로 a> b , b 가 먼저 오는 경우 ).

실제로 나는 반례가 있다고 생각합니다. 가정 , B를 하고 C는 힙에있는 ≤의 B≤ C , A가 최고이며, B는 왼쪽 자식 인 C는 바로 아이입니다. 이제 dd ≤ c 이며 ab 와 비교할 수 없습니다 . 그것은 b의 자식으로 삽입되고 그보다 작지 않고 머물러 있습니다. 지금 제공 이다 C ≤ E (따라서 또한 ≤ 전자 )과 비교할 수 B는 . 그래서 eb의 오른쪽 자식으로 들어갑니다그리고 유지합니다. 이제 a를 추출 하십시오 (OK, a is minimal), e 는 그 자리에서 교환되어 체로 거 릅니다 . 그것은에 비교할 B , 그러나보다 C 스왑 그래서 함께 . 이제 c , WRONG , d ≤ c를 추출하십시오 .

이전 의견에서 실수를 발견하면 (일시적 성으로 인해 견뎌야하는 불평등의 형태가 있어야하며 그것을 놓쳤습니다) 여전히 기회가 있습니다. 그렇지 않으면 작동하지 않습니다.

1
좋아, 더 간단한 반례. 가정 , BC는 힙에, ≤ C를 , B는 하나와 비교할 수있다. a 는 위, b 는 왼쪽, c 는 오른쪽입니다. dd ≤ a (따라서 d ≤ c )이며 b 와 비교할 수 없습니다 . 좌측 아이로서 다음 빈 슬롯이고 BD가 거기를 유지하므로, 비교할 수있다. 이제 a , WRONG , d ≤ a 추출 하십시오 . a ≤ c 인지 여부에 유의하십시오.중요하지 않든 상관없이 상황이 비교할 수없는 경우와 동일합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.