主要元素——数据结构与算法分析笔记

来源:互联网 发布:2016年学java有前途吗 编辑:程序博客网 时间:2024/06/07 06:16

注:《数据结构与算法分析——Java》习题2.26 学习笔记

原题描述:

大小为N的数组A,其住元素是一个出现超过N/2此的元素(从而这样的元素最多有一个),例如数组

3,3,4,2,4,4,2,4,4

有一个主元素,而数组
3,3,4,2,4,4,2,4

没有主元素。

  如果没有主元素,那么你的程序应该指出来。下面是求解该问题的一个算法的概要:
  首先,找出主元素的一个候选元(这是困难的部分)。这个候选元是唯一有可能是主元素的元素。第二步确定是否该候选元实际上就是主元素。这正好是对数组的顺序搜索。为找出数组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 the algorithm as before. If no majority element emerges, then return the Nth element as a candidate.

(c) The running time is O(N), and satisfies T(N) = T(N/ 2) + O(N).

(d) One copy of the original needs to be saved. After this, the B array, and indeed the recursion can be avoided by placing each Bi in the A array. The difference is that the original recursive strategy implies that O(log N) arrays are used; this guarantees only two copies.

这个题在学过python的我们看来其实很容易 用collection 里的counter就可以很容易办到,但是如果用C或者java呢?

下面关于本题的解读是非常好的,部分内容非常利于我们来理解这道题目。地址如下

http://www.cnblogs.com/XiangfeiAi/p/4758939.html

解答:

a, 当数组B的元素个数等于0或者1时, 递归终止

b, 如果前N-1个元素有主元, 那么最后一个元素不管是不是主元都对结果没有影响;
如果前N-1个元素没有主元, 那么加上最后一个元素之后, 就有可能使整个数组存在主元, 所以最后一个元素有可能是主元

所以最后的算法应该是这样的:

  • 如果数组元素的个数是偶数, 就找出候选元, 然后再遍历整个数组, 确定这个候选元是否是主元
  • 如果数组元素的个数是奇数, 那么就先从前N-1个元素中找出候选元,
    • 遍历整个数组, 如果这个候选元就是主元, 那么就结束了,
    • 遍历整个数组, 如果这个候选元不是主元, 那么就把最后一个元素当做候选元, 再遍历数组, 确定这个候选元是否就是主元

c, 对于偶数, T(n) = T(n/2) + n

  根据Master定理: a = 1, b = 2, logba = 0, f(n) = O(1), f(n) > n logba 所以T(n) = O(n).

对于奇数, 只多了一次遍历, 所以T(n) = O(n) + O(n) = O(n)

d, 仍然是数组中的每两个元素相比较, 先比较A1和A2, 如果相等就和数组最前面的元素交换, 如果不相等就不交换, 再比较A3和A4, 如果相等就和前一个比较之后交换过的元素的下一个位置的元素交换, 如果不相等就不交换, 按同样的方式处理,其次类推直到读完这个数组,然后递归的寻找数组B中的候选元,它也是A的候选元.

0 0