- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
分治法解决集合划分问题
算法设计与分析 ————分治法解决集合划分问题 考虑3个元素的集合{1, 2, 3},可划分为 ① 1个子集的集合:{{1,2,3}} ② 2个子集的集合:{{1,2},{3}},{{1,3},{2}},{{2,3},{1}} ③ 3个子集的集合:{{1},{2},{3}} f(m,n)=? 显然 f(3,1)=1; f(3,2)=3; f(3,3)=1; 如果要求f(4,2)该怎么办呢? A.往①里添一个元素{4},得到{{1,2,3},{4}} B.往②里的任意一个子集添一个4,得到 {{1,2,4},{3}},{{1,2},{3,4}}, {{1,3,4},{2}},{{1,3},{2,4}}, {{2,3,4},{1}},{{2,3},{1,4}} ∴f(4,2)=f(3,1)+2*f(3,2)=1+2*3=7 f(m,n) = int f(int m, int n) { int total_number;//存放集合总数 if(m==n || m == 0) return 1; if(n == 1) return 1; return total_number=f(m-1, n-1) + n * f(m-1, n); } //================== //集合划分问题 //================== # include iostream using namespace std; int f(int m, int n) //求集合个数的函数,m用来接收元素个数,n用来接收子集个数 { int total_number; if(m==n || m == 0) return 1; if(n == 1) return 1; return total_number=f(m-1, n-1) + n * f(m-1, n); } int main() { int m, n; cout s请输入元素个数和非空子集个数 : endl; cin m n; if(mn) { cout (error!输入的子集个数多于元素个数,请重新考虑要输入的数据!) endl; return 0; } else cout total_number f(m, n) endl; return 0; } 在vc6.0中测试的结果: 分治法的适用条件 分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 1、 问题的引入 任何一个可以用计算机求解的问题所需的计算时间都与其规模N有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。 例如,对于n个元素的排序问题 当n=1时,不需任何计算; 当n=2时,只要作一次比较即可排好序; 当n=3时只要作3次比较即可 …… 当n=10000时,问题就不那么容易处理了。 由此可见:要想直接解决一个规模较大的问题,有时是相当困难的。 2、 分治法就是为解决大规模问题而提出的 将要求解的大规模的问题分解为k个较小规模的问题,对这k个子问题分别求解。 T(n) T(n/2) T(n/2) 如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。 T(n) T(n/4) T(n/2) T(n/2) T(n/4) T(n/4) T(n/4) 将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。 T(n) T(n/4) T(n/2) T(n/2) T(n/4) T(n/4) T(n/4) 将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。 T(n) T(n/4) T(n/2) T(n/2) T(n/4) T(n/4) T(n/4) 分治法的主要思路是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 T(n) T(n/4) T(n/2) T(n/2) T(n/4) T(n/4)
您可能关注的文档
- 六年级上册读碑.ppt
- 六年级上册语文课件-5詹天佑-人教新课标.ppt
- 六单元 第18课《罗斯福新政》(人教新课标必修二).ppt
- 六年级上语文词语复习.ppt
- 六年级上语文课件(B)-望岳沪教版.ppt
- 六年级上语文3《草虫的村落》.ppt
- 六年级上基础复习.ppt
- 六年级上第六单元复习.ppt
- 六年级上练习题.ppt
- 六年级上册数学《足球场内的声音》课件.ppt
- 外包服务框架合同.doc
- 2025年重庆三峡职业学院单招职业适应性测试历年(2019-2024年)真题考点试卷含答案解析.docx
- 结膜炎的早期诊断和护理.pptx
- 物流运输业多式联运物流服务创新与发展策略.doc
- 装饰工程绪论课件.pptx
- 幼儿园大班家长学校课件.pptx
- 2025年重庆三峡职业学院单招英语2014-2024历年真题考点试卷摘选含答案解析.docx
- 2025年重庆三峡职业学院单招语文2019-2024历年真题考点试卷含答案解析.docx
- 2025年重庆三峡职业学院单招(数学)历年真题考点含答案解析.docx
- 2025年重庆交通职业学院单招职业技能测试近5年真题考点含答案解析.docx
文档评论(0)