应用二分查找算法对计算氢键寿命的程序做优化
1. 氢键寿命
2. 二分查找
3. 总结
1.氢键寿命
这是氢键寿命的数学形式,其含义为在0时刻成氢键,在t时刻这对氢键是否还成键。所以在得到每一帧的成对成键后,其编程核心就在于找上一时刻的成对氢键在下一时刻是否还存在,所以其根本就是一个查找。当然,我们可以使用最简单,最暴力的遍历查找,但是这种查找在数据量很大的时候会非常的慢。
2.二分查找
二分查找又成折半查找,二分查找的大前提是,该数组必须是有序的,这就涉及到各种各样的排序算法,如冒泡排序,插入排序,快速排序,桶排序等等。二分查找在最坏的情况下依次是n/2,n/4,n/8…, 一直到1为止。其中n为有n个数。
n
(
1
2
)
x
=
1
⟹
2
x
=
n
⟶
log
2
(
n
)
=
x
n\left(\frac{1}{2}\right)^x=1 \Longrightarrow 2^x=n \longrightarrow \log _2(n)=x
n(21)x=1⟹2x=n⟶log2(n)=x
从中我们可以看出,当有n个数据的时候,最多查询x次就可以查到该值。从下边的算法时间复杂度我们可以看出,暴力遍历时时间复杂度呈线性,而二分查找的时间复杂度为log函数,当数据量大的时候,二分查找的速度尤为明显!
图引自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;
}
这是使用暴力遍历的运行时间,约为1h,
在相同的数据量下,采用二分查找仅用了6min,其效果可见一斑!
3.总结
本文主要是讲利用二分查找算法对计算氢键寿命的程序做优化,其中核心的优化部分在查找上一时刻的成对氢键在下一时刻是否还存在,可以看到使用二分查找后对计算速度的提升非常明显。需要注意的是,二分查找的前提是首先该数组需要是有序的,这其中可能会需要用到一些排序算法。另外,也还有一些其他的查找算法,如插值查找和斐波那契查找。