요셉의 원형이 단독 목록 문제를 연결

참조 본 블로그 : HTTPS : //blog.csdn.net/u011500062/article/details/72855826 

조셉 문제
요셉의 문제는 잘 알려진 문제 : N 개인 원, 1 Countin에서 첫 번째 사람, M은 다음 시작 신문에서 다음 사람을 살해 될 것보고했다. 그래서 다시, 마지막 남은 하나는 최종 우승자를 추구.
예를 들어, 단지 세 사람이, B는 C, 그들은 원을 형성, 그 전화 2 명이 사망보고되었다 가정, A로부터 떨어져 계산하기 시작했다.

첫 번째 시작은 그 일을보고, 오프 계산합니다. 다행히 탈출했다.
그런 다음 B의 수를보고 좌회전, 그는 2를보고했다. 아주 비참, 그가 죽었다
C를 다음 1에서 점점 수는
다음 신문의 수를 설정, 그는 2를보고했다. 또한 그것은 죽었다.
최종 우승자는 C의 인
솔루션
일반적인 솔루션은
단지 데이터 구조를 배우고, 우리는이 과정을 시뮬레이션하기 위해 목록의 방법을 사용할 수 있습니다, N N 연결리스트 노드로 간주 개인, 노드 1 점 2, 노드 2 노드 3 점을 노드로, ... ..., 노드 N에 대한 N-1 노드 지점, 노드 N 1 노드 점은, 이와 같이하여 고리를 형성한다. 처음부터 1, 2, 3 ...... 노드 오프 수 아래로 그리고, 모든 보고서 M은 해당 노드가 링에서 제거했습니다. 그렇다면 1 개 개시 패킷으로부터 다음 노드 번호. 최종 목록 나머지 노드. 그것은 궁극적 인 승자입니다.

단점 :
n은, 짧은 시간에 매우 큰 (예를 들어 수백만, 수천만), 거의 방법으로 결과를 해요 없을 때 O (㎚)의 시간 복잡도까지, 게임의 전체 과정을 시뮬레이션합니다.

수식 방법
요세푸스는 고전적인 수학 문제, 우리가 쉽게보고 차례에서이 번호를 찾을 수 있습니다, 패턴이 보인다. 수출 순환을 용이하게하기 위해, 우리는 어떤 주제를 재정의.
문제 : N 개인 번호 1,2, ..., N은 보고서의 수에 따라, 모든 보고서 M은, 그 사람을 죽일 번호의 마지막 승자를 찾을 수 있습니다.

우리는 여기서 첫 번째 결론을 던졌다. 이후이 공식의 단계를 이해 와서 무엇 인에 의해 단계 걸릴.
재귀 화학식 :
F (N, M) = (F (1-N, M) + M.) % N
F (N, M) = (F (1-N, M) + M.) % N
F (N, M) F (N, M)은 모든 사람 리포트 M, 최종 승자 번호 죽이고, 각각의 패킷의 N 번호를 나타내는
F (N-1, M) (F)을 (N-1, M)을 나타내고, N-1 개인 디지털 신문은, 모든 사람 M 보고서, 숫자의 최종 승자를 죽일
우리가 모든 사람에게 문자가없는 아래에 있지만 번호.
1,2,3,4,5,6,7,8,9,10,11
1,2,3,4,5,6,7,8,9,10,11

11명를 나타냅니다, 그들은 먼저 사망하는 사람 보고서 당 3 가정, 줄 지어.
처음에는 첫 번째 숫자 1, 그는 첫 라운드에서 오프 계산하기 시작 인 사람의 수는 3을 죽인 것입니다.
4 위는 다시 1부터 시작하는 사람의 수는,이 시간 우리는이 사람이 제 4 팀 헤드라고 말할 수 있다는 것을보고했다. 두 번째 라운드는 사람의 수는 6 살해되고있다.
사람들의 7 수는, 다시 우리는이 사람이 제 7 팀 헤드라고 말할 수있는이 시간을 계산하기 시작했다. 세 번째 라운드는 사람의 수는 9 사망입니다.
......
아홉 번째 라운드, 2 번 사람이 다시 떨어져 계산하기 시작하면이 시간 우리는이 하나의 번호 2 팀장이라고 말할 수 있습니다. 이 라운드의 수를 8 명이 사망하고있다.
사람이나 번호 2 다음 사람은 그 숫자가 1로 시작하는 불행하게도 그는 이번 라운드에서 죽었다 보도했다.
최종 우승자는 사람들 (7)의 수입니다.
다음 그림은이 과정을 보여줍니다

