算法设计思想入门

算法设计思想入门

利用数学优化算法:

  • 算法复杂度
  • 状态定义
  • 高效算法设计
  • 利用数学优化算法

复杂度的概念

  • 空间复杂度

  • 时间复杂度
    (在非大型工程中,常常用时间和空间复杂度来评判一个程序好坏)

问题1

一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么第n个月一共有多少对兔子? 最后答案对1e9+7取模。

先看问题规模,对于n小于15

f(int n)
    if(n==1||n==2)
        return 1;
    return f(n-1)+f(n-2);

对于n小于1e6?

int dp[1e6+10];
f(int n){
    if(dp[n])
        return dp[n];
    if(n==1||n==2)
        return 1;
    return dp(n)=f(n-1)+f(n-2);
}

不同点?

状态

2点
(1)
把一个事物抽象成一个数字(或者一串字符),用这个数字(或字符)表达这个事物,并且赋予这个数字一个含义(含义的内容可以自定,一般定为需要求解的问题)
(2)
要检测自己的状态是否正确,往往看这个状态能不能包含实例要求的属性,并且看看能不能转移

对于dp:

int dp[1e6+10];
f(int n) {
    if(dp[n]) 
        return dp[n];
    if(n == 1 || n == 2) 
        return 1;
    return dp[n] = f(n-1) + f(n-2);
}

转移方程就是:

dp[i] = dp[i-1] + dp[i-2];

高效算法设计

快速排序;
归并思想.

归并思想

在解决一个问题时,往往因为问题规模过大无法下手,或者问题太难,但是可以分解成小问题解决,再合并解决整个大问题。

满足

  • 分:

    能够分解成各互相独立的规模更小的问题,并且解决这些小问题的方法和解决整个问题完全一样

  • 和:

    在解决了小问题之后,大问题自然就解决

  • 做法:
    通常用状态表示解决问题的规模,方法写着递归函数里面。然后递归求解

快速排序

void QuickSort(int a[], int l, int r) {
    if(l < r) {
        int key = a[l];
        int L = l, R = r;
        while(L < R) {
            while(a[R] >= key && L < R) 
                R--;
            a[L] = a[R];
            while(a[L] <= key && L < R) 
                L++;
            a[R] = a[L];        
        }
        a[L] = key;
        QuickSort(l, L-1);
        QuickSort(L+1, r);
    }
}

实例:

某火车运来一堆砖,有n个砖块,你的任务是把这一堆砖块分成一个一堆的,

  • 每次可以选择一堆来分,
  • 每次只能把一堆分成两堆,假设这两堆数量分别为a, b,那么分的代价为abs(a-b)。
  • 给你n,完成目的的最小代价总和为多少?

利用数学知识优化算法

  1. 还是兔子问题,如果n的范围为1e18,如何求解?

你可能感兴趣的:(算法)