majority算法及Python 3.5实现

问题描述:


问题描述:令A【1…n】是一个整形序列,A中的整数a如果在A中出现的次数多于n/2,那么称a为多数元素。试定义数组长度,从键盘随机输入n个数,设计算法寻找多数元素,若从在则输出,否则输出none。

—————————————————————————

思考过程:


我们利用majority算法来进行处理。Majority算法涉及到两个核心步骤。


1.首先我们要了解一个基本归纳结果:如果一组元素中,某一元素为多数元素(我们此时定义的多数元素为元素个数过半的元素)。那么当我们从元素集合中删掉两个不相同的元素,那么之前的多数元素,依然是多数元素。关于这一点利用基本的数学知识可以分析:我们以三个元素为例,假设有三个元素,其中X1为多数元素,那么存在下面这样的关系:当我们删除掉一个X1,一个X2(或X3)后,我们将得到的关系式和1/2做减法,并且进行通分处理,得到下面这个式子:因为X1为多数元素,所以X1大于其他元素的数量和,所以分子大于零。而分母部分,显而易见将会大于2*1=2。所以这个式子大于零,那么我们知道,X1类元素此时的个数是X1-1,仍然是多数元素。所以我们的归纳结果显然是正确的。关于更多元素的关系式,我们不再进行推导。
这样,关于这个归纳结果我们已经理解了,再次强调一下:如果一组元素中,某一元素为多数元素(我们此时定义的多数元素为元素个数过半的元素)。那么当我们从元素集合中删掉两个不相同的元素,那么之前的多数元素,依然是多数元素。
下面我们将利用这个结果设计算法。假设有一组元素A[ ],首先我们先取一个元素c=A[1],作为初始假设(假设这个元素为多数元素),那么我们此时去一个标准值count=1。即假设元素在当前元素空间内已经有count=1个。我们将A[2]与c进行比较,如果相等,那么count+1,如果不相等,那么我们将count-1。然后我们进行判断,如果我们的元素空间没有比较结束并且count>0,那么我们继续将A[3]与c进行比较,循环据此进行。如果循环条件不再符合,count=0,那么证明我们刚刚处理的元素空间中,有一个元素占了一半,那么我们正好可以将刚刚处理的元素两两分组,且每组都是不同元素,我们现在放弃刚才处理的元素。在剩下的元素空间中,多数元素并未发生变化,所以我们对剩下的元素空间进行刚刚的处理。这样就形成了递归。最终,我们遍历了整个元素空间,得到一个元素C。第一个核心步骤就已经完成了,我们将其命名为candidate过程。
2.下面我们进行第二个步骤,我们刚刚得到的元素C可能是多数元素,当然也可能是占空间一半的元素,所以进行一个简单比较,计算一下C的个数是否大于1/2,如果为多数元素,那么返回c,如果不是多数元素,那么返回NONE。第二个核心步骤也已完成。

—————————————————————————-

伪代码:


Majority过程:


1.c=candidate(1)
2.count=0
3.for j=1 to n
4. if A[j]=c then count=count+1
5.end for
6.if count>n/2 then return c
7.else return none


Candidate过程:


1.candidate(m)
2.j=m;c=A[m];count=1
3.while j0
j=j+1
4.if A[j]=c then count=count+1
5.else count=count-1
6.end while
7.if j=n then return c
8.else return candidate(j+1)

———————————————————————————————————-

源代码:


程序由python 3.5 环境完成,并由pycharm community 2017 editor IDE 进行编译


import xlrd
from numpy import *

def dataget(exlname,sheetname):
    ori = xlrd.open_workbook(exlname)
    table = ori.sheet_by_name(sheetname)
    data=[]
    for i in range(0, table.nrows):
        data.append(table.row_values(i))
    return data

def condidate(m,A):
    j=m
    c=A[m]
    count=1
    while j<len(A)-1 and count>0:
        j=j+1
        if A[j]==c:
            count=count+1
        else:
            count=count-1
    if j==len(A)-1:
        return c
    else:
        return condidate(j+1,A)

def majority(A):
    c=condidate(0,A)
    count=0
    for i in range(0,len(A)-1):
        if A[i]==c:
            count=count+1
    if count>len(A)/2:
        return c
    else:
        return None

if __name__ == '__main__':
    data=dataget('majority data.xlsx','Sheet1')
    result=majority(data)
    print(result)

———————————————————————————-

代码讲解:

代码共有四个部分
.

除了candidate()函数和majority()函数外,我们还定义了一个dataget()函数,用来读取数据。我们在一个名称为“majority data.xls”的Excel表格中的Sheet1的A1列中输入我们的数据,保存并放在程序目录中,然后运行程序。

——————————————————————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章