二分探索アルゴリズムを適用して、水素結合寿命を計算するプログラムを最適化します。
1. 水素結合寿命
2.二分探索
3. まとめ
1.水素結合寿命
これは水素結合の寿命の数学的形式であり、時間 0 で水素結合が形成されるかどうか、および時間 t で水素結合のペアがまだ結合であるかどうかを意味します。したがって、各フレームの対の結合を取得した後、前の瞬間の対の水素結合が次の瞬間にもまだ存在するかどうかを見つけるのがプログラミングの中心であり、基本的には検索です。もちろん、最も単純で最も激しい横断検索を使用することもできますが、データの量が多い場合、この検索は非常に遅くなります。
2.二分探索
二分検索は半検索とも呼ばれます。二分検索の大前提は、配列が順序付けされている必要があることです。これには、バブル ソート、挿入ソート、クイック ソート、バケット ソートなどのさまざまなソート アルゴリズムが含まれます。最悪の場合の二分探索は、1 まで n/2、n/4、n/8... となります。このうち、nはn個あるという意味です。
n ( 1 2 ) x = 1 ⟹ 2 x = n ⟶ log 2 ( n ) = xn\left(\frac{1}{2}\right)^x=1 \Longrightarrow 2^x=n \longrightarrow \ log _2(n)=xn(21)バツ=1⟹2バツ=n⟶ログ_2( n )=x
から、データが n 個ある場合、最大 x 回のクエリで値を見つけることができることがわかります。以下のアルゴリズムの時間計算量から、ブルート フォース トラバーサルの時間計算量は線形であるのに対し、二分探索の時間計算量は対数関数であることがわかります。データ量が多い場合、二分探索の速度は特に顕著です。 !
図はleetbookより引用 https://leetcode.cn/leetbook/read/illustration-of-algorithm/r81qpe
これは再帰的に実装される二分探索であり、ループを使用して実装することもできます。
int find(struct result *data, int start, int end, int value){
if (start <= end){
int mid = (start + end) / 2;
int midvalue = (data + mid) -> OW[0];
if (midvalue == value){
return mid;
}
if (value < midvalue){
return find(data,start,mid-1,value);
}
if (value > midvalue){
return find(data,mid+1,end,value);
}
}
return -1;
}
ブルート フォース トラバーサルの実行時間は約 1 時間ですが、
同じデータ量であれば、バイナリ サーチにかかる時間はわずか 6 分であり、その効果は明らかです。
3. まとめ
この記事では主に、二分探索アルゴリズムを使用して水素結合寿命を計算するプログラムを最適化する方法について説明します。最適化の核となる部分は、前の瞬間のペアになった水素結合が次の瞬間にもまだ存在するかどうかを調べることです。計算が実行されていることがわかります。二分探索を使用すると速度が向上し、その改善は非常に明白です。二分探索の前提として、配列を最初に順序付けする必要があることに注意してください。これには、いくつかの並べ替えアルゴリズムの使用が必要になる場合があります。さらに、内挿検索やフィボナッチ検索など、他の検索アルゴリズムもあります。