이제 우리는 재발 수식을 얻을 방법을 봐!
테이블의 각 행은 상기 배열로,이 공식이 설명 : 생존자 인덱스 위치에이 라운드

F (1,3) : 오직 한 사람, 및 그 사람이 승자, 그 위치가 0 첨자
F (2,3) = (F (1,3) +3) % 2 % 2 = 3 = 1F (2,3) = (F (1,3 ) +3) = 3 % 2 % 2 = 1 : 두 사람이있을 때, 승자는 위치 인덱스 1.
F (3,3) = (F를 ( 2,3) +3) = 4 % 3 % 3 = 1 층 (3,3) = (F (2,3) +3) = 4 % 3 % 3 = 1 : 3이되는 개인 승자 위치 인덱스. (1)
F (4,3) = (F (3,3) +3) = %. 4. 제 4 % 0F = (4,3) = (F (3,3) +3) =. 제 4 % % 4 = 0 : 거기에 4 명이 있으며, 첨자 위치 승자가 0 일 때
......
F (11,3)이 = 6 층은 (11,3) (6) =
그것은 놀라운! 이제 당신은 아직도이 공식 그것의 타당성을 의심? 위의 예는 다음이 공식을 유도하는 방법을 설명합니다, 참으로이 재귀 공식 첨자 수상자 계산 될 수 있음을 보여주고있다.
질문 1 : 우리는 이미 11명, 여섯 첨자 위치 승자를 알고 가정하자. 첨자 위치의 다음 10 개 개인의 라운드, 승자는 얼마나 그 때?
A는 : 사실은, 사람들이 세 왕 Qianmian를 이동 한 후, 3 번 사람의 첫 라운드를 삭제,이 승리는 앞으로 세 이동, 그래서 첨자 (6)에 의해 자신의 위치는 3이된다.

질문 2 : 우리는 이미 십명, 세 가지의 첨자 위치 승자를 알고 가정하자. 첨자 위치의 다음 11 개 개인의 라운드, 승자는 얼마나 그 때?
A :이 잘못 될 수있다 우리 모두가 F 있도록 (11,3)는 F (10,3 = 다시 세 개의 이동, 이전 질문의 반대입니다 ) + 층 (11,3) = F를 (10,3) 3. 그러나, 경계 아웃 배열 때문에 현재 번호에 금형의 최종 수 F (11,3) = (F있을 수 + (10,3) +3) %의 11F (11,3) = (F (10,3) 3) 11 %가
질문 3 : 그들은 사람을 죽이고, M을보고 할 때 숫자가 지금, N을 읽을 수 변경 후 배열하는 방법을 이동하는 것입니다?
A : 각 사람을 죽이고, 다음 사람 전진 M 비트의 배열에 해당 머리한다. N-1은 공지 된 개별 비트 승자 첨자 F (N-1, M)의 경우 F (N-1, M), N 개의 개별 것이 가능로서, (M로 후퇴 배열 범위, 헤드 부는 수신되는 동안, 상기 몰드해야 N) 모두 F (N, M) = ( F (N-1, M) + M) %의 NF (N, M) = (F ( N-1, M) + M ) % n 개의
참고 : 인덱스 위치의 관심이 승자가되는 것을 어떻게 재귀 핵심을 이해합니다. 각각은 사용자가 실제로 M 비트의 배열을 전진 죽일. 그런 다음이 재귀 공식을 얻을 수 있습니다, 이상 역.

계산 결과가 배열 첨자 때문에, 최종 숫자 1을 추가해야

자바 코드는 다음을 달성하기 위해 :

공개   노드 josephusKill (노드 헤드 의 INT m) {
 경우 (헤드 ==  || head.next == 머리 || m은 <1 ) {
 반환 헤드; 
} 
노드 CUR = head.next;
INT의 TMP = 1 ;
동안 (는! = CUR {헤드) 
의 tmp를 ++ ; 
CUR = cur.next; 
} 
TMP = getLive (TMP, m);
동안 (이! = 0 --tmp {) 
머리 = head.next 단계; 
} 
head.next = 헤드;
돌아 머리를; 
}

공개  INT getlive ( INT의 N, INT의 m) {
 경우 (N 개의 == 1 ) {
 반환 1 ; 
} 
리턴 (getlive ( INT N-1 의 INT m) + m) % N; 

}

 




추천

출처www.cnblogs.com/doufuyu/p/11069701.html