요소가 정확히 지수 ± M이 아닌 순열 계산


13

나는 최근 알고리즘 인터뷰 에서이 문제를 물었고 해결하지 못했습니다.

두 개의 값 N과 M이 주어지면 순열의 숫자와 순열의 위치 사이의 절대 차이가 M과 같지 않도록 길이 N의 순열 수 (1에서 N까지의 숫자 사용)를 계산해야합니다.

예-N = 3이고 M = 1 인 경우 1 2 3 및 3 2 1은 유효한 순열이지만 숫자 3이 위치 2에 있고 차이가 M이므로 1 3 2는 유효하지 않습니다.

NxM Dynamic 프로그래밍을 시도했지만 반복을 계산하지 않는 반복을 형성하지 못했습니다.


포함 제외를 사용하여 수식을 얻을 수 있습니다. 의 경우 M=0는 일반적으로 디 레인지먼트라고 합니다.
Yuval Filmus

1
이것은 이분 그래프에서 완벽한 일치를 계산하는 특별한 사례로, 완전한 문제입니다 . 물론이 특별한 경우가 더 쉬울 수 있습니다. #P
Yuval Filmus

나는 이미 포함 제외를 시도했지만 진전이 없었습니다.
Gena

거리를 세는 방법을 조정 해 볼 수 있습니다. 나는 그것이 당신을 어디든지 데려 갈 지 모르겠다. 또한 M = 1을 고치거나 (예를 들어) 무차별 대입으로 N의 작은 값 (N = 1,2,3,4,5,6,7,8)의 수를 계산 한 다음 해당 시퀀스를 찾아 볼 수 있습니다. 에 OEIS 희망 당신은 도움이 뭔가를 찾을 수있다.
DW

재귀는 무엇입니까? "반복 횟수"는 무엇을 의미합니까?
Raphael

답변:


2

이 질문을 받았을 때 가장 먼저 물어볼 것은

다항식 시간 알고리즘을 원하십니까?

그리고 대답이 '아니오'라고 희망합니다. 다음과 같은 이유로이 문제가 NP-hard라고 생각합니다.

이 문제에 대한 자연스러운 접근 방식은 첫 번째 숫자의 배치를 고려하고 다른 숫자를 배치하기위한 재귀 공식을 도출하는 것입니다. 경우 (즉, 배열 수를 세는 경우) 첫 번째 숫자를 배치 한 위치에 관계없이 모든 숫자에 대해 하나의 '불법적 인'위치 만 있기 때문에 M = 0의 경우에 잘 작동 합니다. 다시 말해,이 접근법은 독립적 인 하위 문제로 이어집니다.M=0

들어 우리가 지금 할 수 있습니다,이는 그렇게 간단하지 않습니다 이 개 몇 가지 숫자에 대한 불법 위치를. 이 중 어떤 문제가 하위 문제에 남아 있는지 이제 하위 문제의 해결 방법과 관련이 있습니다. 하위 위치의 하위 문제의 구조를 결정하기 위해 불법적 인 위치를 공유하는 숫자의 '사슬'이 필요하기 때문에 '불법적 인'위치의 수만 고려하는 것만으로는 충분하지 않습니다. 따라서이 방법은 본질적으로 다음과 같은 하위 문제로 이어집니다.M>02

세트 , 세트 B N , 최대 N 크기 및 자연수 M 모두 , 이분 그래프 ( A , B , E ) 에서 완전 일치 수를 계산합니다 . 여기서 ( a , b ) E 경우에만 | a - b | M .ANBNNM(A,B,E)(a,b)E|ab|M

이 문제는 어려워 보입니다. 이 문제에 대한 유일한 접근 방식은 포함 / 제외이며 다항식 시간 알고리즘으로 이어지지 않습니다.

우리는 숫자의 반복적 인 배치에 의존하지 않는 접근법을 고려할 수 있지만, 어떻게 할 것인지에 대한 실마리는 없습니다. (특히 인터뷰 중에!)

물론,이 모든 것은 단순한 추측 일 뿐이며, 영리한 속임수가 다항식 시간 솔루션을 제공 할 수는 있지만,이 속임수가 매우 영리해야한다는 설득력있는 주장을하기를 바랍니다.

아마도이 문제를 # 2-SAT (불법의 위치를 ​​공유하는 숫자의 '사슬'은 진실 가치의 선택과 일치하는 사소한 선택이 아닌 것)로 줄임으로써 NP 경도를 보일 수 있지만 나는 현재로서는 그렇게하는 확실한 방법을 보지 못했습니다.


