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 }

     

     

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

  • 相关阅读:
    leetcode 之 Palindrome Partitioning
    虚拟机共享文件夹下tar
    leetcode 之 Excel Sheet Column Number
    AndroidHttpClient & jsoup 解析 正方教务系统
    查看android下的分区表
    ubuntukylin 下编译 android4.4
    android:layout_weight 和 android: weightSum的使用
    Intent 与Bundle的传值关系
    使用自定义的Toast
    SlideMenu例子解析2
  • 原文地址:https://www.cnblogs.com/A-FM/p/5355131.html
Copyright © 2011-2022 走看看