2017-11-20 16 views
1

주어진 N 개의 양의 정수의 순열을 표현하려고합니다.
예. 각 숫자에 대해 4 비트 이하를 사용하는 숫자 1-16의 임의의 순열을 나타냅니다.비트의 정수 순열 표현

아이디어는 64 비트 대신 8 * 4 + 4 * 3 + 2 * 2 + 1 * 1 = 49 비트에서 16의 순열을 나타낼 수 있다는 것입니다.
예제 데이터 세트는 다음과 같습니다 [10 1 3 11 2 12 8 7 4 6 9 13 15 16 5 14].

나는 이것을 달성하기 위해 다음과 같은 C 프로그램을 시도했지만 벡터 주어진 정수의 위치를 ​​저장하는 프로그램에서 벡터를 사용하는 방법을 잘 모르겠습니다.

이 문제가 있습니다 :
정수가 1-16의 범위라면, 더 멀리 계산할 필요가있는 위치는 [0]에 저장됩니다.

void main() 
{ 
    int position[16];// a vector 
    int buffer[16] = {10, 1,3, 11, 2, 12, 8, 7, 4, 6, 9, 13, 15, 16, 5, 14}; 
    int buffer_copy[16];// copy of original buffer 

    int i, j; 
    for (i=0; i<16; i++) 
    { 
      buffer_copy[i]=buffer[i]; 
    }  

    for(i=0; i<16; i++) 
    { 
     position[buffer[i]]= i; 
     printf("\n the position of element %d in position array is: %d", 
       buffer[i], position[buffer[i]]); 
    } 

    int next = 8; 
    for (i =1; i<16; i++) 
    { 
     int pos, q=0; 
     pos = position[i]; 

     // **To check the number of positions unchecked between 0 and pos.** 
     for (j=0; j<pos; j++) 
     { 
      if(buffer_copy[j]>=0) 
      { 
       q=q+1; 
      } 
      buffer_copy[pos] =-1; 
     } 
     printf("\n the value for Q is :%d", q); 
    } 
} 

은 위의 코드는 내가이 올바른지 여부를 확인하지 오전 다음과 같은 출력을 보여주고있다 :

다음은 내가 사용했던 코드의 조각이다.

위치 배열 요소 (10)의 위치는

이다 : 0
위치 배열의 요소 1의 위치는 : 1
위치 배열의 요소 (3)의 위치는 2
위치의 소자 (11)의 위치 어레이는 : 3
위치 배열의 요소 (2)의 위치는 다음 4
위치 배열 요소 (12)의 위치는 다음 5
위치 배열 요소 (8)의 위치는 6
소자 (7)의 총수 위치 배열은 7
입니다. 위치 배열 요소 (4)의 위치가: 8
위치 어레이 소자 (6)의 위치는 9
위치 어레이 소자 (9)의 위치는 다음과 위치 배열 요소 (13)의 위치가 10
: 11
위치 배열 요소 (15)의 위치는 12
위치 배열 요소 (16)의 위치는 13
위치 배열 요소 (5)의 위치는 14
위치 배열 요소 (14)의 위치 다음과 같습니다 : 15
Q 값은 다음과 같습니다. 1
va Q 용 루이다 : 3
Q 값은 다음과 Q 값이 5
: Q 값이 10
: Q 값이 5
: Q의 값은 1
: 4
Q 값은 3
Q 값은 3
Q 값은 : Q의 값은 1
: Q의 값은 0
값 1
Q는 다음과 같습니다. 1
값 Q는 다음과 같습니다. 3
Q의 값은 다음과 같습니다. 1

이 작업을 수행하는 데 도움이 될만한 의견이나 제안이 있으면 감사드립니다.

+0

