算法与数据结构 南邮 2

125 阅读2分钟

可能需要写代码的部分

排序算法 冒泡 选择 插入 归并 快速排序

冒泡排序 左右进行比较 稳定排序
选择排序 不稳定的

从未排序的部分找出一个然后交换

插入排序 稳定的

将待排序的元素插入到已经排序好的数组当中

for j=2 to A.length:
    key=A[j]
    //将A[j]插入已排序序列A[1..j-1]
    i=j-1
    while i>0 and A[i]>key
        A[i+1]= A[i]
        i=i-1
    A[i+1]=key

归并排序稳定 快速排序不稳定

这个代码应该不用记了

Hanoi塔问题 没有代码明确复杂度

核心代码

void hanoi(int n, int a, int b, int c)
{
    if (n > 0)
    {
        hanoi(n-1, a, c, b);
        move(a,c);
        hanoi(n-1, b, a, c);
    }
}

步数 F(n)=2的n次方-1 复杂度 为O(2的n次方)

矩阵连乘问题 动态规划

代码有点多 感觉应该不会让写代码 记一下状态转移公式和复杂度

为啥是N3 如下

 for(i=0;i<n;i++){ //A矩阵中的n
        for(j=0;j<m;j++){  //A矩阵中的m 或者B矩阵中的m ,一样的
            for(k=0;k<n;k++){ //B矩阵中的n
                C[i][j]= C[i][j]+A[i][k]*B[k][j]; 
             } 
         } 
     }

状态转移方程

空间以及时间复杂度, 时间复杂度为O(n3) 空间复杂度为O(n2) P88页 公式 link

最长公共子序列 最优子结构

以及是动态规划问题 PPT是个J*呀

核心为状态转移方程

dp[i][j] 表示的是text[0:i]与text[0:j]的最长公共子序列

int m = strlen(text1), n = strlen(text2);
    int dp[m + 1][n + 1];
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= m; i++) {
        char c1 = text1[i - 1];
        for (int j = 1; j <= n; j++) {
            char c2 = text2[j - 1];
            if (c1 == c2) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            } else {
                dp[i][j] = fmax(dp[i - 1][j], dp[i][j - 1]);
            }
        }
    }
    return dp[m][n];

。

01背包问题 动态规划

m(i,j)为0-1背包问题 的子问题的最优解的数据结构,容量为j,可选择的物品为i的最优解

物品号从大到小 容量从大到小 我还是喜欢从 0-i的顺序放入背包

核心为两步 初始化 跟 状态转移方程

初始化为 dp[0][j] = 0 ? 如果不能放入

状态转移方程


dp[i][j] = max(dp[i-1][j],dp[i-1][j-wc]+vi)

或者空间不够 dp[i][j]=dp[i-1][j]

双层for循环 
for(i=0){
    for(j=0,C){
        if(空间够){
            状态转移方程1
        }else{
            状态转移方程2
        }
    }
}

01背包问题 背包问题 贪心算法

最优子结构的性质 一个问题的最优解包含其子问题的最优解

背包问题就是物品的个数有很多个,可以选择放一部分

计算出单位重量的价值 vi/wi 而后将最贵重的放入,而后放入次之 为什么01背包不能用贪心规则,因为贪心不能保证将包装满,造成闲置可能的低价值问题

单源最短路径 贪心

给定带权有向图𝑮 = (𝑽, 𝑬),其中每条边的权是非负实数。另外,还给定V 中的一个顶点,称为源。要计算从源到所有其他各顶点的最短路长度。这 里路的长度是指路上各边权之和。

Dijkstra算法是解单源最短路径问题的贪心算法。 d(i,j) 节点i到j的距离 p(i,j) 节点j的先序节点

没给代码看个J*,

最小生成树

e为边数 算法计算时间为O(eloge)

01背包的深度优先搜素

这个应该不用记 代码我都看不懂

回溯法 01背包 旅行售货员问题

没代码不记