我承认这个问题是学校编程任务的一部分(虽然很小),但我无法在网上找到很多提示,到目前为止我的解决方案非常缓慢。
这是我更准确地定义的问题: 给定整数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);
}
}
我不知道如何使这个代码更有效率,所以任何帮助都表示赞赏!