python使用分治法实现求解最大值的方法

   本文实例讲述了python使用分治法实现求解最大值的方法。分享给大家供大家参考。具体分析如下:

  题目:

  给定一个顺序表,编写一个求出其最大值和最小值的分治算法。

  分析:

  由于顺序表的结构没有给出,作为演示分治法这里从简顺序表取一整形数组数组大小由用户定义,数据随机生成。我们知道如果数组大小为 1 则可以直接给出结果,如果大小为 2则一次比较即可得出结果,于是我们找到求解该问题的子问题即: 数组大小 <= 2。到此我们就可以进行分治运算了,只要求解的问题数组长度比 2 大就继续分治,否则求解子问题的解并更新全局解以下是代码。

  题目看懂了就好说了,关键是要把顺序表分解成为k个元素为2的列表,然后找列表的最大值,然后把子问题的列表进行合并,再递归求解。

  上代码吧:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

#-*- coding:utf-8 -*-
#分治法求解最大值问题
import random
#求解两个元素的列表的最大值方法
def max_value(max_list):
return max(max_list)
#定义求解的递归方法
def solve(init_list):
if len(init_list) <= 2:
#若列表元素个数小于等于2,则输出结果
print max_value(init_list)
else:
init_list=[init_list[i:i+2] for i in range(0,len(init_list),2)]
#将列表分解为列表长度除以2个列表
max_init_list = []
#用于合并求最大值的列表
for _list in init_list:
#将各各个子问题的求解列表合并
max_init_list.append(max_value(_list))
solve(max_init_list)
if __name__ == "__main__":
test_list = [12,2,23,45,67,3,2,4,45,63,24,23]
#测试列表
solve(test_list)

  希望本文所述对大家的Python程序设计有所帮助。

时间: 2024-10-25 07:50:35

python使用分治法实现求解最大值的方法的相关文章

python 实现分治法的几个例子

分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质. 3) 利用该问题分解出的子问题的解可以合并为该问题的解: 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题. 第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加: 第二条特征是应用分治法的前提它也是大多数问题可以满足的,此特征反映了递归思想的应用:. 第三条

算法中的递归分析和分治法的原理

分析递归算法三种方法 替换法.迭代法.通用法(master method) 作用:分析递归算法的运行时间   分治算法 将一个问题分解为与原问题相似但规模更小的若干子问题,递归地解这些子问题,然后将这些子问题的解结合起来构成原问题的解.这种方法在每层递归上均包括三个步骤: divide(分解):将问题划分为若干个子问题 conquer(求解):递归地解这些子问题:若子问题Size足够小,则直接解决之 Combine(组合):将子问题的解组合成原问题的解   其中的第二步很关键:递归调用或直接求解

分治法-归并排序

问题:应用归并法对一个记录序列进行升序排序(利用分治法) 思路:1.划分       2.求解子问题       3.合并 归并排序的执行过程:(*是拆分,#是合并)      8  3  2  6  7  1  5  4   *8 3 2 6*         *7 1 5 4* *8 3*  *2 6*      *7 1*  *5 4* *8* *3* *2* *6*  *7* *1* *5* *4* #3 8#   #2 6#    #1 7#   #4 5# #2 3 6 8#    

分治法-简单矩阵

输出如下所示N*N(1<=N<=10)的数学方阵 输入:6 输出: 1 20 19 18 17 16 2 21 32 31 30 15 3 22 33 36 29 14 4 23 34 35 28 13 5 24 25 26 27 12 6  7  8  9   10  11 思路:利用分治法,逐层填数,先填最外层: 1 20 19 18 17 16 2                     15 3                     14 4                    

分治法-快速排序

问题:应用快速排序方法对一个记录序列进行生序排序(运用分治法) 策略:请读者先了解快速排序的基本概念(<数据结构>或百度百科) 如下所示是一个快速排序的完整例子:(化成中间一个数,左边的比他小,右边的比他大) 23 13 35 6 19 50 28 [19 13 6] 23 [35 50 28] [6 13] 19 23 [28] 35 [50] 6 [13] 19 23 28 35 50 6 13 19 23 28 35 50 实现代码: #include<stdio.h> in

五大常用算法 之 分治法

一.基本概念    在计算机科学中,分治法是一种很重要的算法思想.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)等.    任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个元素的排序问

常用算法之分治法与动态规划法

          之所以把这两种算法放到一起,是因为它们都是用来求最优解的问题,与贪心算法是不同的.但是这两种算法又有一些区别,下面来做解释:           分治,即分而治之,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.                           上图用一个例子来解释如下:              当n>1时,想求得T(n),必须知道T(n-1),以此类推,所

分治法——循环赛日程安排问题

问题描述: 设有n(2^k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天只能赛一场,试安排比赛.   举例说明: 1,当n为偶数时,循环赛一共要进行n-1天:比如,有运动员:周董,信哥,蔡依林,小七,一共4个人,可以如下安排:   运动员 第一天 第二天 第三天 周董 信哥 蔡依林 小七 信哥 周董 小七 蔡依林 蔡依林 小七 周董 信哥 小七 蔡依林 信哥 周董   可以看出,当四个人比赛的时候,要比3天才能全部比完.   2,当n为奇数时,

算法详解之分治法具体实现_C 语言

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解. 分治法解题的一般步骤: (1)分解,将要解决的问题划分成若干规模较小的同类问题: (2)求解,当子问题划分得足够小时,用较简单的方法解决: (3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解. 一言以蔽之:分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之. 在认识分治之前很有必要先了解一下递