热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解题思路之树型结构

有一类求一组解,或者求全部解,或者求最优解的问题,可以利用“试探”和“回溯”的搜索技术来求解。例如:求含n个元素的集合的幂集合(全集)解法一:“分治法”进行“递归算法设计”,递归规

有一类求一组解,或者求全部解,或者求最优解的问题,可以利用 “试探”和“回溯”的搜索技术来求解。

例如:求含n个元素的集合的幂集合(全集)

解法一:“分治法”进行“递归算法设计”,

   递归规定义:基本项(终结状态) + 归纳项(如何从当前状态转化到终结状态,也就是原问题和子问题之间的转化)

递归设计的实质:当一个复杂的问题可以分解为若干子问题来处理时,其中某些子问题和原问题有相同的特征属性,则可以利用和源问题相同的分析处理方法。(例如汉诺塔的问题中,可以分解为3个子问题,(1)将编号为1至n-1的n-1个圆盘从X塔座移到Y塔座;(2)将编号为n的圆盘从X塔座移到Z塔座(3)将编号为1至n-1的圆盘从Y塔座移到Z塔座。

    关于“树”的问题,我们很容易会想到用“递归”,如果其他结构的数据类型也可以用“树”的角度去思考的话那可能会很容易找到问题的解答思路。

   例如求A={1,2,3}的幂集 即p(A)={{1,2,3},{1,2},{1,3},{2,3},{1},{2},{3},Φ};

   如果我们用树的角度去思考这个问题,那我们得到的会是(这里默认最底层节点为空集Φ)

                                 

    这属于分治法进行递归设计,我们每次都需要将原问题分为 即n个子问题(其中n表示原问题集合的元素个数,r表示每个子问题集合的元素个数,根据这里的情况r取n-1),而在递归终止情况,即子问题所含的元素个数为1时,会出现多个等价的子问题。

     而从另一个角度来看这个问题,幂集中的每个元素是一个集合,它可以是空集,也可以是包含A中一个元素的集合,也可以是两个,三个,最后等于集合A本身。所以从集合A的每个元素来看,它只有两个状态:它或者属于幂集的元素集,或者不属于幂集的元素集,所以求A的幂集就可以看成是依次对A中的元素进行“取”或者“舍”。

    我们同样用树型结构来表达这一思路,并最终在树形结构上完成幂集的求解,假设初始化时树只有一个根节点,节点内容为空,表示Φ(这个集合时所有集合的幂集所包含的)。然后我们对集合A中的元素依次进行取舍操作,“取“操作表示将元素连接到原节点的左分支,”舍“操作则保留原节点内容并作为其右分支,最后我们可以生成下面这样的树:

                                      

所以求幂集的过程也就是对这颗状态树进行先序遍历

Void PowSet(int I, int n)

{

  If( i> n) {输出一个集合,其元素为集合A中的元素,即输出A的幂集的一个元素}

  Else

{

  取得A集合中的第i个元素,也就是向树的左边走

  PowerSet(i+1,n); //对树的左枝做同样操作

  舍弃A集合中的第i个元素,也就是向树的右边走

   PowerSet(i+1,n); //对树的右枝做同样操作

}

  

}

//具体实现

Void GetPowerSet(int i, List A, List B)

{

//用线性表A表示集合A,线性表B表示A的幂集的元素集合。

  If( i > ListLength(A) ) Output(B);

  Else

GetElem(A,i,x);       //将A集合中的第i个元素赋值给x

K = ListLength(B);        //得到当前B的长度

ListInsert(B,k+1,x);      // 进行取操作

GetPowerSet(i+1,A,B);

ListDelete(B,k+1,x);           //进行舍操作

GetPowerSet(i+1,A,B);

}

}

{reference:数据结构-严蔚敏

  author:aga j

}


推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
author-avatar
GodlikeZ寰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有