댓글이 확장 된 논의하지 않습니다; 이 대화는 [채팅으로 이동되었습니다] (http://chat.stackoverflow.com/rooms/159422/discussion-on-question-by-user5424164-representation-of-permutation-of-integer-i). – Andy

답변

2

레머 인코딩이 목표의 경로 인 것 같습니다.
(기술 용어 제공에 감사드립니다.)

이 시점에서 가능할 수있는 숫자 중 항상 첫 번째 숫자를 4 비트로 인코딩 할 수 있습니다. 필요한 비트 수를 추측 할 필요가 없으며 항상 4입니다. 그런 다음 나머지 숫자 중에서 색인으로 다음 번호를 인코딩합니다 (첫 번째 문자가 반복되지 않기 때문에). 여전히 4 비트.
인코딩 할 비트의 양은 마침내 8 개의 숫자 만 남아있는 경우 3으로, 가능한 4 개의 숫자 만 남아있는 경우 2로, 마지막 두 숫자 사이의 선택에 대해 1, 마지막으로 가능한 숫자를 인코딩하기 위해 실제로 0 비트로 떨어집니다 .

것이라고 8 * 4 + 4 * 3 + 2 * 2 * 1 + 1 + 1 = 0 * 49

일예

1,16,3,8,11,13,7,2,4,5,6,12,15,14,9,10 

1, index 0 among 16 possibles (1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,16): 0000 
16, index 14 among 15 possibles (_,2,3,4,5,6,7,8,9,A,B,C,D,E,F,16): 1110 
3, index 1 among 14 possibles (_,2,3,4,5,6,7,8,9,A,B,C,D,E,F,_) : 0001 
8, index 5 among 13 possibles (_,2,_,4,5,6,7,8,9,A,B,C,D,E,F,_) : 0101 
11, index 7 among 12 possibles (_,2,_,4,5,6,7,_,9,A,B,C,D,E,F,_) : 0111 
13, index 8 among 11 possibles (_,2,_,4,5,6,7,_,9,A,_,C,D,E,F,_) : 1000 
7, index 4 among 10 possibles (_,2,_,4,5,6,7,_,9,A,_,C,_,E,F,_) : 0100 
2, index 0 among 9 possibles (_,2,_,4,5,6,_,_,9,A,_,C,_,E,F,_) : 0000 
4, index 0 among 8 possibles (_,_,_,4,5,6,_,_,9,A,_,C,_,E,F,_) : 000 
5, index 0 among 7 possibles (_,_,_,_,5,6,_,_,9,A,_,C,_,E,F,_) : 000 
6, index 0 among 6 possibles (_,_,_,_,_,6,_,_,9,A,_,C,_,E,F,_) : 000 
12, index 2 among 5 possibles (_,_,_,_,_,_,_,_,9,A,_,C,_,E,F,_) : 010 
15, index 3 among 4 possibles (_,_,_,_,_,_,_,_,9,A,_,_,_,E,F,_) : 11 
14, index 2 among 3 possibles (_,_,_,_,_,_,_,_,9,A,_,_,_,E,_,_) : 10 
9, index 0 among 2 possibles (_,_,_,_,_,_,_,_,9,A,_,_,_,_,_,_) : 0 
10, only one remaning, no encoding 

인코딩에 필요한 비트 수는 항상 49 : 4 * 8 + 3 * 4 + 2 * 2 + 1 + 0입니다.제 8 개 숫자
항상 4 비트, 다음 4 개 숫자 항상 3 비트
,
항상 2 비트는 다음 두 숫자,
항상 다음의 1 비트가 지속하고
항상 0 비트의 마지막 번호.

Lehmer 코드에 대한 흥미로운 링크가있는 Ians 주석을 발견했습니다.
내가 위에서 설명한 것 같아.

코드의 첫 번째 부분이 인코딩 권한을 갖도록 변경되었습니다.
코드의 두 번째 부분 인 Q 값을 나타내는 부분을 이해하지 못했습니다.

#include <stdio.h> 

void main(void) 
{ 
    int position[16];// a vector 
    int buffer[16] = {10, 1,3, 11, 2, 12, 8, 7, 4, 6, 9, 13, 15, 16, 5, 14}; 
    int buffer_copy[16];// copy of original buffer 

    int i, j; 
    for (i=0; i<16; i++) 
    { 
      buffer_copy[i]=i; 
    } 

    for(i=0; i<16; i++) 
    { int pos=0; 
     for(j=0; j<16; j++) 
     { 
      if(buffer_copy[j]==0) 
      { /* nothing */ 
      } else if (buffer_copy[j]==buffer[i]) 
      { 
       buffer_copy[j]=0; 
       break; 
      } else 
      { 
       pos++; 
      } 
     } 
     position[i]=pos; 

     printf("\n the index of '%2d' among the remaining numbers is: %d", 
       buffer[i], position[i]); 
    } 

} 

출력 :

the index of '10' among the remaining numbers is: 9 
the index of ' 1' among the remaining numbers is: 0 
the index of ' 3' among the remaining numbers is: 1 
the index of '11' among the remaining numbers is: 7 
the index of ' 2' among the remaining numbers is: 0 
the index of '12' among the remaining numbers is: 6 
the index of ' 8' among the remaining numbers is: 4 
the index of ' 7' among the remaining numbers is: 3 
the index of ' 4' among the remaining numbers is: 0 
the index of ' 6' among the remaining numbers is: 1 
the index of ' 9' among the remaining numbers is: 1 
the index of '13' among the remaining numbers is: 1 
the index of '15' among the remaining numbers is: 2 
the index of '16' among the remaining numbers is: 2 
the index of ' 5' among the remaining numbers is: 0 
the index of '14' among the remaining numbers is: 0 
+0

위의 코드는 위치 배열의 위치 0에 둘 이상의 요소를 표시하고 있습니다. 이것이 어떻게 가능할까요? – user5424164

+0

1-6이 사용 된 경우 나머지 가능한 숫자 중 인덱스이며 나머지 7 개는 가능한 나머지 숫자의 인덱스 0에 있습니다. 코드 앞의 예에서 설명했습니다. – Yunnosch

+0

비트의 형태로 주어진 정수를 압축해야하는데 실제로 비트 단위로 인쇄하는 방법에 대한 도움이 필요합니다. – user5424164