談到算法,好多人都感到腦殼疼,我也不例外。主要是平時工作忙,下班了還有各種進步,基本對算法這一塊研究的較少。算法可以稱之爲前輩智慧的結晶。算法的好壞更多的是從時間複雜度,空間複雜度來考量的。對於我們這些使用者來說,如何結合實際的情況去平衡好時間,空間的關係纔是重點。下面結合一個簡單的算法和大家一塊學習一下。
題目:實現交換兩個變量的值
可以實現的算法如下:
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秒。
通過比較時間差,我們可以發現藉助輔助變量進行值交換消耗時間最少。利用乘法實現變量交換耗時最大,異或和加法實現值交換耗時差別不大。驗證了我們之前空間換時間的猜測。
更多優質文章,可以微信掃碼關注: