【问题标题】:algorithm to find the three majority elements in an array查找数组中三个多数元素的算法
【发布时间】:2011-11-21 09:46:28
【问题描述】:

假设在一个未排序的数组中有三个元素,它们的出现次数都超过了元素总数的四分之一。

找到这些元素的最有效方法是什么?此问题的非在线版本和在线版本均适用。

谢谢!

编辑

我指的非在线版本是:这个数组是完整指定的。在线版本意味着数组元素一次一个来。

除了时间复杂度之外,我还要求空间紧凑。

免责声明:这不是家庭作业!我认为这是研究级别的问题。

【问题讨论】:

  • 什么是非在线版本的问题?
  • 对数组进行传递,将元素放入 hashmap,其中 key 是一个元素,value 是出现次数。然后只取3个最高元素。这将花费 O(n) 时间和相同的空间。

标签: algorithm


【解决方案1】:

记住最多三个元素,连同计数器。

  1. 记住第一个元素,设置count1 = 1
  2. 扫描直到找到第一个不同的元素,每次出现元素 1 时增加 count1
  3. 记住第二个元素,设置count2 = 1
  4. 扫描直到找到不同于 elem1 和 elem2 的第一个元素,递增 count1 或 count2,具体取决于您看到的元素
  5. 记住第三个元素,设置count3 = 1
  6. 继续扫描,如果元素是被记住的元素之一,则增加其计数,如果不是被记住的元素,则减少所有三个计数;如果计数降至 0,则忘记该元素,转到第 1、3 或 5 步,具体取决于您忘记了多少元素
  7. 如果您的三个元素的出现次数严格地超过数组中元素数量的四分之一,那么您最终会得到三个记住的元素,每个元素的计数都是正数,它们是三个多数元素。

小常数附加空间,O(n),无排序。

【讨论】:

  • +1。是的,这与我的想法差不多。这是否可以推广到长度为n 的数组中的m 元素,所有这些元素都出现超过n/k 次?
  • @QiangLi 它泛化为出现超过n/(m+1) 次的m 元素。但是如果我们把m当作变量,复杂度是O(m*n),所以如果m不小,排序比较好。
  • 此算法不起作用 - 尝试以下数组中的元素序列:[1 2 3 4 4 1 5 5 2 6 6 3 1 1 2 2 3 3 3]。大多数元素是 1、2 和 3,虽然,但是使用此算法,您会发现非常不同的元素。
  • @ffriend 在该示例中它们出现的次数少于 18/4。该算法要求它们严格出现 n/4 次以上。
  • @ffriend 但是,在该示例中,它仍然找到 2 和 3。在前三个元素之后,我们有 (1,1),(2,1),(3,1)。接下来是4,递减并忘记所有。继续 [4 1 5 5 2 ...],在 2 之前得到 (4,1),(1,1),(5,2),递减,忘记 4 & 1。状态 (5,1) 下一个 [ 6 6 ...],继续(5,1),(6,2),(3,1), 1,递减,忘记5&3。最后 1 ~> (6,1),(1,1); 2 2 ~> (6,1),(1,1),(2,2); 3 ~> (2,1); 3 ~> (2,1),(3,1)。
【解决方案2】:

创建条目的直方图,对其进行排序,然后取三个最大的条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    相关资源
    最近更新 更多