Algorithm 查找具有最大公共集位数的一对位字符串

Algorithm 查找具有最大公共集位数的一对位字符串,algorithm,byte,bits,Algorithm,Byte,Bits,我想找到一种算法来查找数组中公共集位数最大的一对位字符串(在数组中的所有对中)。我知道通过比较数组中的所有比特串对可以做到这一点,但这是O(n2)。有没有更有效的算法?理想情况下,我希望算法通过在每次迭代中处理一个传入的位字符串来递增工作 例如,假设我们有一个位字符串数组(长度为8): 这里最好的一对是B2和B3,它们有四个公共设置位 我发现一篇论文似乎描述了这样一种算法(S.Taylor&T.Drummond(2011);“;Int.J.Compute.Vis.94:241–265),但我不理

我想找到一种算法来查找数组中公共集位数最大的一对位字符串(在数组中的所有对中)。我知道通过比较数组中的所有比特串对可以做到这一点,但这是O(n2)。有没有更有效的算法?理想情况下,我希望算法通过在每次迭代中处理一个传入的位字符串来递增工作

例如,假设我们有一个位字符串数组(长度为8):

这里最好的一对是
B2
B3
,它们有四个公共设置位

我发现一篇论文似乎描述了这样一种算法(S.Taylor&T.Drummond(2011);“;Int.J.Compute.Vis.94:241–265),但我不理解第252页的描述:

这可以在每次迭代中进行增量更新,因为需要重新计算的唯一[bitstring]重叠是新父特征的重叠以及根目录中的任何其他[bitstring],其“最重叠特征”是选择用于组合的两个特征之一。这避免了在每次迭代中进行O(N2)重叠比较的需要,并允许在一秒钟内为700个特征的典型大小的数据库构建一个林


据我所知,Taylor&Drummond(2011)并不打算给出一种O(n)算法,用于在具有最大公共集位数的数组中查找位串对。他们提出了一个论点,即在向数组中添加一个新的位字符串(并删除两个旧的位字符串)后,可以在O(n)中更新最好的这类对的记录

当然,第252页对算法的解释不是很清楚,我认为他们关于记录可以在O(n)中更新的粗略论点充其量是不完整的,所以我可以理解为什么你会感到困惑

无论如何,这是我从论文中解释算法1的最佳尝试

算法 该算法采用一个位字符串数组并构造一个查找树。查找树是一个二叉林(二叉树集),其叶子是数组中的原始位字符串,其内部节点是新位字符串,如果节点A是节点B的父节点,则A&B=A(即,A中的所有集合位也在B中设置)

例如,如果输入是此位字符串数组:

然后输出为查找树:

本文描述的算法如下所述:

  • 设R为位字符串的初始集(根集)

  • 对于R中没有伙伴的每个位字符串f1,查找并记录其伙伴(R中的位字符串f2)−{f1}具有与f1相同的最大设置位数),并记录它们具有相同的位数

  • 如果R中没有一对具有任何公共设置位的位字符串,请停止

  • 设f1和f2是R中公共集位数最大的一对位字符串

  • 设p=f1&f2为f1和f2的父项

  • 从R上移除f1和f2;把p加到R

  • 转至步骤2

  • 分析 假设数组包含n个固定长度的位字符串。然后,所描述的算法是O(n3),因为步骤2是O(n2),并且有O(n)次迭代,因为在每次迭代中,我们从R中删除两个比特串,然后添加一个

    论文中包含一个论点,即步骤2仅在循环的第一次是Ω(n2),而在其他迭代中是O(n),因为我们只需要找到p“和R中的任何其他位字符串的伙伴,其伙伴是选择组合的两个位字符串之一。”然而,这个论点不能让我信服:不清楚是否只有O(1)个其他这样的位字符串。(也许有更好的理由?)

    通过存储每对位字符串之间的公共集位数,我们可以将算法降到O(n2)。这需要O(n2)额外的空间

    参考文献
    • S.Taylor&T.Drummond(2011)。“用于高效和稳健匹配的二进制直方图强度块”。国际计算机杂志。维斯。94:241–265

    据我所知,Taylor&Drummond(2011)并未提出一种O(n)算法,用于在具有最大公共集位的数组中查找一对位字符串。他们提出了一个论点,即在向数组中添加一个新的位字符串(并删除两个旧的位字符串)后,可以在O(n)中更新最好的这类对的记录

    当然,第252页对算法的解释不是很清楚,我认为他们关于记录可以在O(n)中更新的粗略论点充其量是不完整的,所以我可以理解为什么你会感到困惑

    无论如何,这是我从论文中解释算法1的最佳尝试

    算法 该算法采用一个位字符串数组并构造一个查找树。查找树是一个二叉林(二叉树集),其叶子是数组中的原始位字符串,其内部节点是新位字符串,如果节点A是节点B的父节点,则A&B=A(即,A中的所有集合位也在B中设置)

    例如,如果输入是此位字符串数组:

    然后输出为查找树:

    本文描述的算法如下所述:

  • 设R为位字符串的初始集(根集)

  • 对于R中没有伙伴的每个位字符串f1,查找并记录其伙伴(R中的位字符串f2)−{f1}具有与f1相同的最大设置位数),并记录它们具有相同的位数

  • 如果R中没有一对具有任何公共设置位的位字符串,请停止

  • 设f1和f2是R中公共集位数最大的一对位字符串

  • 设p=f1&f2为f1和f2的父项

  • 从R上移除f1和f2;把p加到R

  • 转至步骤2

  • 分析 假设数组
    B1:01010001 
    B2:01101010
    B3:01101010
    B4:11001010
    B5:00110001