Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 合并搜索树并在其中查找元素_Algorithm_Binary Search Tree_Complexity Theory - Fatal编程技术网

Algorithm 合并搜索树并在其中查找元素

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查询 如果

我在关于搜索树的算法和数据结构的理论作业中遇到了这个问题:

给定n个数字a1,…,an,最初每个数字都在自己的集合中。有两种类型的查询:

  • 统一两套,
  • 在特定集合中找到大于x的最小元素
  • 在这些查询中,set由其元素的{ai}索引之一指定。任务是在O(n+qlog(n))时间内处理q查询

    我曾尝试使用AVL树来存储集合的元素,但这种方法会导致O(n log(n))或O(n)合并时间,因此无法满足总体时间复杂度要求。目前,我只有以下几个想法(但实际上它们没有多大帮助):

  • 最多有n个unite查询
  • 如果q>n,最终,我们需要构建一个包含所有n个{ai}元素的搜索树来处理类型(2)的最后(q-n)个查询。因此,首先用q来解决问题似乎是合理的≤ 然后自然地将解扩展到q>n
  • 要创建一个包含(k+1)个元素的集合,至少需要k个合并操作(这很容易通过数学归纳证明),因此在处理查询的每个步骤中,我们只需要处理“不太大”的集合。这可能会产生一些严格的渐近估计
  • 也许有一种方法可以在处理前先扫描几个查询,了解类型(2)查询中涉及哪些集合,然后只合并它们,而忽略其他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的最小元素。