分治思想笔记

本文介绍了分治思想的基本概念,通过全排列问题详细解析了分治思想的步骤,包括如何将大问题拆分为子问题,直至问题可以直接解决。文章还讨论了何时适合使用分治思想,并以归并排序为例展示了分治思想在算法实现中的应用。
摘要由CSDN通过智能技术生成

什么是分治思想

分治分治,就是分而治之。将一个大问题分解成若干个问题,再将这若干个问题分解,直到问题可以直接解开。比如问我 a + b + c + d 等于多少(假设abcd都对应一个常数)?第一步,我会分成计算a + b 和 c + d。第二步,因为双项的加法是可以直接算出,所有该问题可以直接解开,然后在将子问题的答案统合起来就得到最终解。

分治思想の一般步骤

  1. 分析大问题,看看大问题是否由几个子问题组合而成。
  2. 将子问题分解,看看是否由几个子子问题组合而成
  3. 重复上诉步骤,直到子…问题可以直接解决。

拿一道题目开刀

全排列问题
问题描述:
  有1,2,3,4,一共4个数,问你有多少种排列方法,并输出排列。

看到这个问题,当然可以有数学中的全排列公式得出

公式:全排列数f(n) = n! (定义0!=1)
----来自百度百科

我们来看看如果用分治思想如何思考。
主问题是输出所有的排列方法,第一步就是看看主问题能不能由几个子问题组合而成,答案是可以的,所有的排列方式 由 开头是1的数列 + 开头是2的数列+ 开头是3的数列 + 开头是4的数列构成。那么子问题就是:如何求出开头是1 or 2 or 3 or 4的数列。因为解决方法是相同的。只看其中一种:
求出开头是3的数列。开头是3的数列 = 开头是3的数列而且第二位是1的数列 + …第二位是2的数列 + …第三位是4的数列构成。

然后子子问题就是 求出 开头是3的数列 而且 第二位是1的数列。

接下来的内容就是套娃了:
求开头是3的数列 而且 第二位是1的数列有哪些
由 开头是3的数列, 第二位是1的数列 和第三位是 2的数列 + …第三位是 4 的数列构成

推出最后一个子问题:
开头是3的数列, 第二位是1的数列 和第三位是 2的数列 有哪些?
这是唯一确定的是:3, 1 ,2,4。

如何将上述思路变为代码呢?


        def permutation(__nums, pointer, end):
            # 可以直接得出答案终止递归
            if pointer == end:
                print(__nums)
			# 将子问题进行分解
            for i in range(pointer, end + 1):
            	# 进行位置交换
                __nums[i], __nums[pointer] = __nums[pointer], __nums[i]
                # 继续分解
                permutation(__nums, pointer + 1, end)
        		# 将位置交换回来
                __nums[pointer], __nums[i] = __nums[i], __nums[pointer]

输入为

[1, 2, 34]

输出结果为

[1, 2, 3, 4]
[1, 2, 4, 3]
[1, 3, 2, 4]
[1, 3, 4, 2]
[1, 4, 3, 2]
[1, 4, 2, 3]
[2, 1, 3, 4]
[2
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值