【问题标题】:select algorithm to find element occurring more than n/2 in O(n)选择算法以查找在 O(n) 中出现超过 n/2 的元素
【发布时间】:2014-03-24 12:02:30
【问题描述】:

不使用摩尔算法或哈希表,我需要在数组中找到出现次数超过n/2 的元素。

我知道我必须使用中位数的选择算法。我对选择算法返回的内容感到困惑,因为如果它返回中位数,我如何确定该元素在数组中的出现次数超过 n/2 次?

例如:

a [] = {4, 1, 5, 7, 8}

5 是中位数,但它出现的次数不超过n/2 次。

现在:

a[] = {5, 5, 3, 4, 5, 5}

在这种情况下,中位数是 5,它出现的次数超过了n/2 次。

【问题讨论】:

  • 我不明白。我认为如果一个元素出现超过 n/2 次将是中位数,不是吗?
  • 是的,但反过来不正确,中位数不必出现 n/2 次​​span>
  • 所以只需找到中位数,然后检查它发生的频率
  • 是的。我必须找到中位数,然后计算它的出现次数。
  • 使用哈希表可能会比快速选择更快

标签: java algorithm select median


【解决方案1】:

我想建议另一种方法。这个问题被称为“寻找领导者”(至少在波兰文学中)。让我们将出现次数超过n/2 次的元素称为序列的领导者。以下观察至关重要 - 如果序列中存在领导者,则在删除两个 不同 元素后,新创建的序列将具有与原始序列完全相同的领导者。这是为什么?如果有leader,去掉两个不同的元素后,恰好其中一个就是leader。新序列有n - 2 元素和超过(n / 2) - 1 出现的原始领导者,因此原始领导者是新领导者。您重复删除,直到所有元素都相等。然后,您可以执行线性检查候选人是否是领导者。

示例代码(基于this article,遗憾的是英文不可用):

int leader = 0;
int number = 0; /* number of occurences of a leader candidate */
for (int k = 0; k < n; k++)
{
    if (number == 0)
    {
        //we set first element as a potential leader
        leader = a[k];
        number = 1;
    }
    else if (leader == a[k])
        //new leader occurence
        number++;
    else
        //delete two different elements
        number--;
}
//check if it really is the leader
number = 0;
for (int i = 0; i < n; i++)
    if (a[i] == leader)
        number++;
if (number > n / 2)
    System.out.println(leader);
else
    System.out.println("There is no leader");

【讨论】:

  • 我们如何找到两个不同的元素 i 摊销 O(1)?两个指针?
  • 顺便说一句,我认为应该是“最多一个”
  • 我认为这行不通。考虑序列[5,5,5,3,3,3,2,2,5,5]。如果我正确阅读代码,它将报告没有领导者,因为在第一遍结束时,leader == 2
  • @JimMischel 它将报告没有领导者,这是真的。在您的示例元素中 5 出现 5 次,总共有 10 元素,因此它不是领导者。我的回答有误,至少n / 2 应该比n / 2 多,我已经更正了。感谢您指出!
  • 那是摩尔算法,所以它不是“另一种算法”。在此处查看英文描述:cs.utexas.edu/~moore/best-ideas/mjrty/example.html
【解决方案2】:

使用选择算法找到中间元素。在这里,如果元素大于 n/2 倍,则很明显它是中位数。使用中位数的中位数获得 O(n) 的运行时间。一旦你得到中值元素,只需计算它在数组中的出现次数,这又是线性时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多