Algorithm 合并搜索树并在其中查找元素
我在关于搜索树的算法和数据结构的理论作业中遇到了这个问题: 给定n个数字a1,…,an,最初每个数字都在自己的集合中。有两种类型的查询:Algorithm 合并搜索树并在其中查找元素,algorithm,binary-search-tree,complexity-theory,Algorithm,Binary Search Tree,Complexity Theory,我在关于搜索树的算法和数据结构的理论作业中遇到了这个问题: 给定n个数字a1,…,an,最初每个数字都在自己的集合中。有两种类型的查询: 统一两套, 在特定集合中找到大于x的最小元素 在这些查询中,set由其元素的{ai}索引之一指定。任务是在O(n+qlog(n))时间内处理q查询 我曾尝试使用AVL树来存储集合的元素,但这种方法会导致O(n log(n))或O(n)合并时间,因此无法满足总体时间复杂度要求。目前,我只有以下几个想法(但实际上它们没有多大帮助): 最多有n个unite查询 如果
实际上,您使用自平衡二叉搜索树来表示集合的解决方案是正确的,您的想法(1)-(3)对于实现更严格的渐近界至关重要 最初设置集合是O(n),在每个集合中搜索(找到大于x的最小元素)是O(logn),因此q搜索的代价是O(qlogn)
现在让我们考虑合并操作。要合并大小为a和b的两个二叉搜索树,请将较小树的所有元素插入较大树。这可以在
O(最小(a,b)*log(最大(a,b)+1)中完成
但是,如果我们从单例集合开始,q连续合并操作的复杂性是什么?我们可以通过归纳法证明,对于q
因此,q合并操作的成本是q-1合并的成本加上最后一次合并的成本。根据归纳假设,q-1合并的成本是O((q-1)logn)
最后一次合并的成本是O(min(a,b)*log(max(a,b)+1))
。但是a
和b
小于q
,因此对于最后一次合并,我们得到了O(q*log(q+1))的上界
。由于q
,这是O(qlogn)
的子集。因此,q合并操作的总成本是O((q-1)logn+qlogn)=O(qlogn)
因此,总的复杂度以O(n+q log n)为界。联合两个集合是什么意思?它意味着合并初始族中的两个集合。例如,如果n=3,开始时我们有三个集合:{a1},{a2},{a3},在unite(1,3)之后,新的集合是{a1,a3},{a2}。如果下一个查询是smallestbiger(x=10,set=3),那么我们需要在{a1,a3}中找到大于10的最小元素。