데이터 구조-알고리즘-분할 및 정복, 빠른 전력

데이터 구조 - 알고리즘 - 분할 정복, 빠른 전력

1. 파티션

1. 분할 정복의 개념

분열과 정복: 분열과 정복

동일한 솔루션을 사용하여 문제를 여러 문제로 분류

4가지 분할 조건을 만족하세요.

1. 데이터의 크기가 작아질수록 문제의 난이도는 낮아진다

2. 질문은 분할될 수 있습니다

3. 하위 문제는 서로 독립적입니다.

4. 하위 문제의 솔루션을 결합할 수 있습니다.

2. 이진 검색(반 검색) BinaryChop

전제조건: 질서정연함

시간복잡도 O(log2의 n승)

1. 이진 검색을 실현하는 루프

//循环
int BinaryChop1(int a[], int begin, int end ,int find) {
	if (a == nullptr || begin > end) return -1;
	while (begin<= end) {
		int mid = begin+(end- begin)/2 ;
		if (a[mid] == find) {
			cout << "找到了,返回在数组中的下标" << endl;
			return mid;
		}
		else if (a[mid] < find) {
			begin = mid + 1;
		}
		else if (a[mid] > find) {
			end = mid - 1;
		}
		
	}
	return -1;
}

2. 이진 검색의 재귀적 구현

//递归
int BinaryChop2(int a[], int begin, int end, int find) {
	
	if (a == nullptr || begin > end) return -1;
	int mid = begin+(end- begin)/2;
	if (a[mid] == find) {
		cout << "找到了,返回数组下标" << endl;
		return mid;
	}
	else if (a[mid] < find) {
		begin = mid + 1;
	}
	else if (a[mid] > find) {
		end = mid - 1;
	}

	

	return BinaryChop2(a, begin, end, find);

}

2. 빠른 힘

숫자의 힘을 찾아보세요

예를 들어 2의 50승

//简单写法,这种写法求一个数的幂次方速度慢
int a=2;
for(int i=0;i<50;i++){
    
    
	a*=a;
}
//快速幂写法
int x=2
int n=50;
int ans=1;
while(n){
    
    
    temp=n&1;
    if(temp){
    
    
    	ans*=x;
    }
    x*=x;
    n=n>>1;
}
printf("%d",ans);

빠른 지수화는 지수를 이진화하는 것입니다.

그런 다음 1비트를 AND하여 1을 얻으면 최종 출력 결과에 현재 비트 수를 곱하고, 그렇지 않으면 곱하지 않습니다.

그런 다음 지수를 왼쪽으로 1비트만큼 이동하고 현재 비트의 수에 그 자체를 곱합니다.

전원이 0이 될 때까지 작업을 반복하여 종료합니다.

특정 질문 보기 (URL https://leetcode.cn/problems/powx-n/)

주제: (즉, )의 정수 거듭제곱 함수를 계산하는 pow( x , n ) 을 구현하세요 .xnx的n次方

코드는 아래와 같이 표시됩니다.

//这里的代码是c++语言下的
class Solution {
    
    
public:
    double myPow(double x, int n) {
    
    
        int Bool=0;
        int Bool2=0;
        int t=x;
        if(n==0&&x!=0){
    
    
            return 1;
        }
       if(x==0){
    
    
           return 0;
       }
        double ans=1;
         int temp=0;

        if(n<0){
    
    
            if(n==-2147483648){
    
    
                n=2147483647;
                Bool2=1;
            }
            else{
    
    
                 n=abs(n);
                
            }
            Bool=1;
        }

            while(n){
    
    
               temp=n&1;
                if(temp){
    
    
                    ans*=x;
                }
                x*=x;
                n=n>>1;
            }
        if(Bool2){
    
    
            ans*=t;
        }
        if(Bool){
    
    
            ans=1.0/ans;
        }
        return ans;
    }
};

Guess you like

Origin blog.csdn.net/m0_73483024/article/details/132126228