【问题标题】:Why is the following two duplicate finder algorithms have different time complexity?为什么以下两种重复查找算法具有不同的时间复杂度?
【发布时间】:2012-06-23 02:14:29
【问题描述】:

我正在阅读这个question。所选答案包含以下两种算法。我不明白为什么第一个的时间复杂度是 O(ln(n))。在最坏的情况下,如果数组不包含任何重复项,它将循环 n 次,第二个也是如此。我错了还是我错过了什么?谢谢

1) 一种更快(在极限内)的方式

这是一种基于哈希的方法。您必须为自动装箱付费,但它是 O(ln(n)) 而不是 O(n2)。一个有进取心的人会去寻找一个原始的基于 int 的哈希集(Apache 或 Google Collections 有这样的东西,我想。)

boolean duplicates(final int[] zipcodelist)
{
  Set<Integer> lump = new HashSet<Integer>();
  for (int i : zipcodelist)
  {
    if (lump.contains(i)) return true;
    lump.add(i);
  }
  return false;
}

2)向休勒鞠躬

查看 HuyLe 的答案以获得或多或少的 O(n) 解决方案,我认为这需要几个附加步骤:

static boolean duplicates(final int[] zipcodelist) {    
    final int MAXZIP = 99999;    
    boolean[] bitmap = new boolean[MAXZIP+1];    
    java.util.Arrays.fill(bitmap, false);    

    for (int item : zipcodeList)
        if (!bitmap[item]) bitmap[item] = true;
        else return true;    
    }

    return false; 
}

【问题讨论】:

  • 我认为对于“一种更快(在极限内)的方式”,作者打错字并打算写O(n*log(n)),这就是你从例如得到的。由平衡二叉搜索树支持的集合。很明显,没有比O(n) 更快的方法了。
  • 我没有得到 log(n) 部分。
  • 在平衡的 BST 中,插入和查找是 O(log(size)),所以如果你执行 n 查找和插入,你就有 O(n*log n) 操作。我想这就是日志的来源。
  • 如果你看到下面的答案,作者说它是 O(n) 但你说它是 O(nlog(n))。我无法确定哪个是正确的。你能看到答案吗?
  • 这取决于使用的集合类型的实现。对于使用平衡 BST 实现的集合,它是 O(n*log n)。对于 HashSet,如果 HashSet 保持 O(1) 插入和查找承诺,则为 O(n)。 (对于 HashSet 的错误实现,它可能会降级为 O(n^2),但我很乐观地认为 java.util.HashSet 不会。)我的猜测是链接问题的答案的作者认为 i> 首先是树集并将O(n*log n) 拼写为O(log n),后来决定使用HashSet,忘记更改复杂性。或者最初具有正确的复杂性并被错误纠正。

标签: algorithm time time-complexity duplicate-removal


【解决方案1】:

第一个解决方案的预期复杂度应该是 O(n),因为必须遍历整个邮政编码列表,并且处理每个邮政编码的预期时间复杂度是 O(1)。

即使考虑到插入 HashMap 可能会触发重新哈希,复杂度仍然是O(1)。这有点不合逻辑,因为 Java HashMap 与链接中的假设之间可能没有关系,但它表明这是可能的。

来自HashSet 文档:

此类为基本操作(添加、删除、包含和大小)提供恒定时间性能,假设散列函数在桶中适当地分散元素

第二个解也是一样,分析正确:O(n)。

(只是一个题外话,BitSet 比数组快,如原始帖子所示,因为 8 个booleans 被打包到 1 个byte 中,使用更少的内存)。

【讨论】:

  • 即两者具有相同的时间复杂度,O(n)。对吗?
  • @WowBow:时间复杂度相同(假设没有严重碰撞)。
  • 如果 Hash 被正确使用和实现,它们不应该是这样。这个答案不一定正确!
  • 抱歉,我正在测试整个集合,而不是单数输入。我错误地将其视为一组输入与另一组的测试。 +1 显然在我累了,刚生完孩子的状态下,我仍然可以轻松上学:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2016-03-24
相关资源
最近更新 更多