【问题标题】:repetition detection in O(Log n) in sorted array排序数组中 O(Log n) 中的重复检测
【发布时间】:2016-07-22 21:12:12
【问题描述】:

给定一个大小为 n 的排序整数数组 A,其中 n 是 4 的倍数。有人可以帮我找到一个算法来确定是否存在一个在数组中至少重复 n/4 次的元素O(log n) 时间。

【问题讨论】:

  • 这是一个有趣的问题,但问题的形式在这里非常不鼓励。
  • 这意味着至少有n/4 连续出现。只需考虑 4 个n/4 子数组获取中间元素并使用二分法搜索第一次和最后一次出现并检查它们的距离。它之所以起作用,是因为该元素要么出现在子数组x:x+n/4 的中间,要么出现在前一个块或下一个块的中间。事实上,这适用于任何数组大小,不同之处在于,当 n 不是 4 的倍数时,您必须重复此操作 5 次(尽管仍然是 O(log n))。
  • 事实上你甚至不必取中间元素。第一个适用于。只需选择子数组中的任何相对索引并检查所有子数组。如果不是重复的,则意味着 next 或 prio 子数组的第一个元素必须是它(如果有的话)。

标签: algorithm sorting array-algorithms


【解决方案1】:

如果有一个元素重复 n/4 次,它还必须占据以下索引之一:n/4, 2n/4, 3n/4, n

对于这些元素中的每一个,进行两次二进制搜索以找到它占用的第一个索引和最后一个。

这总共是 4*2 二进制搜索,每次都花费 O(logn) 时间。这使您的总运行时间为O(8*logn) = O(logn)

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多