用组合数学公式代替回溯
来源:互联网 发布:百分之衫淘宝网站 编辑:程序博客网 时间:2024/05/01 22:13
转自http://blog.csdn.net/roger__wong/article/details/8134162
最近看一些数学方面的书,包括概率论、数理统计、随机过程、组合数学等,发现数学这个工具威力绝对是无穷的,若在编程中融入数学的一些思想,程序的运行效率会的得到前所未有的提升。遂将这些读书中的感想写成心得,起名曰“数学的力量”。
首先让我们从一个很简单的问题说起:
有方程a+b+c+d+e=20,求其非负整数解的个数。
题目很简单,首先想到的是使用回溯进行求解,遍历整个解空间数,对可行解进行计数,很容易就能得出答案。
解空间示意图如下,程序太简单所以就不多说了。
一共4层节点(前abcd确定了之后e也就确定了),每层最多16个,所以需要遍历的节点数最多也就是60000多个节点,正常情况下运行几个毫秒就运行完了,可以说还算是解决这个问题还不错的方法。(我画图的时候把0给忘了,算了,意思表达出来就行了)
好,接下来让我们使用数学的方法来解决这个问题。
首先这个问题等价成以下描述:
我有a,b,c,d,e五种商品若干,现在要从中选出20个商品,问共有多少种选法。
典型的多重集组合问题,直接用其公式C(n+r-1,n)也就是C(20+5-1,5)=C(24,5)即可算出。
完了,搞定!时空复杂度均是O(1),直接return 一个公式就行了,多么完美。
从这个例子我们可以看出数学的力量是多么的大,在编程中用好数学会让我们的编程水平再上一个档次。
ps:
关于多重集的概念以及其组合公式和推导,请参考相关组合数学书籍或者百度谷歌等,这里只是使用其公式而对多重集本身并不做过多的阐述。
有感兴趣的可以参考:
http://www.baidu.com/s?wd=%B6%E0%D6%D8%BC%AF%D7%E9%BA%CF&rsv_bp=0&rsv_spt=3&rsv_sug3=3&rsv_sug=0&rsv_sug1=2&rsv_sug4=426&inputT=4547
0 0
- 用组合数学公式代替回溯
- 组合数学公式
- c++笔记 用组合代替继承
- 排列组合_组合_数学公式
- 排列与组合---回溯
- 排序组合回溯算法
- 组合数 -回溯
- C++编程规范之34:用组合代替继承
- 用组合代替继承能为 Activity 带来什么
- 用回溯法(backtracking)实现数学排列和组合
- [数学]两种组合数学公式及其比较
- 回溯算法写的组合
- 砝码组合(回溯法)
- LintCode 152-组合 回溯法
- 数学公式
- 数学公式
- 数学公式
- 数学公式
- android和ios弱网测试
- JDK与JRE各种版本下载地址
- Android BlueDroid(二):BlueDroid蓝牙开启过程init
- android 国外网站介绍
- js中instanceof和typeof的区别
- 用组合数学公式代替回溯
- Nhibernate一对多关系
- int main(int argc,char argv[]) 的问题
- Base64编码
- Bluetooth---蓝牙
- 写在开头...
- Linux环境下安装Nginx+Pcre+OpenSSL
- Redis 起步
- 如何在自定义cell里面判断第一个cell