对于在C ++中有效实现比较算法的帮助,我将不胜感激。 我的程序得到一个由整数序列行组成的输入,我需要找到哪些序列是重复的。但是一些序列可能会转移到一边,它应该仍然是平等的。 我的意思是例如序列{0,1,25,5,9}和{22,5,9,0,1}应该相等。这些序列或重复序列的数量可以是一定大小。
我似乎无法想到任何在某种程度上有效的事情(将所有其他新行与其他所有行进行比较需要花费太多时间),所以我希望有人可以提供帮助。提前谢谢!
答案 0 :(得分:2)
我能想到的一个解决方案是计算一个不依赖于旋转的哈希值。例如:
unsigned long long hash(const std::vector<int>& seq) {
unsigned long long result;
for (int i=0,n=seq.size(),j=n-1; i<n; j=i++) {
result ^= seq[i] * 69069ULL + seq[j];
}
return result;
}
然后,您可以创建一个std::map
映射哈希码来列出序列中的索引,因此只有在哈希值相同的情况下才需要进行全面检查。
答案 1 :(得分:0)
如果我理解正确,问题是检查两个序列在旋转后是否彼此匹配。例如,序列{0,1,22,5,9}被认为与序列相同
{1, 22, 5, 9, 0}
{22, 5, 9, 0, 1}
{5, 9, 0, 1, 22}
{9, 0, 1, 22, 5}
很明显,如果两个序列的长度不同,则它们是不相同的。如果它们具有相同的长度,则解决此问题的最简单方法是复制第二个序列,并检查第一个序列是否是重复序列的子序列。
例如,要检查序列{0,1,22,5,9}和{22,5,9,0,1}是否相同,只需检查{0,1,22,5,9}是{22,5,9,0,1,22,5,9,0,1}的一部分。
直接改进这种方法可以摆脱多余内存的使用。例如,您可以搜索第二个序列中第一个序列的第一个元素,然后从匹配的点进行比较。