用“Treap”来比较两组

时间:2013-06-16 08:39:40

标签: algorithm data-structures graph search-tree treap

我想使用Treap结构,但我不熟悉这种类型的树。

我有两套,我想写一个方法来与Treap进行比较。此方法应返回一个显示两组相似性的值。 (我的工作是检索一个与输入集大致相似的集合)

我该怎么做这项工作?

由于

1 个答案:

答案 0 :(得分:2)

树堆

Treap是平衡二进制搜索树的一个示例(您可以使用它们中的任何一个来解决此问题)。包含n个元素的Treap的预期高度是O(logn) - 预期,因为Treap是随机数据结构。

以下解决方案适用于任何二进制搜索树,但如果使用平衡二进制搜索树(例如Treap),它会表现得更好。

测量

两组之间相似性的一个衡量标准是Jaccard Index。让我们调用我们的集合A和B.雅克卡指数定义如下:

enter image description here

因此,要计算A和B的Jaccard指数,我们必须计算A和B的和和交点。

操作

假设A和B实现为平衡二进制搜索树。

二进制搜索树可以支持许多操作,但其中三个足以解决此问题:

  • find(x) - 如果只有x在树中
  • ,则返回true
  • insert(x) - 如果在此操作之前x不在树中,则在树中插入x
  • size() - 返回树中元素的数量

在平衡二进制搜索树中,find(x)和insert(x)具有O(logn)运行时间,其中n是树中元素的数量。

此外,在插入过程中,我们可以跟踪树的大小,因此size()可以在一个恒定的时间内实现。

当然,我们可以遍历树的所有元素。

伪代码

第1步。

sum(A, B):

    C = A 

    foreach x in B:
        C.insert(x)

    return C

第2步。

intersection(A, B):

    C = new BalancedBinarySearchTree()

    foreach x in B:
        if(A.find(x) == true):
            C.insert(x)

    return C

第3步。

计算A和B的Jaccard指数:

JaccardIndex(A, B)
    S = sum(A, B)
    I = intersect(A, B)

    return I.size() / S.size()

复杂性

我们假设:

n = A.size()
m = B.size()

然后计算和的复杂度是O(n + m * log(n + m)),并且计算交点的复杂度是O(m * log n)。