我的算法有点卡住了,我需要一些帮助来解决我的问题。我认为一个例子可以更好地解释我的问题。
假设:
- d = 4(一个数字中允许的最大位数,2^4-1=15)。
- m_max = 1(允许的最大位数不匹配)。
- kappa =(对于给定的 d 和 m,要查找的最大元素数,其中 m 在 m_max 中)
主要思想是对于给定的数字 x,计算其补数(以二进制为基数)以及与 x 补数的最多 m_max 不匹配的所有可能组合。
现在程序开始从 i = 0 扫描到 15。
对于 i = 0 和 m = 0,kappa = \binom{d}{0} = 1(这称为完美匹配)可能的位组合只有 1111(对于 0: 0000)。
对于 i = 0 和 m = 1,kappa = \binom{d}{1} = 4(一个不匹配)可能的位组合是:1000、0100、0010 和 0001
我的问题是将其推广到一般 d 和 m。我写了以下代码:
#include <stdlib.h>
#include <iomanip>
#include <boost/math/special_functions/binomial.hpp>
#include <iostream>
#include <stdint.h>
#include <vector>
namespace vec {
typedef std::vector<unsigned int> uint_1d_vec_t;
}
int main( int argc, char* argv[] ) {
int counter, d, m;
unsigned num_combination, bits_mask, bit_mask, max_num_mismatch;
uint_1d_vec_t kappa;
d = 4;
m = 2;
bits_mask = 2^num_bits - 1;
for ( unsigned i = 0 ; i < num_elemets ; i++ ) {
counter = 0;
for ( unsigned m = 0 ; m < max_num_mismatch ; m++ ) {
// maximum number of allowed combinations
num_combination = boost::math::binomial_coefficient<double>( static_cast<unsigned>( d ), static_cast<unsigned>(m) );
kappa.push_back( num_combination );
for ( unsigned j = 0 ; j < kappa.at(m) ; j++ ) {
if ( m == 0 )
v[i][counter++] = i^bits_mask; // M_0
else {
bit_mask = 1 << ( num_bits - j );
v[i][counter++] = v[i][0] ^ bits_mask
}
}
}
}
return 0;
}
我陷入了困境,v[i][counter++] = v[i][0] ^ bits_mask
因为我无法将我的算法推广到 m_max>1,因为我需要 m_max 不匹配 m_max 循环,并且在我的原始问题中,m 在运行时之前是未知的。