深搜和广搜的概念和设计思想(贪心+动态规划+最大堆)

广搜和深搜大多用于图的搜索,但是也不仅仅用于此,因为这是一种思想,所以应该理论上可以用于所有合适的数据结构类型。


深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。当搜索深度较大时,当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设计比较好。


递归算法比较简单,这里就不讲了,主要想说说非递归思想:主要借助节点类型为队列的栈实现。也就说,“探左”和“探右”通过弹栈实现,通常要加入动态规划的思想。


动态规划就是把原问题分解为相对简单的子问题方式求解,但是动态规划也要符合几个条件,一定要有最优子结构(子问题最优导致总体最优)和子问题不相互影响的条件。常用语解决重叠子问题(子问题重复,因为会存储起来不会再次计算)


顺便再说说贪心:,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。

贪心算法只适用于有最优子结构的算法。


两者的区别:贪心巨有高效性,如果这个问题可以用贪心解决,那么贪心一定是最优的!

而动态规划具有回退性,也就是说会把子问题,以前的运算结构存储起来,并对当前的结果做出选择(子问题间不互相影响,只是通过前问题+目前情况决定新的问题答案)。而贪心就是只看目前这个子问题,连上个问题的结果都不看。


最大堆:根节点比子节点大。然后可以不断的调整堆来满足条件(常用下沉法,也就是小的下沉),调整时间为lg(n),所以总体是nlog(n)

你可能感兴趣的:(数据结构)