데이터 구조 - 알고리즘 - 분할 정복, 빠른 전력
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 ) 을 구현하세요 .x
n
x的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;
}
};