注:《数据结构与算法分析——Java》习题2.26 学习笔记
原题描述:
大小为N的数组A,其住元素是一个出现超过N/2此的元素(从而这样的元素最多有一个),例如数组
有一个主元素,而数组
没有主元素。
如果没有主元素,那么你的程序应该指出来。下面是求解该问题的一个算法的概要:
首先,找出主元素的一个候选元(这是困难的部分)。这个候选元是唯一有可能是主元素的元素。第二步确定是否该候选元实际上就是主元素。这正好是对数组的顺序搜索。为找出数组A的一个候选元,构造第二个数组B。比较A1和A2。如果它们相等,则取其中之一加到数组B中;否则什么也不做。然后比较A3和A4,同样,如果它们相等,则取其中之一加到B中;否则什么也不做。以该方式继续下去知道读完整个的数组。然后,递归地寻找数组B中的候选元;它也是A的候选元(为什么)。
a. 递归如何终止?
b. 当N是奇数时的情形如何处理?
c. 该算法的运行时间是多少?
d. 我们如何避免使用附加数组B?
e. 编写一个程序求解主元素。
参考答案如下:
(a) Recursion is unnecessary if there are two or fewer elements.
(b) One way to do this is to note that if the first N-1 elements have a majority, then the last element cannot change this.Otherwise, the last element could be a majority. Thus if NO is odd, ignore the last element. Run t