欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法设计(一):寻找主元素

程序员文章站 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作为多数元素候选者。

相关标签: 大作业