zoukankan      html  css  js  c++  java
  • 深度优先搜索之偏爱时间复杂度

    题目要求给你一些数字 , 其中的一些数字相加能不能等于已经给定的数字 sum ? 对这个问题我写了一个程序 , 然而总是超时 , 无药可救但是 看了别人的 程序 , 人家的程序运行得效率特别高 , 然后分析了一下 , 颇有感想决定记录下来        给出一组数据 例如  1  2  4  7    给定总和为 13   问在这几个数字中有没有几个数字的和 等于 所给数字 13的  然后我就没耽误事 开始暴力搜索了 ...    下面附上代码和分析

     1 void DFS(int n,int sum)
     2 {
     3     for(int i=0;i<n;i++)
     4     {
     5         if(mark)
     6             return ;
     7         if(!visited[i])   //  如果该数字 没有被使用过的话
     8         {
     9             visited[i]=1;
    10             maxn=maxn+a[i];
    11             if(maxn==sum)
    12             {
    13                 mark=1;
    14                 break;
    15             }
    16             DFS(n,sum);
    17             maxn=maxn-a[i];
    18             visited[i]=0;
    19         }
    20     }
    21 }

     

     

     

     

    我的代码 时间复杂度极高  将所有的可能性都列出来 并且还是 , 当顺序不一样其中元素一样的时候 我也列了出来  . . . . . . 我知道你和我同样的无语 , 这样的时间复杂度真是高的可怕 .  以前的时候 自己太懒   学了 对于图的搜索之后 就开始按照同样的套路开始对  数列进行 搜索 , 一直都会有超时情况的出现  ,  但是一直都是  新三年旧三年缝缝补补又三年 .....   今天就好好的总结一下经验教训  解决了这个问题   . . .      

     下面附上 , 一个学姐写的代码 

     1 bool DFS(int i,int m)
     2 {
     3     if(i==n)
     4         return sum==m;
     5     else
     6         if(sum<m)
     7         return false;
     8     if(DFS(i+1,m))
     9         return true;
    10     if(DFS(i+1,a[i]+m))
    11         return true;
    12     return false;
    13 }

     

     

    学姐的代码 , 虽然也是将所有的情况都列出来 ( 不可能的时候有剪枝 ) , 但是学姐的代码 顺序不一样但是元素一样 的情况是没有出现的 .    这样就高效的很       

  • 相关阅读:
    Android中内容观察者的使用 ContentObserver类详解 (转)
    Spinner
    对话框
    ButtonBar 的使用
    EditText/RadioButton/CheckBox使用
    ListView
    PieChar,此代码参考网上
    ComboBox中使用事件
    ColorPicker
    Button
  • 原文地址:https://www.cnblogs.com/A-FM/p/5355131.html
Copyright © 2011-2022 走看看