计算汉明距离小于或等于给定整数组的k的数字

时间:2018-03-10 16:30:49

标签: binary-data hamming-distance edit-distance

我承认这个问题是学校编程任务的一部分(虽然很小),但我无法在网上找到很多提示,到目前为止我的解决方案非常缓慢。

这是我更准确地定义的问题: 给定整数v和整数k的向量,计算存在多少个整数,使得来自v的所有整数的汉明距离(需要翻转以获得原始整数的位)小于或等于k。

这意味着给定v = {0000,0001}和k = 2,结果数字为{0000,0001,1001,0101,1001,1000,0100,0010},因此计数为8(真的希望我&#39 ;这里不算错误。)

到目前为止,我的方法是从v [0]生成所有潜在数字,然后将它们与向量中的其他数字进行比较。在代码中,它看起来像这样:

void CRig::Solve(AFITCoin x) {
// Get information from problem pointer
vector<uint32_t> &strings = (*x).m_Vectors;
const int max_dist = (*x).m_DistMax;

// Generate all potential strings
set<uint32_t> validStrings;
validStrings.insert(strings[0]);
generateValidStrings(strings[0], validStrings, max_dist);

// Compare generated strings to strings in vector
// and increment count if Hamming distance is in bound
for (uint32_t i : validStrings) {
    bool is_in_distance = true;
    for (uint32_t num : strings) {
        int hamm_dist = hammingDistance((int)i, (int)num);
        if (hamm_dist > max_dist) {
            is_in_distance = false;
            break;
        }
    }
    if(is_in_distance) (*x).m_Count++;
}

}


void generateValidStrings(uint32_t num, set<uint32_t> &validStrings, int dist_left) {
// Base case: Current distance is out of bounds
if (!dist_left)
    return;

// Flipping one bit at a time and proceed to bigger distance
for (int i = 0; i < 32; i++) {
    uint32_t newNum = num;
    newNum ^= (1u << i);
    validStrings.insert(newNum);
    generateValidStrings(newNum, validStrings, dist_left - 1);
}
}

我不知道如何使这个代码更有效率,所以任何帮助都表示赞赏!

0 个答案:

没有答案