C ++对整数序列的有效比较(按相对顺序)

时间:2016-11-26 13:55:43

标签: c++ algorithm comparison complexity-theory sequences

对于在C ++中有效实现比较算法的帮助,我将不胜感激。 我的程序得到一个由整数序列行组成的输入,我需要找到哪些序列是重复的。但是一些序列可能会转移到一边,它应该仍然是平等的。 我的意思是例如序列{0,1,25,5,9}和{22,5,9,0,1}应该相等。这些序列或重复序列的数量可以是一定大小。

我似乎无法想到任何在某种程度上有效的事情(将所有其他新行与其他所有行进行比较需要花费太多时间),所以我希望有人可以提供帮助。提前谢谢!

2 个答案:

答案 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}的一部分。

直接改进这种方法可以摆脱多余内存的使用。例如,您可以搜索第二个序列中第一个序列的第一个元素,然后从匹配的点进行比较。