时间复杂度疑问——自认为是优化但是反而更慢了

透眸 2015-02-05 06:12:47
题目:
给n个数,如果其中三个数相加能等于n个数中除去这三个数外的另一个数,输出满足条件的最大的那个数,没有则输出no solution

自认为优化后的代码:
#include <algorithm>
#include <cstdio>
#include <vector>
#include <string>
using namespace std;

template <class S,class R>
void combination(S &source,int n,int m,R &result);

int main()
{
int n,value;
bool flag;
vector< vector<int> > result;

while(scanf("%d", &n), n)//表达式中,如果有逗号,以逗号后的值为返回值。即输入一个n并返回n的值。
{
flag=false;
vector<int> source(n,0);
result.clear();
for(int i = 0; i < n; i++)
scanf("%d", &source[i]);
combination(source,n,3,result);//得到组合,并且都已经从小到大排序.
for(vector< vector<int> >::reverse_iterator it=result.rbegin();it!=result.rend();++it){
value=(*it)[2]-(*it)[1]-(*it)[0];//最大的数减去其他两个数,得到另一个数
//如果这个数不同于这个组合内的数并且在给出的数组中
if(value!=(*it)[0]&&value!=(*it)[1]&&value!=(*it)[2]&&binary_search(source.begin(),source.end(),value))
{
printf("%d\n",(*it)[2]);//输出
flag=true;
break;
}
}
if(flag != true)
printf("no solution\n");
}

return 0;
}


template <class S,class R> inline
void combination(S &source,int n,int m,R &result){

bool binary_Array[n];//创建布尔数组
S t(m,NULL);
int index,j=0;

for (index=0;index<m;index++) binary_Array[index]=true;//创建一个新组合,选中的数置为1
for (index=m;index<n;index++) binary_Array[index]=false;//没被选中的数置为0

//保存初始组合
for (index=0;index!=n;index++){
if (binary_Array[index]==true) t[j++]=source[index];
}
result.push_back(t);

while(true){
//开始寻找10。如果找到就跳出循环
for (index=0;index<n-1;index++)
if (binary_Array[index]==true&&binary_Array[index+1]==false) break;

if (index==n-1) return; //没有找到10就结束程序

//把10变成01
binary_Array[index]=false;
binary_Array[index+1]=true;

int p=0;//从左向右寻找零标志位用的索引

//10变成01后,把i左边的1标志位全部移动到最左边
while (p<index){
while (binary_Array[p]==true) p++;//从左向右寻找0标志位,如果找到就向下执行
while (binary_Array[index]==false) index--;//从右向左寻找1标志位,如果找到就向下执行
//如果左边有零标志位,就与右边的1标志位进行交换
if (p<index) {
binary_Array[p]=true;
binary_Array[index]=false;
}
}
//保存组合
j=0;
for (index=0;index!=n;index++){
if (binary_Array[index]==true) t[j++]=source[index];
}
result.push_back(t);
}
}


刚开始写的代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;

int main()
{
int n, i, j, k, value, flag = 1;
while(scanf("%d", &n), n)
{
flag = 1;
int a[n];
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
sort(a, a+n);
for(i = n-1; i >= 0; i--)
{
for(j = 0; j < n; j++)
{
for(k = 0; k < n; k++)
{
if(i!=j && j!=k && i!=k)
{
value = a[i] - a[j] - a[k];
if(value!=a[i]&&value!=a[j]&&value!=a[k]&&binary_search(a,a+n,value))
{
printf("%d\n", a[i]);
flag = 0;
break;
}
}
if(flag == 0) break;
} if(flag == 0) break;
} if(flag == 0) break;
}
if(flag == 1)
printf("no solution\n");
}

return 0;
}
...全文
325 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
greex 2015-02-07
  • 打赏
  • 举报
回复
也许我没有看懂题目,感觉这样就搞定了啊: void test(std::vector<int>& vecObj) { int iRet=INT_MAX; if (vecObj.size()>3) { std::sort(vecObj.begin(),vecObj.end()); unsigned int uStartPos=0; int iTmpRet=std::accumulate(vecObj.begin()+uStartPos,vecObj.begin()+3+uStartPos,0); while (uStartPos<vecObj.size()-3) { if (std::binary_search(vecObj.begin()+3+uStartPos,vecObj.end(),iTmpRet)) { iRet=iTmpRet; } ++uStartPos; iTmpRet=std::accumulate(vecObj.begin()+uStartPos,vecObj.begin()+3+uStartPos,0); } } if (iRet==INT_MAX) { std::cout<<"no solution"<<std::endl; } else { std::cout<<iRet<<std::endl; } }
unituniverse2 2015-02-06
  • 打赏
  • 举报
回复
引用 4 楼 adusuccessfully 的回复:
楼上犀利的赵老师此刻在刷屏啊!!!
透眸 2015-02-06
  • 打赏
  • 举报
回复
引用 1 楼 sniffer12345 的回复:
刚开始写的代码多漂亮,简洁干净 要优化的话针对算法改进就好了 到后来就走火入魔了,非要上模板了上stl了。。 写一大堆,容易出错又复杂 想判断哪里是性能热点还很麻烦 楼主你代码写得挺漂亮的,不过不要给那些夸夸其谈的人忽悠了,别把简单事情搞复杂
刚开始是A N 3 ,后来写成C N 3 ,为什么反而慢了呢?排列应该比组合慢啊。难道保存结果很费时吗?
动力风暴 2015-02-06
  • 打赏
  • 举报
回复
楼上犀利的赵老师此刻在刷屏啊!!!
FancyMouse 2015-02-06
  • 打赏
  • 举报
回复
一个不存所有组合。一个要保存下来。O(n^3)的量。不慢就奇怪了。算法本身框架还是没变,复杂度还是O(n^3logn)。所以你这问题不关复杂度什么事。 顺便这题有O(n^2)的办法。你先别想着用什么奇淫技巧,先把复杂度提上去再说。
赵4老师 2015-02-06
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代! 请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。 意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。 试对比 图书馆(对图书的分类够结构化了吧) 和 搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索) 哪个处理信息更方便、更高效。 所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。 结构越复杂,越难修改,越难除错。 有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。 程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George
sniffer12345 2015-02-05
  • 打赏
  • 举报
回复
刚开始写的代码多漂亮,简洁干净 要优化的话针对算法改进就好了 到后来就走火入魔了,非要上模板了上stl了。。 写一大堆,容易出错又复杂 想判断哪里是性能热点还很麻烦 楼主你代码写得挺漂亮的,不过不要给那些夸夸其谈的人忽悠了,别把简单事情搞复杂

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