我有一个简单的递归函数,它比较两个默克尔树并累积叶节点中的差异。但是,我无法衡量它的时间复杂度。具体来说,我想看看它与比较两个哈希表或两个 BST 相比如何。在这种情况下,一组叶子是一行,它们共享一个 rowid。一组行构成了整个 merkle 树。在下面的代码中,我只是在叶级别累积差异。
def diff_helper(node1: MNode, node2: MNode, diff: List[Difference]):
if not node1 and not node2:
return
elif node1.rowid==node2.rowid and node1.signature==node2.signature and node1.nodetype==NodeType.Row and node2.nodetype==NodeType.Row:
return
elif node1.rowid==node2.rowid and node1.signature!=node2.signature and node1.nodetype==NodeType.Row and node2.nodetype==NodeType.Row:
diff_helper(node1.left, node2.left, diff)
diff_helper(node1.right, node2.right, diff)
elif node1.rowid==node2.rowid and node1.signature!=node2.signature and node1.nodetype==NodeType.Leaf and node2.nodetype==NodeType.Leaf:
diff.append(Difference(node1.rowid, node1.column, node1.value, node2.value))
else:
diff_helper(node1.left, node2.left, diff)
diff_helper(node1.right, node2.right, diff)
时间复杂度:
在最好的情况下,我看到这是一个常量操作,因为两棵树的根哈希是相同的。在最坏的情况下,比较次数是所有叶节点的总数。
问题:
我可以感觉到 merkle 树比普通哈希表做得更好,因为它能够更快地修剪树。但是,我无法用大 O 术语来表示这一点。
一个类似的哈希表实现将是对第二个哈希表进行 rowid 遍历和恒定时间查找。一旦找到 rowid 的值,如果叶级数据存储为哈希表,您可能会对每个叶进行线性比较。