作为循环条件,~i与i>=0有什么不同(猜测版)

 ~i与i>=0有什么不同


敲代码的时候
for循环的条件写的是~i,结果超出时间限制了
但只要改为i>=0就可以过掉题目

所以两者有什么不同吗?_?

(原问题贴*2,感谢提供回答及思路的善良大佬们~)

for(int i = n; i >= 0; --i) { ;}
for(int i = n; ~i; --i) { ;}

可以看到

无论是第一个还是第二个循环当中,当i=-1时,循环跳出 

两个循环功能相同

(下方只是举个例子,如果不了解,并不影响什么)

在链式前向星中,如果将head数组初始化为-1,会经常使用上面两个循环

也同样在敲题的时候,发现

写i>=0的代码可以规避掉写~i的代码的TLE问题

(关于怎么debug出来的,作者表示:呜~它恶心啊)

那么,判断就是:

在常数大、数据范围大、算法正好卡在线上的时候

i>=0这种表达方法起了作用


下面是一些简单的实验

代码如下

因为整型下的一次循环花费时间略小,不方便使用

所以代码里敲的是两次或三次循环

#include<bits/stdc++.h>
#define ri register int
using namespace std;
int n=1000;//更大数据同理
signed main() {
	printf("数据大小为:%d的三次方\n",n);
	clock_t st,ed;
	st=clock();
	for(ri i=n; i>=0; --i)
		for(ri j=n; j>=0; --j)
			for(ri k=n; k>=0; --k);
	ed=clock();
	printf("大小比较表示所用时间:\n%lfs\n",(double)(ed-st)/CLOCKS_PER_SEC);

	st=clock();
	for(ri i=n; ~i; --i)
		for(ri j=n; ~j; --j)
			for(ri k=n; ~k; --k);
	ed=clock();
	printf("取反表示所用时间:\n%lfs\n",(double)(ed-st)/CLOCKS_PER_SEC);
	return 0; }

发现,在大多数时候,相比于~i,i>=0这种代码形式会更快一些

然而也有不一样的例外,比如下图

在这种例外发生的时候,发现再次编译后输出时间发生了变化

有t1>t2的时候,也有t1<t2的时候

介于随机性很大,而且类似的数据范围在打题的时候TLE的可能性大,

所以不作考虑 

 


所以

在时间限制内,直接的大小比较更好一些

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值