我试图表示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
我将感谢任何帮助或建议来完成这项任务。
答案 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