读书人

寻觅多数元素

发布时间: 2012-11-03 10:57:42 作者: rapoo

寻找多数元素

今天实现的算法是寻找多数元素,多数元素是指在一个含有n个元素的序列中出现次数多于[n/2](向下取整)的元素。

蛮力寻找多数元素是对每个元素进行计数,如果某个元素的计数超过[n/2],则断言它是多数元素,否则不存在多数元素。这种方法的时间复杂度过高,可以寻找更高性能的算法解决这类问题。

如果一个序列存在多数元素,那么该多数元素一定是该序列排序后的中间元素,也就是第[n/2](向上取整)个元素。所以可以通过寻找一个序列的中间元素,然后判断该元素是否为多数元素来寻找多数元素。对于此方法,有一个结论可以使用:

在原序列中去除两个不同元素后,那么在原序列中的多数元素在新序列中还是多数元素。

这个结论可以支持一个寻找多数元素候选者的算法,该算法的伪代码如下:

算法:CANDIDATE

输入:n个元素的数组A[1...n]

输出:多数元素的候选元素

candidate(m)

?

?

?然后是Java代码:

?

?

?最后是Python实现:

?

#! /usr/bin/env python  # -*- coding:utf-8 -*-class MajorityList:    def __init__(self):        self._list = list()        self.hasMajority = False        self.majority_value = 0        self._list.append(0)    def candidate(self, m):        j = m        c = self._list[m]        count = 1        while j < len(self._list)-1 and count > 0:            j = j + 1            if self._list[j] == c:                count += 1            else:                count -= 1        if j == len(self._list)-1:            return c        else:            return self.candidate(j+1)    def majority(self):        c = self.candidate(1)        count = 0        for j in range(1, len(self._list)):            if self._list[j] == c:                count += 1        if count > (len(self._list)-1)/2:            self.hasMajority = True            self.majority_value = c        else:            self.hasMajority = False            self.majority_value = 0        def add(self, x):        self._list.append(x)        self.hasMajority = False        self.majority_value = 0    def hasMajorityElement(self):        self.majority()        return self.hasMajority    def getMajorityElement(self):        return self.majority_valueif __name__ == '__main__':    a = [1, 2, 5, 5, 5, 4 ,3 ,2, 5, 5, 4, 5, 5]    ml = MajorityList()    print '输入数组为:'    for i in a:        print i,        ml.add(i)    print    result = ml.hasMajorityElement()    print '是否存在多数元素?', result    if result:        print '多数元素为:', ml.getMajorityElement()
?

?

读书人网 >编程

热点推荐