yennnn
編程時間
占用的記憶體空間
實際執行一次花了多久
我們需要一個更一般化的理論來分析
怎麼算\(T(n)\)呢?
int sum(int list[], int n){
int i;
int result = 0;
for(int i = 0; i < n; i++){
result = result + list[i];
}
return result;
}
int sum(int list[], int n){
int i;
int result = 0;
for(int i = 0; i < n; i++){
result = result + list[i];
}
return result;
}
\(1\)
\(1\)
\(2(n + 1) + 1\)
\(n\)
\(1\)
每行計算步驟數
\(3n + 6\)
\(T(n) = 3n + 6\)
array_add(int m, int n, int A[m][n], int B[m][n], int C[m][n]){
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
C[i][j] = A[i][j] + B[i][j];
}
}
}
array_add(int m, int n, int A[m][n], int B[m][n], int C[m][n]){
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
C[i][j] = A[i][j] + B[i][j];
}
}
}
每行執行步驟
\(2(m + 1) + 1\)
\(2(m + 1) + 1\)
\(2m(n + 1) + 1\)
\(mn\)
\(T(n) = 2mn + 4m + 4\)
#include <iostream>
#define MAXN 200100
#define INF 2147483647
using namespace std;
int arr[MAXN];
class segment_tree {
public:
void init(int n) { fill(seg_arr, seg_arr + 4 * n, INF); }
void build(int l, int r, int cur) {
if (l == r) {
seg_arr[cur] = arr[l];
return;
}
int mid = (l + r) / 2;
build(l, mid, cur * 2);
build(mid + 1, r, cur * 2 + 1);
seg_arr[cur] = min(seg_arr[cur * 2], seg_arr[cur * 2 + 1]);
return;
}
void modify(int l, int r, int ind, int val, int cur) {
if (l == r && l == ind) {
arr[ind] = val;
seg_arr[cur] = val;
return;
}
int mid = (l + r) / 2;
if (ind <= mid) {
modify(l, mid, ind, val, cur * 2);
} else {
modify(mid + 1, r, ind, val, cur * 2 + 1);
}
seg_arr[cur] = min(seg_arr[cur * 2], seg_arr[cur * 2 + 1]);
return;
}
int query(int l, int r, int ql, int qr, int cur) {
if (l > r || ql > r || qr < l) return INF;
if (l >= ql && r <= qr) return seg_arr[cur];
int mid = (l + r) / 2;
// cout << l << ' ' << r << '\n';
return min(query(l, mid, ql, qr, cur * 2),
query(mid + 1, r, ql, qr, cur * 2 + 1));
}
void print(int n) {
for (int i = 0; i <= 4 * n; i++) {
cout << "seg_arr[" << i << "] = " << seg_arr[i] << '\n';
}
}
protected:
int seg_arr[MAXN * 4];
};
segment_tree seg;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, q;
cin >> n >> q;
fill(arr, arr + n + 10, INF);
seg.init(n);
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
seg.build(1, n, 1);
// seg.print(n);
while (q--) {
int m, a, b;
cin >> m >> a >> b;
if (m == 1) {
seg.modify(1, n, a, b, 1);
} else {
cout << seg.query(1, n, a, b, 1) << '\n';
}
}
return 0;
}
這樣要怎麼分析?==
成長越快
階數越高
\(n\)
\(n^2 + n\)
\(n + \log n\)
\(n + n \log n\)
\(2^n + n^2\)
\(\mathcal{O}(n)\)
\(\mathcal{O}(n^2)\)
\(\mathcal{O}(n)\)
\(\mathcal{O}(n \log n)\)
\(\mathcal{O}(2^n)\)
\(n\)
\(2n\)
\((\log 2) + n\)
\((\log 2)n\)
\(\log (2n)\)
\(\log_{7122} n\)
\(\mathcal{O}(n)\)
\(\mathcal{O}(n)\)
\(\mathcal{O}(n)\)
\(\mathcal{O}(\log n)\)
\(\mathcal{O}(n)\)
\(\mathcal{O}(\log n)\)
vector<int> a;
sort(a.begin(), a.end());
\( \mathcal{O} (n \log n)\)
vector<int> a[n];
for(int i = 0; i < n; i++)
sort(a[i].begin(), a[i].end());
\( \mathcal{O} (n^2 \log n)\)
vector<int> a[n];
for(int i = 0; i < n; i++)
a[i].push_back(1);
sort(a[i].begin(), a[i].end());
\( \mathcal{O} (n + n \log n) = \mathcal{O} (n \log n)\)