【问题标题】:What is the BigO complexity of intersection for TreeSet algorithm? [closed]TreeSet 算法的交集的 BigO 复杂度是多少? [关闭]
【发布时间】:2013-12-14 14:04:57
【问题描述】:

以下算法的 BigO 复杂度是多少:

boolean intersection(TreeSet<?> set1, TreeSet<?> set1){
   if(set1.size() > set2.size()){
      return intersection(set2, set1);
   }
   for (Object e: set1){
       if(set2.contains(e)) return true;
   }
   return false;

}

更新:

 N:=set1.size()
  K:=set2.size()

可能的答案: O(N*K) 或 O(N*log(K)) 或 O(K*log(N)) 或 O(N+K)

【问题讨论】:

  • 这些树集是否已排序和平衡?
  • @arturgrzesiak TreeSet 已排序
  • 你的猜测是什么?我们没有得到作业成绩...
  • 应该是O(n * log k),如果您使用“双指针”方法,您可以在O(n) 中执行。也许您想查找两个排序集的交集。
  • 这个问题属于cs.stackexchange.com

标签: java complexity-theory


【解决方案1】:
O(N * log M)

N - set1 的大小,M - set2 的大小

因为我们迭代 set1 元素 (N) 对于每次迭代,我们调用contains 方法,即logM 复杂度

TreeSetjavadoc:

此实现为基本的 操作(添加、删除和包含)。

【讨论】:

  • 我觉得性能不是O(N log K)
  • @Sage 我不同意树迭代是O(n * log n)。迭代器所做的所有事情都是中序遍历。这绝对是 O(n)。
  • 那么,我们应该如何在树上按顺序遍历呢?节点之间必须存在什么样的关系?是否有任何支持证据或实现表明我们实际上可以遍历O(n) 中平衡二叉搜索树的所有元素?
  • 每个节点都有一个父节点。所以我们实际上在树中向上移动。看看stackoverflow.com/questions/5471731/…
  • 谢谢。我不敢相信我忽略了这种不成熟的理论知识。实际上successor(e) 电话让我对next() 电话感到困惑,正如我在回答中指出的那样:(。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2012-08-14
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
相关资源
最近更新 更多