谈到算法,好多人都感到脑壳疼,我也不例外。主要是平时工作忙,下班了还有各种进步,基本对算法这一块研究的较少。算法可以称之为前辈智慧的结晶。算法的好坏更多的是从时间复杂度,空间复杂度来考量的。对于我们这些使用者来说,如何结合实际的情况去平衡好时间,空间的关系才是重点。下面结合一个简单的算法和大家一块学习一下。
题目:实现交换两个变量的值
可以实现的算法如下:
1,借助中间变量进行交换
//借助中间变量进行交换
void swap(int a,int b){
int tmp = a;
a = b;
b = tmp;
// printf("a:%d\n",a);
// printf("b:%d\n",b);
}
2,使用加法进行交换
//使用加法进行
void swap1(int a,int b){
a = a + b;
b = a - b;
a = a -b;
// printf("a:%d\n",a);
// printf("b:%d\n",b);
}
3,使用乘法进行交换
//使用乘法
void swap2(int a,int b){
a = a * b;
b = a / b;
a = a / b;
// printf("a:%d\n",a);
// printf("b:%d\n",b);
}
4, 使用异或运算进行交换
//使用异或运算
void swap3(int a,int b){
a = a ^ b;
b = a ^ b;
a = a ^ b;
// printf("a:%d\n",a);
// printf("b:%d\n",b);
}
这几种方法都可以实现交换两个变量的值,除了第一种方法临时需要额外的内存空间外,其余的都不需要。其余的都是通过运算来实现两个变量交换值。根据这些特征我们分析出来,第一种借助中间变量来实现值交换的方法是通过开辟内存减少运算量的方式,也就是空间换时间。剩下的都是时间换空间。为了验证差别,我这边把函数的执行加入了for循环。具体代码如下:
int main(int argc, const char * argv[]) {
// insert code here...
printfCurrentTime();
for (long i = 0; i < 10000000000; i++) {
// swap(3, 1);
// swap1(3, 1);
// swap2(3, 1);
// swap3(3, 1);
}
printfCurrentTime();
return 0;
}
// 打印当前时间
void printfCurrentTime(void){
time_t time1;
time(&time1);
printf("time:%s\n",ctime(&time1));
}
借助中间变量进行交换,运行结果如下:
time:Sat Jul 27 12:03:02 2019
time:Sat Jul 27 12:03:25 2019
Program ended with exit code: 0
我们计算出来的时间差是23秒
使用加法进行变量值交换,运行结果如下:
time:Sat Jul 27 12:03:55 2019
time:Sat Jul 27 12:04:23 2019
Program ended with exit code: 0
我们计算出来的时间差是28秒
使用乘法进行变量值交换,运行结果如下:
time:Sat Jul 27 12:18:17 2019
time:Sat Jul 27 12:19:18 2019
Program ended with exit code: 0
我们计算出来的时间差是61秒
使用异或运算进行变量值交换,运行结果如下:
time:Sat Jul 27 12:24:33 2019
time:Sat Jul 27 12:25:00 2019
Program ended with exit code: 0
我们计算出来的时间差是27秒。
通过比较时间差,我们可以发现借助辅助变量进行值交换消耗时间最少。利用乘法实现变量交换耗时最大,异或和加法实现值交换耗时差别不大。验证了我们之前空间换时间的猜测。
更多优质文章,可以微信扫码关注: