Chapter_one_关于搜索_二,关于深度优先搜索与它所坚持的。

·1.2.1_当一切充满不可知的时候,我们都是盲目的。

      尽管一切皆不可知,但我们并不能丧失面对未知的勇气,所以让我们勇敢且骄傲地探索这未知的一切吧。


1,2,3这三个数的全排列是显而易得的:123,132,213,231,312,321

即使是在程序中也是如此,我们只需要用三个for循环嵌套就能完成此全排列。

但如果是9个数的全排列呢?

我猜有一些读者或许会想到,那用9个for循环嵌套就可以辣~。

诶,虽然您是对的,但我不敢苟同,毕竟这太蠢了。

而且,如果是N个数的全排列就没辙了啊,毕竟您不能N个for循环嵌套。

(此处忽略一些奇奇怪怪的方法!这是正经的算法入门教程啊!!!亲)

所以,我们要用一个方法,叫盲目搜索法。它到底有多盲目呢?就像明知道是错的,仍然去爱的爱情那么盲目吧,这只是举例子哇。

盲目搜索法旗下有很多方法,但此文中会也仅会提到两种。

        ①深度优先搜索。简称dfs。

啊哈算法这本书中是这样形容的,不撞南墙不回头。嗯,这很盲目,很像爱情,或者梦想。这个东西通常用递归或者栈来实现。

        ②广度优先搜索。简称bfs。

这个算法符合就近原则,大概是一只吃窝边草的兔子吧。实现的话,通常得借助队列。

盲目搜索可以让程序对前途未卜的情况下,去进行搜索,他会把所有可能情况都枚举一遍。


·1.2.2_关于递归。

       无论各位学过或者没学过递归,我都建议认真看一次。因为这很简洁,除了我个人的经验积累,没有其他任何东西。


      什么是递归?在程序当中,递归通常指函数或者方法在函数体内调用其自身。

      在写递归时,你必须思考的是什么?

                     ①确定递归状态转移。

                     ②确定递归边界。

例子,

void recursion(Object object){

    if( isBoundary(object) ){   //判断是否为递归边界。

             //do something 

     }else{

           //递归状态转移

          object = transfer_state_function(object);

          recursion(object);

    }

}

引申:深度优先搜索能通过栈来实现的原因是,高级语言中,递归是通过函数栈来实现的,我们能通过栈来模拟函数栈的行为从而实现递归,对此有兴趣的读者可以自行尝试。



·1.2.3_深度优先搜索。

之前提到了深度优先搜索是由递归实现的,那我们该如何借助递归去搜索呢?

在有一颗二叉树,深度优先搜索可以类比为后序遍历。


即,遍历顺序4,7,8,5,2,6,9,10,3,1

此时,边界为 是否拥有子节点。状态转移为不同节点的转移。

实现例子:  假设Node为树中的节点,haveSon()能判断是否具有子节点,haveLeftSon()是否具有左节点,haveRightSon()同理。

void dfs(Node node){

       if( !node.haveSon() ){ //搜索边界

       }else{    //节点转移。偏好为 先选左子树

               if( node.haveLeftSon() ) dfs(node.leftSon);

               if( node.haveRightSon() ) dfs(node.rightSon);

      }

}


也例如我们要实现N个元素的全排列,且N个元素分别为1,2,3,4,……N-1,N。

先选一个,然后有N种选法,再选一个,有N-1种选法,如此类推,则可得所有可能的情况为 N! 种。

设第一种为 123456.....N,(即假设该算法的偏好为先选较小)

则代码实现:

假设 

一,存在数组choice 且下标为 i 时记录了当前第i个元素的选择的数。如第一种被输出时,数组为 [1,2,3,4,5,6,....,N]

二,存在数组 is_arr_beChoiced 且下标为 i 时记录了当前数 i 是否被选择。

void dfs(int index){

      if(index == N){

              //输出 choice数组中选择的数。

      }else{//搜索状态转移

            for(int i = 1 ; i<=N ; i++){

               if( !is_arr_beChoiced[i] ){

                   is_arr_beChoiced[i] = true;choice[index] = i;

                   dfs(index+1);

                    is_arr_beChoiced[i] = false;

              }

          }

     }

}

如果你看懂了上面的两个例子,那我们来总结一下深度优先搜索的特点。

①无论如何,总需要有一个初始状态。开始搜索的时候的状态成为搜索状态,例如,第一个例子的根节点时的状态。

②搜索的过程中伴随着状态的转换。

③一定有搜索边界。

④他坚持着某种偏好。这或许就是他的梦想了吧。


....关于深度优先搜索还未完,诸君晚安,以后见。2017.1.17.4:42..

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容