수소결합 수명 계산 프로그램을 최적화하기 위해 이진 검색 알고리즘을 적용합니다.

수소결합 수명 계산 프로그램을 최적화하기 위해 이진 검색 알고리즘을 적용합니다.

1. 수소결합 수명

2. 바이너리 검색

3. 요약

1.수소결합 수명

여기에 이미지 설명을 삽입하세요.
이는 수소결합 수명의 수학적 형태로, 0시간에 수소결합이 형성되었는지 여부와 t시간에 수소결합 쌍이 여전히 결합인지 여부를 의미합니다. 따라서 각 프레임의 쌍결합을 얻은 후, 이전 순간의 쌍결합된 수소결합이 다음 순간에도 여전히 존재하는지를 알아내는 것이 프로그래밍의 핵심이므로 기본적으로는 탐색이다. 물론 가장 단순하고 가장 폭력적인 순회 검색을 사용할 수 있지만 이 검색은 데이터 양이 많을 때 매우 느려집니다.

2.바이너리 검색

이진 탐색은 반서치(half search)라고도 하는데, 이진 탐색의 주된 전제는 배열이 순서대로 이루어져야 한다는 것이며, 여기에는 버블 정렬, 삽입 정렬, 퀵 정렬, 버킷 정렬 등 다양한 정렬 알고리즘이 포함됩니다. 최악의 경우 이진 검색은 n/2, n/4, n/8..., 1까지입니다. 그 중 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 \ 로그 _2(n)=xN(21)엑스=12엑스=N로그 _2( n )=x
를 보면 n 개의 데이터가 있을 때 최대 x 번 쿼리하면 해당 값을 찾을 수 있음을 알 수 있습니다. 아래 알고리즘의 시간 복잡도를 보면 무차별 탐색의 시간 복잡도는 선형인 반면 이진 검색의 시간 복잡도는 로그 함수임을 알 수 있습니다. 데이터 양이 많을 때 이진 검색의 속도는 특히 분명합니다. !
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
Leetbook에서 인용한 그림 https://leetcode.cn/leetbook/read/design-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. 요약

이번 글에서는 수소결합 수명 계산을 위한 프로그램을 최적화하기 위해 이진 탐색 알고리즘을 사용하는 것에 대해 주로 이야기하고 있는데, 핵심 최적화 부분은 이전 순간에 쌍을 이룬 수소결합이 다음 순간에도 여전히 존재하는지 찾아내는 것이고, 계산 속도를 보면 알 수 있다. 이진 검색을 사용한 후 개선이 매우 분명합니다. 이진 검색의 전제는 배열을 먼저 정렬해야 하며, 이를 위해서는 일부 정렬 알고리즘을 사용해야 한다는 점에 유의해야 합니다. 또한 보간 검색 및 피보나치 검색과 같은 다른 검색 알고리즘도 있습니다.

추천

출처blog.csdn.net/weixin_45765073/article/details/127526371