최소한의 반전을 유지하면서 목록에 효율적으로 삽입


15

두 개의 비교 가능한 항목 목록 (u 및 s)을 가정하십시오. INV (u)를 u의 반전 수로 둡니다.

INV (u)의 최소 증가로 s 항목을 u에 삽입하는 효율적인 알고리즘을 찾고 있습니다.

기본적으로 첫 번째 목록의 순서를 유지하면서 개체를 "가능한 한 정렬 된 상태로"유지하면서 목록에 개체를 삽입하고 싶습니다.

예:

u = [4,6,2,9,7]
INV(u) = 3 ((4, 2), (6, 2) and (9, 7)

s = [8,3,10]

one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7))

different optimal solution u' = [3, 4, 6, 2, 9, 7, 8, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (9,8))

보시다시피 독특한 최적의 솔루션은 없습니다.

나는 어떤 종류의 아이디어 나 조사 방향이있어서 기쁘다.


생각을위한 음식 : 순진한 접근 방식은 다음과 같습니다. s에서 하나의 요소를 가져 와서 u에서 각 요소를 왼쪽에서 오른쪽으로 비교하고, 반전 된 경우 증가시키고 이전에 계산 된 숫자를 넘깁니다. 그런 다음 동일한 요소를 사용하여 목록을 오른쪽에서 왼쪽으로 탐색하여 각 위치의 수를 늘립니다. 이것은 공간 = O (| u |) 인 O (| s | * | u |)에서 실행됩니다.
trevore

1
최대로 증가하는 모든 서브 시퀀스를 검사하면 어딘가로 이어질 수 있습니다.
Raphael

답변:


2

이것은 trevore의 답변에 대한 설명입니다. 주석에 맞추기에는 너무 길고 그의 해결책의 증거 (또는 적어도 그것을 이해하는 방법)가 들어 있습니다.

최적의 솔루션에서 요소 가 순서대로 표시됨을 보여줄 수 있습니다 . s그렇지 않은 경우 라고 가정 하고 최적 솔루션에서 역순으로 나타납니다. 하자 σ 한 것은 사이 소자의 숫자 (1)s의 2 미만이다 S 1β 1 수보다 큰 이들의 숫자 (1)s1<s2σ1s1s2s1β1s1 . s 2에 대해 β 2를 유사하게 정의하십시오 . 참고 σ 1σ2β2s2 β 2β 1 . 스와핑 S (1) s의 2하는 의해 반전의 수를 변경한다 - β 1 + β 2 - σ 2 + σ 1 - 1 가장 -1이다.σ1σ2β2β1s1s2β1+β2σ2+σ11

요소를 독립적으로 삽입 할 수 있다는 것을 알기가 어렵지 않습니다 . s그것들이 순서대로 나타나기 때문에, 의 요소들은 서로의 존재를 "느끼지"않습니다. 즉, s 의 요소 쌍은 반전 횟수에 영향을 미치지 않습니다. 그렇게하려면 s 의 중앙값을 선형 시간에 최적으로 삽입하십시오 . 그런 다음 재귀 적으로 중간의 왼쪽보다 중간 값보다 작은 s 요소와 오른쪽의 중간보다 큰 요소를 삽입 하십시오.ssss

중간 위치에 삽입하자 이 만족의 실행, T ( | s의 | , | U | ) = T ( | s의 | / 2 , | U | - K ) + T ( | s의 | / 2 , K ) + | u | + | s | , 선형 | s |kT(|s|,|u|)=T(|s|/2,|u|k)+T(|s|/2,k)+|u|+|s||s|요인은 중앙값을 찾아 의 요소를 섞습니다 . T ( | s | , | s | + | u | log | s | ) 를 유도하면 쉽게 알 수 있습니다.sT(|s|,|u|)=O(|s|log|s|+|u|log|s|) 있습니다.

에 대한 의존 여기가 최적입니다. 빈 u 로 문제를 해결하는 것은 s 를 정렬하는 것과 같습니다.|s|us 단지 비교를 사용하여. 에 대한 의존 싱글 목록에 대한 문제가 있기 때문에, 최적의도 과 목록 u는 선형 작업을 필요로한다.|u|su


정교한 감사합니다. 그것이 바로 내가 의미 한 해결책입니다.
trevore December

1

좋아, 내 해결책은 다음과 같습니다.

관찰 (내가 ​​다소 입증 된)은 최적의 솔루션은 항상 s가 오름차순으로 정렬되는 솔루션이라는 것입니다. 이것은 O ((| u | + | s |) * log (| s |)) 알고리즘을 발생시킵니다.

단일 요소에 대한 최적의 솔루션을 찾으려면 내 의견에서 말한대로하십시오 : s에서 하나의 요소를 가져 와서 왼쪽에서 오른쪽으로 u의 각 요소와 비교하고 카운터가 반전되어 증분되고 이전에 계산 된 숫자를 넘깁니다. 그런 다음 동일한 요소를 사용하여 목록을 오른쪽에서 왼쪽으로 탐색하여 각 위치의 수를 늘립니다.

이것은 O (| u |)입니다.

s를 정렬하십시오.

위치 m에서 s의 중간 요소 : u에서 최상의 위치 b를 찾습니다 (위의 방법 사용).

s에서 m과 u를 b에서 나누고 왼쪽과 오른쪽 부분을 재귀 적으로 호출하여 결과를 m과 올바른 순서로 연결합니다.

u 또는 s가 비면 즉시 중지하십시오.


나는 이것을 이해하지 못한다. s는 입력입니다. s가 정렬 된 순서라고 가정 할 수 없습니다. 알고리즘은 가능한 모든 s 값에 대해 작동해야합니다.
DW

예. 그러나 최적의 솔루션에서 s의 요소는 항상 새 배열에서 오름차순으로 정렬됩니다. "Sort s"단계를 참고하십시오. 위의 예를 참조하십시오. 내가 지금까지 증명 한 것은 a, b의 s, a <b가 a에 최적으로 배치되면 b의 최적 위치는 a의 오른쪽에 있다는 것입니다.
trevore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.