我想使用Treap结构,但我不熟悉这种类型的树。
我有两套,我想写一个方法来与Treap进行比较。此方法应返回一个显示两组相似性的值。 (我的工作是检索一个与输入集大致相似的集合)
我该怎么做这项工作?
由于
答案 0 :(得分:2)
Treap是平衡二进制搜索树的一个示例(您可以使用它们中的任何一个来解决此问题)。包含n个元素的Treap的预期高度是O(logn) - 预期,因为Treap是随机数据结构。
以下解决方案适用于任何二进制搜索树,但如果使用平衡二进制搜索树(例如Treap),它会表现得更好。
两组之间相似性的一个衡量标准是Jaccard Index。让我们调用我们的集合A和B.雅克卡指数定义如下:
因此,要计算A和B的Jaccard指数,我们必须计算A和B的和和交点。
假设A和B实现为平衡二进制搜索树。
二进制搜索树可以支持许多操作,但其中三个足以解决此问题:
在平衡二进制搜索树中,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)。