【问题标题】:finding a repeat element in an array in O(n log^2(n))time在 O(n log^2(n)) 时间内找到数组中的重复元素
【发布时间】:2016-03-14 17:05:40
【问题描述】:

我正在研究一种算法来查找数字数组中的第一个重复元素。我知道要做到这一点,我应该对我的数组进行排序(在 O(nlogn) 中使用合并排序),然后在对元素 (O(logn)) 执行二进制搜索时遍历数组。所以我的算法的总运行时间是 O(nlogn)+O(logn)= O(nlogn)。我的问题是我缺少什么来使它成为 O(nlog²n)。我不明白为什么日志会被平方。

问题陈述:

你收到一个整数列表,一次一个,a1,a2,... 我想要 你找到第一次出现的人工智能 以前,即找到最小的 i 使得所有 a1,a2,...,ai-1 是不同的,但对于某些1≤j<i,ai=aj。描述 O(i log2 i) 时间 寻找最小 i 的算法。 ( 给出一个递归算法 使用主定理形成并显示其运行时间。 )

【问题讨论】:

  • 是什么让你相信它应该是 O(nlog²n)?我怀疑你忘记了那里的大 O。
  • 问题要求在 O(nlog^2n) 中找到此算法。我不确定为什么作为 nlogn 会更快。
  • 很高兴向我们展示这个问题,如果这当然不是问题的话。 :)
  • 您收到一个整数列表,一次一个,a1,a2,... 我希望您找到之前出现的第一次出现的 ai,即找到最小的 i使得所有 a1,a2,...,ai-1 都是不同的,但对于 some1≤j
  • 我认为 O(n log2 n) 不是 O(n log^2 n) 而是 O(n log_2 n) - 基数 2 的日志

标签: algorithm sorting search big-o


【解决方案1】:

按如下方式使用 BST:

  1. 初始化二叉搜索树
  2. 对于出现的每个新元素,将其插入树中并更新树
  3. 每当您发现 BST 中已经存在的元素时,=> 您已找到最小的 i 索引

在插入第 k 个元素时,更新树的复杂度为 O(kLogk)。

【讨论】:

    【解决方案2】:

    您的算法不正确,因为它的运行速度比实际问题的要求要慢。

    这个问题特别要求在O(i logi) 时间运行,其中i 是第一个骗子。如果您在完成数字流时执行算法,那么您太慢了(流也可能是无限的!)如果您对每个新数字重复您的算法,它将运行得太慢(1log1 + 2log2 + 3log3 + ... + ilogi 不在@987654325 中@)。

    您可以通过维护一个集合(基于self balancing BST)来做到这一点,并且当一个新元素出现时:

    check if it is in the set
    if it is:
      abort - found the first dupe
    otherwise:
      add it.
    

    另请注意,要求(如您提供的)是O(i log_2i),而不是O(i*log^2(i))

    【讨论】:

      【解决方案3】:

      查找重复元素只需要 O(n log n) 时间。

      一旦你对你的数组进行了排序,你重复的元素就会彼此相邻;您不需要执行二分搜索。


      针对已编辑的问题进行编辑:

      如果您需要在线流算法而不是批处理任务,那么您可以使用已经遇到的元素的平衡搜索树。这应该比前 i 个元素提供 O(i log i) 性能。

      【讨论】:

      • 这没有回答问题,也没有解决O(i log2 i)复杂性的问题(当第一个副本到来时,流不会结束)。
      • 对数组进行排序并跟踪排序后的整数将解决排序后n的问题。这意味着大 O 是 nlgn ,这是排序复杂度。我相信这个答案是正确的。
      • @hasan83 这个问题要求O(i logi) 复杂性,i 是第一个骗子。 n 可能比 i 大得多(并且流实际上可能是无限的),这将使该解决方案的运行时间超过问题定义中所需的时间。
      • 事实上,我确实回答了第一次出现的问题;我也提供了更新版本的答案。
      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      相关资源
      最近更新 更多