以位为

时间:2017-11-20 16:37:56

标签: c compression permutation

我试图表示N给定正整数的排列 例如。表示对于每个数字使用4位或更少的数字1-16的任意排列。

我们的想法是,我们可以用8 * 4 + 4 * 3 + 2 * 2 + 1 * 1 = 49位而不是64位来表示16的排列。
我有一个示例数据集如下[10 1 3 11 2 12 8 7 4 6 9 13 15 16 5 14]。

我尝试过以下c程序来实现这一目标,但我不确定如何在 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在位置阵列中的位置为:10
 元件13在位置阵列中的位置是:11
 元件15在位置阵列中的位置为:12
 元件16在位置阵列中的位置是:13
 元件5在位置阵列中的位置是:14
 元件14在位置阵列中的位置是:15
 Q的值是:1
 Q的值是:3
 Q的值是:1
 Q的值是:5
 Q的值是:10
 Q的值是:5
 Q的值是:4
 Q的值是:3
 Q的值是:3
 Q的值是:0
 Q的值是:1
 Q的值是:1
 Q的值是:1
 Q的值是:3
 Q的值是:1

我将感谢任何帮助或建议来完成这项任务。

1 个答案:

答案 0 :(得分:2)

Lehmer编码似乎是通往目标的途径 (感谢Ian Abbott提供技术术语。)

此时,您可以将范围的第一个数字ALWAYS编码为可能数字中的索引,取4位。无需猜测所需位数,始终为4.
然后将下一个数字编码为剩余可能数字中的索引(因为第一个数字不会重复),即只有15个中的一个;还是4位 当只剩下8个数字时,最后编码的所需位数减少到3,当只剩下4个可能的数字时减少到2,在最后两个可能的数字之间选择1,实际上是0位来编码最后一个可能的数字。 / p>

那将是8 * 4 + 4 * 3 + 2 * 2 + 1 * 1 + 1 * 0 = 49。

E.g。

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个数字总是2位,
始终为1位,为倒数第二位和 最后一个数字总是0位。

请注意,我刚发现Ians评论了Lehmer代码的有趣链接 我认为这就是我上面所描述的。

我更改了代码的第一部分以使编码正确。
我不明白代码的第二部分,即显示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