前面我们讲了几个深度优先搜索算法与广度优先搜索算法的题目,对于很多没有算法基础的人来说,真的很难去理解。今天我们再来谈一谈搜索的基础,搜索树。
数据结构
很多人不知道数据结构的含义,数据结构是指数据的存储方式,用不同的数据结构进行存储数据,有着不同的效果。这里有些人可能会问,数据不都是存在数据库里面,以表的形式存在么?怎么还会有不同的存储方式呢?不妨想想这么一种业务场景,我们需要来维护一个公司的组织架构,当我们要判断哪个人是董事长,谁是谁的上级的时候,你需要怎么样去组织和存储数据,这就是数据结构的意义了。
树
树是一种特别的数据结构,如下图所示,树上的基本元素有节点和边,根据节点的总类,我们有分为树根与叶子节点。
没有父亲节点的我们称之为树根,没有儿子的我们称之为叶子节点。什么是父亲,什么是儿子,风太大我看不见。
对于第3号节点来说,1号节点是它的父亲节点,2号节点跟它有同一个父亲节点,称之为兄弟兄弟节点。4,5号节点称之为儿子节点,对于第1号节点来说,4,5号节点就是他的孙子节点。树的特点由父亲节点出发,可以到达所有的子节点,并且一个N节点的树,有N-1条边,也就是说,假如边是无向的,在树上不可能存在环!
搜索状态
沙茶敏每次讲算法的时候,动不动就提到搜索状态,搜索状态到底是什么东西呢?为什么老提这个东西。这里我们讲一个经典的算法题,农夫过河的故事,农夫带着一头狼,一只羊,一把草过河,河上有条小船,农夫每次只能带着一样一起过河,如果农夫不在,狼会吃掉羊,羊会吃掉草。这个时候我们就要让计算机来表示状态了,我们用{(岸边状态)(对岸状态)}来表示,一开始我们使用的状态是{(农夫,羊,狼,草)()},目标状态是{(),(农夫,狼,羊,草)}。这里我们就要区分状态的合法性,什么是状态的合法性呢,像{(羊,草)(农夫,狼)}就是一个非法的状态。
搜索树
那么什么是搜索树呢,我们从初始状态出发,如果A状态可以到达B状态,并且B状态没有访问过,我们就称B状态是A状态的儿子。例如农夫一开始带着羊过河了,那么状态{(狼,草)(农夫,羊)}就是初始状态的儿子。在搜索算法中,所有的状态,都是由初始状态到达的,初始状态就是根节点,对于同一个状态,我们只需要访问1次,也就是说,如果一次搜索过程中由N个不同的状态,那么总共进行了N-1次转移,这都满足了树的特性!
我们按照一定的搜索策略,例如深度优先搜索散发,广度优先搜索方法,其实都是一定的搜索策略。上图就是按照广度优先搜索算法的策略。最终搜索出来的搜索树。广度优先搜索,也就是对于每一个状态,都找出所有可以到达的状态,将没有访问过的合法状态进行入队,逐层扩展。相信你已经知道什么是搜索树了,再回头看看之前的深度优先和广度优先搜索算法,是不是有新的体会呢?对于这个问题,能否按照深度优先搜索算法画出搜索树呢?今天我们就讲到这里,如果你有兴趣,欢迎