应用二分查找算法对计算氢键寿命的程序做优化

应用二分查找算法对计算氢键寿命的程序做优化

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=12x=nlog2(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.总结

本文主要是讲利用二分查找算法对计算氢键寿命的程序做优化,其中核心的优化部分在查找上一时刻的成对氢键在下一时刻是否还存在,可以看到使用二分查找后对计算速度的提升非常明显。需要注意的是,二分查找的前提是首先该数组需要是有序的,这其中可能会需要用到一些排序算法。另外,也还有一些其他的查找算法,如插值查找和斐波那契查找。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值