Algorithm 两个循环缓冲区相等吗?(忽略移位)

Algorithm 两个循环缓冲区相等吗?(忽略移位),algorithm,Algorithm,我有两个循环缓冲区——我如何判断一个缓冲区是否只是另一个缓冲区的移位 例如,B1=1,1,2,1,8,1,5,7,B2=2,1,8,1,5,7,1,1我们可以说B1和B2是相等的,因为我可以旋转其中一个来得到另一个 测试这个等式的最佳算法是什么?明显的测试是在O(n^2)(只需比较缓冲区-在n步骤中-从每个n元素开始),但我相信我已经看到了线性时间算法。你能给我指一下吗?假设B1和B2长度相同,你的问题就相当于问“B2是B1+B1的子串吗”(B1与自身连接) 例如:4元素字符串是1234的旋转,

我有两个循环缓冲区——我如何判断一个缓冲区是否只是另一个缓冲区的移位

例如,
B1=1,1,2,1,8,1,5,7
B2=2,1,8,1,5,7,1,1
我们可以说B1和B2是相等的,因为我可以旋转其中一个来得到另一个


测试这个等式的最佳算法是什么?明显的测试是在
O(n^2)
(只需比较缓冲区-在
n
步骤中-从每个
n
元素开始),但我相信我已经看到了线性时间算法。你能给我指一下吗?

假设
B1
B2
长度相同,你的问题就相当于问“B2是
B1+B1
的子串吗”(
B1
与自身连接)

例如:4元素字符串是
1234
的旋转,当且仅当它是
12341234
的子字符串时


检查一个字符串是否是另一个字符串的子字符串可以在线性时间内使用。

如果缓冲区是整数,我想也许你可以使用加法作为交换属性
(a+b==b+a)
这意味着列表的开始并不重要。但另一方面,如果项目的顺序不正确,我们可以将其成对或三人关联起来,以确保项目的顺序正确。
(1+2+3+4)=(3+1+2+4)
。为了更好地确保链接顺序<代码>(12+23+34+41)或类似的东西

var B1 = [1,1,2,1,8,1,5,7]
var B2 = [2,1,8,1,5,7,1,1]
var B3 = [2,1,8,1,5,7,1,4]

function checksum(buff)
{
    var sum = 0
    for(var i = 0 ; i < buff.length;i++)
    {
        var a  = buff[i];
        var b  = buff[(i+1)%buff.length];
        var c  = buff[(i+2)%buff.length];
        var n = ((a*100) + (b * 10) + c);
        sum += n;
    }
    return sum;
}
console.log(checksum(B1) == checksum(B2))//true
console.log(checksum(B1) == checksum(B3))//false
var B1=[1,1,2,1,8,1,5,7]
变量B2=[2,1,8,1,5,7,1,1]
变量B3=[2,1,8,1,5,7,1,4]
函数校验和(buff)
{
var总和=0
对于(变量i=0;i
这是一个“顺序敏感”循环校验和

但是像每个散列函数一样,会有冲突和误报,因此您仍然需要第二种比较方法


我不知道我是否在正确的轨道上。。希望有人能帮助改进或完全反驳。

难道你不知道两个缓冲区的头部或尾部吗?缓冲区中的元素数量相同吗?@smk如果不相同,那么只需简单的大小比较就可以解决问题。我想我们可以保证它们的大小相同。我认为搜索循环排列是一个好方法。在两个缓冲区之间找到最长的公共子数组,其余的很容易计算出来。它可以在线性时间内完成。检查此项了解更多详细信息Z算法也是另一种选择,但可能更易于编码和理解(对于某些人)。但这仍然会导致
O(n^2)
solution@CaldasGSM为什么呢检查长度-
O(1)
。复制字符串-
O(n)
,KMP/Z算法-
O(2n)=O(n)
。我想我看到的不是KMP。我心目中的算法使用了相同的连接技巧,然后做了类似于从最小元素开始的事情。有什么想法吗?