면접관이 실제로 지수 시간 알고리즘에 만족하는 경우 재귀 역 추적 알고리즘을 적용 하여이 특정 사례를 제외하도록 순열을 생성하여 가능한 모든 솔루션을 생성합니다.


지수 시간 알고리즘을 제공 할 수 있다고 말했지만 N이 <= 1000 일 때 작동하는 다항식 시간 솔루션을 요청했습니다.
Gena

1
PPenguin의 답변에서 제안한대로 질문을 잘못 기억하거나 잘못 해석하지 않는 한,이 질문은 매우 까다로운 면접관, 스스로 질문을 잘못 이해 한 면접관 또는 누군가가 해결하지 않을 것으로 예상되는 질문에 의해 제기 된 것으로 생각합니다. . 이 질문이 계산적으로 어렵지 않다고해도 인터뷰가 어렵다.
이산 도마뱀

M = 1은 가능하고 다른 것 같습니다. 그래서 우리가 놓친 것이 있습니다. M = 1 사례를 이해 / 평가하는 데 도움을 줄 수 있습니까? 나는 그것에 대해 별도의 질문을했습니다 cs.stackexchange.com/questions/74674/…
PPenguin

2

특정 세부 사항을 기억하거나 질문을 잘못 해석했을 가능성이 있습니까?

당신의 설명에서, 요소 위치에서 (b)은 제한됩니다 - B ± M . 그러나 그들이 단지 차이가 ​​제한되었다는 것을 의미한다면 : a - b M 이면 문제는 다루기 쉬운 것처럼 보입니다.abab±M
abM


더 간단한 문제를 해결하고 더 큰 문제를 자유롭게 해결할 수있는 방법으로 일반화하려고했습니다. 그러나 이것은 왜 재귀 적 접근 방식이 효과가 없을 가능성을 분명히 해주었습니다.

함수 고려 에 1로 표시된 요소 목록의 순열의 수를 제공 N 원소, A는 위치에서 (B) 을 만족하는 (제 1 위치 1) - B MB가 - P .f(N,M,P)NababMbaP

이를 시각화하기 위해 두 가지 제약 조건으로 분리하면 P 가 이러한 제한을 개별적으로 이동할 수 있습니다 .MP

1 2 3 4 5  M=0, restricted values for each position
. . . . .  (positions in list)
1 2 3 4 5  P=0, restricted values for each position

3 4 5      M=2, restricted values for each position
. . . . .  (positions in list)
  1 2 3 4  P=1, restricted values for each position

편의상 일 때 순열에 제한을 두지 않도록 g ( N , M ) = f ( N , M , P )를 정의하십시오 . 마찬가지로, M N 인 경우 g ( N , P ) = f ( N , M , P ) 이므로 순열에 제한이 없습니다.PNg(N,M)=f(N,M,P)g(N,P)=f(N,M,P)MN

특별한 경우에 에서 제약 MP는 하나가 무시 될 수 있도록 기록 우리 있도록, 동일 F 환산 g : F ( N , 0 , 0 ) = g ( N , 0 ) .M=P=0MPfg

f(N,0,0)=g(N,0).

문제의 대칭에서 :

f(N,M,P)=f(N,P,M)

먼저 풀고 더 일반적인 f ( N , M , P ) 를 다루 겠습니다 .g(N,M)f(N,M,P)

들면 , 각각의 요소는 하나 개의 배치 제한을 갖는다 (그리고 제한 구별된다). 그래서 어떤 원소 i를 선택하면 , 우리는 그것을 어떤 위치 j 에 놓을 것입니다 . 있습니다 N - 1 의 선택을위한 다른 가능성 j는 .M=0ijN1j

이 선택은 요소 의 제한된 위치를 제거하는 반면, 다른 ( N - 2 ) 요소는 여전히 하나의 제한이 있습니다. j 의 배치는 두 가지 옵션으로 나눌 수 있습니다.j(N2)j

  1. 에 배치 . 이로 인해 다른 모든 요소에 한 가지 제한이 있으므로 나머지 배치 문제는 이제 g ( N - 2 , 0 )으로 줄어 듭니다 .ig(N2,0)

  2. 위치에 배치하십시오 . 이것은 j 에 대해 하나의 배치 제한을 제공 하므로 각 요소에는 하나의 제한이 있으며 나머지 배치 문제는 g ( N - 1 , 0 )으로 줄어 듭니다.ijg(N1,0)

