欢迎使用CSDN-markdown编辑器

来源:互联网 发布:查看淘宝买家退货率 编辑:程序博客网 时间:2024/05/22 14:19

算法设计与分析(1)

1.数组内主元素问题

问题描述:给定一个数组A,任务是设计一个算法求得数组中的“主元素”,即在数组中个数超过数组总元素个数一半的元素。但是数组中元素的数据类型可能是复杂类型,这意味着数组中的元素进能够比较是否相等而不存在序关系,设对于两个元素A[i]和A[j],判定是否A[i]=A[j]需要常数时间。
注意,在数组中超过总数一半的元素若存在,一定只有一个。
(a) 设计一个时间复杂性为O(n log n)的算法解此问题
(b) 设计一个时间复杂性为O(n)的算法解此问题.

1.枚举法

遍历数组,求出每种元素的个数,得到主元素。

2.分治法

如果存在主元素A[i],则将数组等分为a1[n/2]和a2[n/2],主元素必为至少一个子数组的主元素。这是因为A[i]不可能都不是子数组的主元素。因此可以采用分治法,直到分解的子数组长度为1或者2。
分治法的时间复杂度为O(nlogn)。

3.删除不同元素

对整个数组,从A[0]开始,每次删除两个不同的元素。这样会出现三种情况:
(1)删除了两个主元素;
(2)删除了一个主元素一个非主元素;
(3)删除了两个非主元素。
但是由于主元素占一半以上,相当于用主元素去匹配非主元素,最终剩下的元素全一样时停止删除,剩下的就是主元素。这种方法的时间复杂度为O(n)。