iOSでデータ交換を実現するいくつかの方法の紹介とその効率の比較
3109 ワード
2つのデータ交換はプログラミングでよく使用されます.たとえば、ソートアルゴリズムでよく使用されます.次に、よく使用される3つの方法を紹介し、交換に多く使用されるプログラムで効率を向上させるために、それらの効率を比較します.
1つ目の方法は、一時tempを使用します.コードは次のとおりです.
第2の方法は,追加の記憶領域を直接用いずに2つのデータ上で直接動作するが,この方法は2つの数を加算する際に境界を越える問題を生じる可能性がある.コードは次のとおりです.
3つ目の方法は、異演算子または演算子を使用することです.
//2017-11-13 14:36:19.610391+0800 arithmetic[7331:360857]変換前の値c 1=3、c 2=5 //2017-11-13 14:36:19.610558+0800 arithmetic[7331:360857]変換後のc 1=5,c 2=3
また、計算のコツ:同じように0を取り、同じように1を取ります. 実際には10進数の数値が使われていますが、2つの10進数の数値がどのように異や計算されているかを見てみましょう. 5 ⊕ 3 = ? 1.計算する前に数値をバイナリに変換します. 5と3からバイナリへの変換:0101、0011 0101 xor 0011 ———— 結果0110 2.結果0110を10進数に変換する:6 3.だから5
私のプログラムで比較を実行すると、次の結果が得られます.
その結果,第1の方法は効率が最も高く,第1の方法は余分なメモリ空間を占めているが,交換された3行のコードはいずれも付与動作を実現し,相対的に後の2つの加減と異あるいはより速いことが分かった.したがって,交換量が大きい場合は,第1の方法が推奨され,速度が速く,最も理解しやすい.次は3つ目の方法が比較的速く、最も次は2つ目の方法ですが、2つ目の方法と3つ目の方法の効率はあまり違いません.
1つ目の方法は、一時tempを使用します.コードは次のとおりです.
int a1 = 3;
int a2 = 5;
int temp;
temp = a1;
a1 = a2;
a2 = temp;
第2の方法は,追加の記憶領域を直接用いずに2つのデータ上で直接動作するが,この方法は2つの数を加算する際に境界を越える問題を生じる可能性がある.コードは次のとおりです.
int b1 = 3;
int b2 = 5;
//b1 = b1 + b2
//b2 = b1 + b2 - b2 = b1
//b1 = b1 + b2 - (b1 + b2 - b2) =b2
b1 = b1 + b2;
b2 = b1 - b2;
b1 = b1 - b2;
3つ目の方法は、異演算子または演算子を使用することです.
int c1 = 3;
int c2 = 5;
NSLog(@" a=%d,b=%d",c1,c2);
// a=a^b;
// b=b^a;
// a=a^b;
c1 ^= c2;
c2 ^= c1;
c1 ^= c2;
NSLog(@" a=%d,b=%d",c1,c2);
//2017-11-13 14:36:19.610391+0800 arithmetic[7331:360857]変換前の値c 1=3、c 2=5 //2017-11-13 14:36:19.610558+0800 arithmetic[7331:360857]変換後のc 1=5,c 2=3
また、計算のコツ:同じように0を取り、同じように1を取ります. 実際には10進数の数値が使われていますが、2つの10進数の数値がどのように異や計算されているかを見てみましょう. 5 ⊕ 3 = ? 1.計算する前に数値をバイナリに変換します. 5と3からバイナリへの変換:0101、0011 0101 xor 0011 ———— 結果0110 2.結果0110を10進数に変換する:6 3.だから5
私のプログラムで比較を実行すると、次の結果が得られます.
その結果,第1の方法は効率が最も高く,第1の方法は余分なメモリ空間を占めているが,交換された3行のコードはいずれも付与動作を実現し,相対的に後の2つの加減と異あるいはより速いことが分かった.したがって,交換量が大きい場合は,第1の方法が推奨され,速度が速く,最も理解しやすい.次は3つ目の方法が比較的速く、最も次は2つ目の方法ですが、2つ目の方法と3つ目の方法の効率はあまり違いません.