따라서 이것은 재귀 공식을 제공합니다 :

g(N,0)=(N1)[g(N2,0)+g(N1,0)]

손으로 간단한 상황을 보면서 기본 사례를 얻을 수 있습니다.

g(1,0)=0,  g(2,0)=1

이것은 일반적인 배열 재귀 공식입니다.

나는 누군가가 그 자리에서 이것을 떠 올릴 것이라고 상상할 수 없지만, 이것에 대한 닫힌 양식 솔루션이 있음이 밝혀졌습니다 (자세한 내용은 배열 위키 기사 참조).

g(N,0)=n!e+12

들면 은 임의의 게재에 대한 제한은 없다 :MN

(MN)g(N,M)=N!

함께 , 제 M의 요소에는 제한이 없으며, 나머지 요소들은 하나 개의 배치를 제한 할 것이다. 위치와 관련하여 마지막 M 위치는 모든 숫자를 허용합니다.0<M<NMM

마지막 위치에서 요소 선택하십시오 . 나머지 게재 위치는 다음과 같은 두 가지 가능성이 있습니다.i

  1. 경우 , 다음, 너무 사용하여, 배치 제한이 없었 내가 어떤 위치에 대한 제한을 변경하지 않습니다. 또한 제한없이 한 위치를 제거 했으므로 나머지 배치는 g ( N - 1 , M - 1 ) 처럼 보입니다 .i<Miig(N1,M1)

  2. i>=Miig(N1,M)

(0<M<N)g(N,M)=(M1)g(N1,M1)+(NM+1)g(N1,M)

This finishes the recursive solution for g.

When M+PN, the first NM positions have a single number restriction on them, the last NP positions have a single number restriction on them, and the middle M+PN positions have no restrictions. This is just like the g(N,M+PN) case.

(M+P)Nf(N,M,P)=g(N,M+PN)

We have handled all cases currently except 0<M<N and 0<P<N such that M+P<N. This is where some elements have multiple restrictions. Because of the symmetry in f, we can consider 0<MP<N without loss of generality.

The first P positions will have a single restriction, then NMP positions with two restrictions, then the last M positions have a single restriction.

Looking at the elements, the first M elements will have a single restriction, then NMP elements have two restrictions, then the last P elements have a single restriction.

However this is where we must end. As there is no way forward with this method.


I separated the two constraints because I could see that placing a number in a selected position could unbalance how many single constrained positions there were for the "+" constraint and the "-" constraint of ab±M.

But in the more general problem, removing a position by placing a number in it, does not always result in a subproblem that is described with f(N,M,P).

To visualize these constraints on the permutation, consider a directed graph with 2N nodes, one set of N labeled {A1,A2,...,AN} and another labelled {B1,B2,...,BN}. A directed edge (Ai,Bj) exists if ij=M, and directed edge (Bj,Ai) exists if ji=M and M0.

The set of A nodes can be considered the numbers we are permuting in some list, and B nodes their possible positions. This graph represents the constraints. There will be no cycles in the graph. It will always be disjoint nodes or chains of length one or more.

So we want a function which takes as input this constraint graph, and outputs the number of permutations that satisfy the constraints.

In the case where M+PN, the graph is just disjoint nodes and single edges. So removing an A and B node will give a subgraph that is also disjoint nodes and single edges.

However for 0<MP<N, the graph can have long chains. To place a number in an available position, regardless of whether we fix the node or the position, we need to consider all the subgraphs of possible ways to build that. All the different ways of breaking up the chains will result in a "recursion" that is on the order of N parts each round, and thus can't expect much if any savings compared to checking all N! permutations.

Because there are so many possible subgraphs once chains are allowed, I really don't see how this can be solved with the usual recursive methods unless there is a clever relation saying how non-isomorphic constraint graphs are somehow equivalent for the number of permutations.

I think most likely, the question was misinterpreted. Possibly even by the interviewer (who may have forgotten the answer details themselves).


Why is your constraint graph directed? What do the directions mean?
Discrete lizard

@Discretelizard The two directions (a->b vs b->a) distinguish between where the constraint came from (the '+' or the '-' version of the constraint). It's not really needed, because it doesn't matter the origin of the constraint, it just made it easier for me to visualize what was going on.
PPenguin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.