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

  • 问题描述

寻找主元素方法,主元素是一个数组里面个数大于一半的数。

  • 算法描述

已知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作为多数元素候选者。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较复杂的项目,需要进行一些算法设计和界面展示方面的工作。下面是对每一部分的具体实现方式的建议: 1. 迷宫地图生成算法设计和实现 可以使用Prim算法来生成迷宫地图。具体实现方式可以参考以下步骤: - 首先,初始化一个迷宫地图,使其所有的格子都是墙。 - 随机选择一个格子作为起点,并将其标记为已访问。 - 将起点周围的墙加入一个候选墙列表中。 - 从候选墙列表中随机选择一堵墙,并检查它的两侧是否有已访问的格子。 - 如果这堵墙的两侧都有已访问的格子,则将它从候选墙列表中移除。 - 如果这堵墙的两侧有一个已访问的格子和一个未访问的格子,则将该未访问的格子标记为已访问,并将该墙拆除,将其两侧的格子相连。 - 将该未访问的格子周围的墙加入候选墙列表中,重复步骤 4-7,直到候选墙列表为空。 2. 单路径寻找算法设计与实现 可以使用深度优先搜索算法来找出迷宫中的一条单一的通路。具体实现方式可以参考以下步骤: - 从起点开始,向一个方向前进,递归地进行深度优先搜索。 - 如果遇到了墙或已访问过的格子,则回溯到上一个格子,尝试向其他方向前进。 - 如果遇到了终点,则返回一条通路。 3. 迷宫遍历算法设计与实现 可以使用深度优先搜索算法来遍历迷宫中所有的可行路径。具体实现方式可以参考以下步骤: - 从起点开始,向一个方向前进,递归地进行深度优先搜索。 - 如果遇到了墙或已访问过的格子,则回溯到上一个格子,尝试向其他方向前进。 - 如果遇到了终点,则将这条路径保存下来。 - 继续向其他方向前进,重复步骤 1-3,直到遍历了所有的路径。 4. 最短路径计算算法设计与实现 可以使用广度优先搜索算法来找出迷宫中所有通路中的最短通路。具体实现方式可以参考以下步骤: - 从起点开始,将它加入一个队列中。 - 对于队列中的每一个格子,向它周围的未访问格子扩展,将它们加入队列中,并记录它们的距离。 - 如果扩展到了终点,则返回最短距离。 - 重复步骤 2-3,直到队列为空。 第二部分:界面展示部分 1. 生成迷宫地图界面的设计与实现 可以使用Python的Tkinter模块来实现图形界面。具体实现方式可以参考以下步骤: - 使用Tkinter创建一个窗口,并在其中添加一个画布。 - 根据生成的迷宫地图,在画布上绘制出迷宫的墙和通路。 - 可以使用不同的颜色来表示起点、终点和路径等元素。 2. 相关迷宫生成过程和寻路算法在界面上的展现 可以使用Tkinter的动画功能来展示迷宫生成过程和寻路算法。具体实现方式可以参考以下步骤: - 在画布上绘制出起点和终点。 - 对于迷宫生成算法,可以使用动画来展示每一步生成的过程,例如使用不同颜色的矩形来表示正在生成的墙,或者使用闪烁的效果来表示已访问的格子。 - 对于寻路算法,可以使用动画来展示每一步搜索的过程,例如使用不同颜色的矩形来表示当前搜索的路径,或者使用延迟的效果来模拟搜索的过程。 以上是一些实现方式的建议,您可以根据自己的需求和实际情况进行调整和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值