2016-11-11 6 views
2

정수 배열 (예 : [1 5 3 4 6])이 있다고 가정합니다. 요소는 다음 규칙에 따라 재정렬됩니다. 모든 요소는 앞으로 건너 뛰어 (왼쪽으로) 건너 뛴 색인의 요소를 슬라이드 할 수 있습니다. 프로세스는 두 번째 인덱스의 요소 (즉, 5)로 시작합니다. 요소 1을 건너 뛸 수있는 선택권이 있거나 자신의 위치에 머무를 수 있습니다. 이동하기로 선택하면 요소 1은 색인 2로 내려갑니다. 홉핑을 선택하면 결과 배열은 [5 1 3 4 6]. 엘리먼트 3은 이제 1 또는 2 이상의 위치를 ​​건너 뛰고 프로세스가 반복됩니다. 한 위치에서 3 홉 이상 올리면 배열이 [5 3 1 4 6]이되고 두 위치에서 홉을 잡으면 이제 [3 5 1 4 6]이됩니다.소스와 최종 배열이 주어지면 2 차 시간 복잡도보다 작은 소스에서 최종 생성 할 홉 수를 찾습니다.

요소의 모든 가능한 순열이 이런 식으로 가능하다는 것을 보여주는 것은 매우 쉽습니다. 또한 최종 구성에는 고유 한 발생 세트가 있습니다.

