算法设计(一):寻找主元素
程序员文章站
2022-04-22 13:05:37
...
- 问题描述
寻找主元素方法,主元素是一个数组里面个数大于一半的数。
- 算法描述
已知A[1…n]是一个整数序列。
Step1:将计数器置1,并令c=A[1]。
Step2:逐个扫描元素,如果被扫描的元素和c相等,则计数器加1,否则,计数器减1。
Step3:如果所有元素都已经扫描完且计数器大于0,则返回c作为多数元素的候选者。如果在c和A[j](1<j<n)比较时计数器为0,则对于A[j+1…n]上的元素递归调用candidate函数。
图1 算法流程图
- 代码
#寻找主元素
import numpy as np
def candidate(m):
j=m
c=A[m]
count=1
while (j < (n-1))and(count > 0):
j += 1
if A[j] == c:
count += 1
else:
count -= 1
if j == (n-1):
return c
else:
return candidate(j+1)
if __name__ == "__main__":
A = np.array([1,2,3,1,1,5,1,1,1,3])
n = np.size(A,0)
c = candidate(0)
count = 0
for i in range(0,n):
if A[i] == c:
count += 1
if count > n//2:
print("主元素为%d:"%c)
else:
print("没有主元素:")
- 例子分析
令A = [1,2,3,1,1,5,1,1,1,3],此时n=10。
第一次调用candidate函数,c=A[0]=1,当j = 1时count = 0则不符合条件且j<9,所以递归调用candidate(2)。此时c=A[2]=3,当j = 3时count = 0则不符合条件且j<9,所以递归调用candidate(4)。此时c=A[4]=1,当j = 5时count = 0则不符合条件且j<9,所以递归调用candidate(6)。此时c=A[6]=1,当j = 7时,因为A[7]=c=1,所以count = count+1 = 2,然后j = 8,因为A[8]=c=1,所以count = count+1 = 3,然后j = 9,因为A[8]不等于c,所以count = count-1 = 2。此时j = (n-1) = 9,不符合条件,跳出循环并返回c=1作为多数元素候选者。
上一篇: 制作一个会跳动的日历
下一篇: SQL行列转换算法1
推荐阅读