【发布时间】:2011-05-25 14:48:07
【问题描述】:
一位讲师在课堂上提出了这个问题: [问题]
n 个整数的序列存储在 一个数组 A[1..n]。 A 中的整数 a 是 如果出现更多,则称为多数 比 A 中的 n/2 倍。
可以设计一个 O(n) 算法来 找到大多数基于 以下观察:如果两个 原著中的不同元素 序列被删除,然后 原始序列中的多数 仍然是新的多数 顺序。使用这个观察,或 否则,将编程代码写入 找到大多数,如果存在的话,在 O(n) 时间。
接受此解决方案的 [解决方案]
int findCandidate(int[] a)
{
int maj_index = 0;
int count = 1;
for (int i=1;i<a.length;i++)
{
if (a[maj_index] == a[i])
count++;
else
count--;
if (count == 0)
{
maj_index =i;
count++;
}
}
return a[maj_index];
}
int findMajority(int[] a)
{
int c = findCandidate(a);
int count = 0;
for (int i=0;i<a.length;i++)
if (a[i] == c) count++;
if (count > n/2) return c;
return -1;//just a marker - no majority found
}
我看不出所提供的解决方案如何是动态解决方案。而且我看不出他是如何根据措辞将代码提取出来的。
【问题讨论】:
-
这个问题比较笼统。包括你为什么它不是一个动态的解决方案来给人们一些回应的理由。
-
这不是动态编程。而且我没有看到任何人(包括你的教授)说它是,除了你的问题的标题。
-
基思,我的教授说它是动态的,我没有从互联网以太中提取问题(和解决方案)。
标签: algorithm dynamic-programming