최종 배열과 소스 배열이 주어지면 소스에서 최종 배열에 도달하는 데 필요한 총 홉 수를 찾습니다. O (N^2) 구현은 쉽게 찾을 수 있지만 O (N) 또는 O (NlogN)에서 수행 할 수 있다고 생각합니다. 또한 O (N2)보다 더 잘 할 수 없다면 알아두면 좋습니다. 마지막 배열 [3,5,1,4,6 들면

이면 소스 배열 [1,5,3,4,6 같이, 응답은 3

내 O 것 (N2) 알고리즘은 다음과 같습니다. 마지막으로 소스 배열의 모든 위치를 루프합니다. 이동하는 마지막 요소임을 알고 있기 때문입니다. 여기서는 6이 될 것이며 최종 배열에서 위치를 확인합니다. 우리는 필요한 홉 수를 계산하고 소스 배열의 원래 위치에 해당 요소를 배치하기 위해 최종 배열을 다시 정렬해야합니다. 재 배열 단계는 배열의 모든 요소를 ​​처리하고 모든 요소에 대해 프로세스를 반복하므로 O (N^2)입니다. 해시 맵이나지도를 사용하면 검색에 도움이 될 수 있지만 O (N^2) 단계에서 매 단계마다지도를 업데이트해야합니다.

P. 나는 베이지안 방식으로 2 개의 순열 사이의 상관 관계를 모델링하려고 노력하고 있는데, 이것은 이것의 하위 문제이다. 생성 프로세스를 수정하여 문제를 간단하게 만드는 방법에 대한 아이디어도 도움이됩니다.

편집 : 내 대답을 찾았습니다. 이것은 Kendall Tau 거리가하는 것과 정확히 같습니다. 이것을 O (NlogN)에서 찾아내는 쉬운 병합 정렬 기반 알고리즘이 있습니다.

+0

O (N^2) 알고리즘은 무엇입니까? – v78

+0

왜 "대답은 3이 될까요?" 여기에 2 홉이 있습니다 - 3 홉에서 1 위까지 그리고 5 홉에서 2까지. 또한 배열의 정수가 고유한지 아닌지를 가정 할 수 있습니까? –

+0

@AlexanderAnikin 당신은 당신의 오른쪽이 아닌 당신의 왼쪽으로 갈 수 있습니다. 3이 가장 왼쪽에 있으므로 유효한 홉이 없습니다. 5를 사용하여 위치를 3과 바꾸면 [5,3,1,4,6]에 현재 홉 수가 1이됩니다. 그런 다음 요소 1이 왼쪽으로 두 칸을 두드려 현재 배열 [1,5,3,4 , 6]. 4와 6은 이미 원하는 위치에 있습니다. 따라서 총 홉 수는 3이됩니다. –

답변

1

대상 배열을 순서대로 고려하십시오. 표적 배열 [2 5 4 1 3]은 재 레이블 지정만으로 [1 2 3 4 5]으로 볼 수 있습니다. 일정 시간 동안 요소를 비교할 수 있도록 매핑을 알면됩니다. 이 경우 45을 비교하려면 index[4]=2 > index[5]=1 (대상 배열에서) 및 4 > 5 (의미 : 45의 오른쪽에 있어야 함)을 확인하십시오.

그래서 실제로 가지고있는 것은 바로 바닐라 정렬 문제입니다. 순서는 일반적인 숫자 순서와 다릅니다. 변경되는 유일한 것은 비교 기능입니다. 나머지는 기본적으로 같습니다. 정렬은 O(nlgn) 또는 심지어 O(n) (기수 정렬)에서 이루어질 수 있습니다. 즉, 몇 가지 추가 제약 조건이 있습니다. 바로 정렬해야하며 인접한 두 요소 만 바꿀 수 있습니다.

강력하고 간단한 후보자는 selection sort이고, 이는 O(n^2) 시간에 수행됩니다. 각 반복에서 "배치되지 않은"부분의 "가장 왼쪽"나머지 요소를 식별하고 "배치 된"부분 끝에 도달 할 때까지 스왑합니다. 적절한 데이터 구조 (O(lgn) 시간의 "가장 왼쪽"나머지 요소를 식별하는 우선 순위 큐)를 사용하여 O(nlgn)으로 향상시킬 수 있습니다.nlgn은 비교 기반 정렬의 하한이기 때문에 실제로 그렇게 할 수는 없다고 생각합니다.

편집 : 따라서 스왑의 순서는 전혀 관심이 없으므로 최소한의 스왑 만 필요합니다. 이것은 정확하게 배열의 inversions의 번호입니다 (특정 요구에 맞게 조정 : "자연이 아닌 순서 지정"비교 함수이지만 수학을 변경하지는 않습니다). 그 주장에 대한 증거는 this answer을 참조하십시오.

역전 횟수를 찾는 한 가지 방법은 병합 정렬 알고리즘을 적용하는 것입니다. 실제로 배열을 정렬하여 배열해야하므로 여전히 O(nlgn) 시간이됩니다. 구현의 경우 this answer 또는 this을 참조하십시오 (다시 한 번 적용해야 함을 기억하십시오).

+0

답변 주셔서 감사합니다. 비슷한 생각으로 생각하고 있었기 때문에 당신의 아이디어를 내 아이디어와 섞어서 정확한 해결책을 놓칠 수도있었습니다. 여기에 잘못된 것일 수 있지만 이와 비슷한 것으로 생각합니다. 원본 소스 배열에서 타겟까지 가져 오는 원래의 응답, 즉 인접 홉의 총 개수가 누락되었습니다. –

+0

@RohanMukherjee 오, 정말 스왑 순서는 필요 없으며 스왑 수만 필요합니다. 나는 그것을 놓친다;) 나는 내일 그것에 관해 그것을 생각할 것이다. 어쩌면 알렉산더 (Alexander)의 대답 (지금까지 할 시간이 없다)이 트릭을 할 것입니다. –

+0

@RohanMukherjee 좋아, 내 편집을 참조하십시오. –

0

귀하의 답변에서 원래 배열을 최종 배열로 변환하는 데 필요한 인접 요소의 스왑 총 수를 홉 수로 가정합니다.

내가 삽입 정렬과 같은 것을 사용할 것을 제안하지만 삽입 부분이없는 경우 - 배열의 데이터는 변경되지 않습니다.

지연된 호퍼에 대한 카운터 을 카운터 (하위 트리의 요소 수)가있는 균형 이진 검색 트리로 만들 수 있습니다. C 요소의 수가 톤에 있는지

추가 할 수있는 소자 t하려면 O에 t에 요소의 위치를 ​​ 균형 로부터 요소를 제거하고 검색 시간 (C 로그).

요소의 위치를 ​​찾는 단어가 거의 없습니다. 건너 뛴 왼쪽면의 누적 값을 갖는 2 진수 검색 (브랜치에 요소를 유지하면 중간 요소 +1) 카운트로 구성됩니다.

균형/추가/제거에 관한 단어가 거의 없습니다. 제거 된/추가 된 요소/하위 트리 및 업데이트 카운터에서 위쪽으로 이동해야합니다. 전체 작업 수는 삽입 + 균형 및 제거 + 균형을 위해 여전히 O (로그 C)에서 유지됩니다.

하자 t은 (밸런스 검색 트리) 큐, P 전류 원래 배열 인덱스는 원래 어레이는 최종 배열 F 이다 최종 배열 인덱스이다 Q는이다.

이제 우리는 1 개 루프 (Q = 0, P 말하자면 = 0)을 왼쪽부터 가지고

  • [P] == 경우 을 F [q]이면 원래 배열 요소가 전체 큐에 대해 홉핑합니다. 응답에 t.count을 추가하십시오. p, 증분 q이 증가합니다.

  • 만약 [P]! = F [Q] 및 F [Q]을하지 t에서, 다음 [P] 를 삽입 인 t 및 증분 p.

  • [P]! = [Q]와 F [Q] F를 다음 추가 F [Q]에 응답하는 큐의 위치한다면, 분리 f [q] t 및 증분 q으로부터 증가한다.

나는 배열은 정말 하나 개의 배열의 순열 경우 같은 시간에 배열의 끝에 p와 q 이동합니다이 과정을 보장 마술을 좋아한다. 그럼에도 불구하고 p와 q가 오버플로되어 잘못된 데이터를 탐지 할 수 있는지 확인해야합니다. 데이터가 올바르다는 것을 증명할 수있는 방법이 없기 때문입니다.

+0

귀하의 의견을 보내 주셔서 감사합니다. 나는 그 과정을 이해하려고 노력하고있다. 소스 배열이 [5,4,3,1,2]이고 최종 배열이 [2,4,5,3,1]이라고 가정합시다. 이것은 p가 끝까지 도달 할 때까지 a [p] == f [q] 제약 조건을 만족하는 인덱스가 없다는 것을 의미합니다. 그 후에는 어떻게 될까요? 그것이 [p]! = f [q] 조건을 따르는 경우 매번 올바른 결과를 얻지 못할 것입니다. 내 이해가 잘못 되었나요? –

+0

글쎄, 네 말이 맞아. 정렬 된 소스 배열 (요소의 순서가 검색 트리와 호환 될 수 있도록)에서 작동 할 수 있습니다. –