読み取りカタログ
- A・O小さなことを証明するための(LOGN)コード
- II。典型的な時間複雑
- III。一般的なL O G N logN個アルゴリズム
- 1.バイナリ検索
- 2.ユークリッドの互除法
- 3.累乗
- IV。$$ライブラリのログ機能
- 最後に、そして最も重要な基本的な
テキスト
A・O小さなことを証明するための(LOGN)コード
以下のコードで見てみましょう:
int cnt = 1;
while (cnt < n)
{
cnt *= 2;
//时间复杂度为O(1)的程序步骤序列
}
CNT以来2それぞれを乗じた後にそれがそれによってCNTループからなり、X回の後、存在する、より近いNにあり、nよりも大きい2 、X = N = N 2×、すなわちX = L O G 2 NX = log2nので、このループの複雑さはO(LOGN)であります
II。典型的な時間複雑
$c$ 常数
$logN$ 对数级
$log ^ 2N$ 对数平方根
$N$ 线性级
$NlogN$
$N ^ 2$ 平方级
$N ^ 3$ 立方级
$2 ^ N$ 指数级
したがって、私たちはそれを見ることができ、L O G アルゴリズムの効率が最も高いN logN個です
III。一般的なL O G N logN個アルゴリズム
1.バイナリ検索
- (int)BinarySearch:(NSArray *)originArray element:(int)element
{
int low, mid, high;
low = 0; high = (int)originArray.count - 1;
while (low <= high) {
mid = (low + high) / 2;
if ([originArray[mid] intValue] < element) {
low = mid + 1;
} else if ([originArray[mid] intValue] > element) {
high = mid -1;
} else {
return mid;
}
}
return -1;
}
2.ユークリッドの互除法
- (unsigned int)Gcd:(unsigned int)m n:(unsigned int)n
{
unsigned int Rem;
while (n > 0) {
Rem = m % n;
m = n;
n = Rem;
}
return m;
}
3.累乗
- (long)Pow:(long)x n:(unsigned int)n
{
if (n == 0) {
return 1;
}
if (n == 1) {
return x;
}
if ([self isEven:n]) {
return [self Pow:x * x n:n / 2];
} else {
return [self Pow:x * x n:n / 2] * x;
}
}
- (BOOL)isEven:(unsigned int)n
{
if (n % 2 == 0) {
return YES;
} else {
return NO;
}
}
IV。$$ライブラリのログ機能
で$$カレーログ()関数とLOG2()関数
自然対数の底デフォルトベースE内のログ()関数
塩基番号LOG2()関数は、わずかにqwq明らかである2
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
//#define DEBUG(x) cerr << #x << "=" << x << endl
int main()
{
cout << log(M_E) << endl;
cout << log2(2) << endl;
return 0;
}
その後、我々は取得します
1
1
結果
$$カレー2つの定数M_E M_PI
M_Eは自然対数ベース番号E表す
円周率を表すπM_PIを
最後に、そして最も重要な基本的な
被験者は、データ範囲に達したとき