您的位置:首页 > 其它

深度优先搜索之偏爱时间复杂度

2016-04-05 15:02 288 查看

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

void DFS(int n,int sum)
{
for(int i=0;i<n;i++)
{
if(mark)
return ;
if(!visited[i])   //  如果该数字 没有被使用过的话
{
visited[i]=1;
maxn=maxn+a[i];
if(maxn==sum)
{
mark=1;
break;
}
DFS(n,sum);
maxn=maxn-a[i];
visited[i]=0;
}
}
}


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

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

bool DFS(int i,int m)
{
if(i==n)
return sum==m;
else
if(sum<m)
return false;
if(DFS(i+1,m))
return true;
if(DFS(i+1,a[i]+m))
return true;
return false;
}


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: