majority算法及Python 3.5实现
来源:互联网 发布:销售网络评价与改进 编辑:程序博客网 时间:2024/05/29 11:28
问题描述:
问题描述:令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 xlrdfrom 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 datadef 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 Noneif __name__ == '__main__': data=dataget('majority data.xlsx','Sheet1') result=majority(data) print(result)
———————————————————————————-
代码讲解:
代码共有四个部分
.
除了candidate()函数和majority()函数外,我们还定义了一个dataget()函数,用来读取数据。我们在一个名称为“majority data.xls”的Excel表格中的Sheet1的A1列中输入我们的数据,保存并放在程序目录中,然后运行程序。
——————————————————————————
- majority算法及Python 3.5实现
- KNN算法及python实现
- EM算法及python实现
- 决策树算法及python实现
- 最大公约数欧几里德算法及Python实现
- NMF算法简介及python实现
- MD5算法详述及python实现
- C001:最大公约数欧几里德算法及Python实现
- Apriori算法及python代码实现
- 基本采样算法及Python实现
- Apriori算法简介及实现(python)
- Apriori算法简介及实现(python)
- 欧几里德算法及python脚本实现
- 机器学习:AdaBoost 算法及Python实现
- bandit算法原理及Python实现
- k近邻算法及python实现
- bandit算法原理及Python实现
- bandit算法原理及Python实现
- 常见端口占用情况汇总(持续更新)
- 实验三 栈的基本操作
- 第二次作业!
- [Unity]Android Build Support 官方组件的下载安装问题
- HDU 6113 度度熊的01世界(简单dfs)
- majority算法及Python 3.5实现
- Spring+SpringMVC+MyBatis整合配置
- 启动hadoop 2.6遇到的datanode启动不了
- React-Native开发总结-html层面上的问题
- Android Studio 快捷键整理分享
- spring整合junit
- 特征点提取与匹配
- Spring Cloud在国内中小型公司能用起来吗?
- LeetCode 415. Add Strings