Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 用10个设置位查找第n个整数_Optimization_Combinatorics - Fatal编程技术网

Optimization 用10个设置位查找第n个整数

Optimization 用10个设置位查找第n个整数,optimization,combinatorics,Optimization,Combinatorics,用10个设置位查找第n个整数 n是0范围内的int值,让我们考虑k=10位集合的数。 诀窍是确定给定n的最重要的一个的排名 只有一个长度k:C(k,k)=1。有k+1=C(k+1,k)个长度为k+1。。。有长度为m的C(m,k)个数 对于k=10,极限n为1+10+55+220+715+2002+5005+11440+ 对于给定的n,很容易找到对应的m。然后将问题归结为在设置了k-1位的情况下求第n-C(m,k)个数。以此类推 对于预计算表,这可能非常快。30045015需要30次查找,因此我猜

用10个设置位查找第n个整数

n是0范围内的int值,让我们考虑k=10位集合的数。 诀窍是确定给定n的最重要的一个的排名

只有一个长度k:C(k,k)=1。有k+1=C(k+1,k)个长度为k+1。。。有长度为m的C(m,k)个数

对于k=10,极限n为1+10+55+220+715+2002+5005+11440+

对于给定的n,很容易找到对应的m。然后将问题归结为在设置了k-1位的情况下求第n-C(m,k)个数。以此类推

对于预计算表,这可能非常快。30045015需要30次查找,因此我猜最坏的情况是29 x 30/2=435次查找

(这是基于线性查找,以支持较小的值。通过二分法搜索,您可以将其减少到小于29 x lg(30)=145个查找(更差)


更新:

我以前的估计是悲观的。事实上,当我们寻找k位时,只有10个m的确定值。在线性情况下,在较差的245次查找时,在二分法情况下,小于50次


(我不排除估算中的一个或多个错误,但显然这种方法非常有效,不需要势利。)

我已经构建了一个实现,应该能够满足您的需要

/**一个查找表,查看有多少个组合在这一个之前*/
私有静态int[][]查找\表\组合\位置;
/**具有i位的可能组合数*/
专用静态int[]NBR_组合;
静止的{
LOOKUP_TABLE_composition_POS=newint[Integer.SIZE][Integer.SIZE];
用于(int位=0;位0;//对于模检查很重要。否则我们必须使用无符号算术
}
}
私有静态int-nChooseK(int-n,int-k){
断言k>=0&&k n/2){
k=n-k;
}
长nCk=1;//(N选择0)
for(int i=0;i0){
final int[]位位置=查找表组合位置[nbrBits];
//搜索最大的bitPos,使其位置>=bitPositions[bitPos]
while(整数.compareUnsigned(位置,位位置[m])<0)
m--;
位置-=位位置[m];

v^=(0b1右,我交换了2*15*,7*20*。这些数字直接从帕斯卡的三角形中读取。
int snob(int n) {
    int a=n&-n, b=a+n;
    return b|(n^b)/a>>2;
  }
int nth(int n){
int o =1023;
for(int i=0;i<n;i++)o=snob(o);
return o;
}
1023<<1 is the 10th  
1023<<2 is the 65th  
1023<<3 the 285th  
...  
int lnbp(int v){
 int t = (v | (v - 1)) + 1;  
 return t | ((((t & -t) / (v & -v)) >> 1) - 1);  
}
nextCombination(0b1111111111,  1) == 0b10111111111;
nextCombination(0b1111111111, 10) == 0b11111111110;
nextCombination(0x00FF      ,  4) == 0x01EF;
nextCombination(0x7FFFFFFF  ,  4) == 0xF7FFFFFF;
nextCombination(0x03FF      , 10) == 0x07FE;
// Correct wrapping
nextCombination(0b1         , 32) == 0b1;
nextCombination(0x7FFFFFFF  , 32) == 0x7FFFFFFF;
nextCombination(0xFFFFFFEF  ,  5) == 0x7FFFFFFF;