IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法设计与分析代码实现笔记 -> 正文阅读

[数据结构与算法]算法设计与分析代码实现笔记

dynamic programming

矩阵链式乘法

确定结合律使用顺序以达到最小乘法次数

错误使用递归实现动态规划的例子

复杂度 O ( 2 n ) O(2^n) O(2n),由递推方程通过数学归纳法可证

#include <vector>
#include <iostream>
using namespace std;

typedef vector<vector<int>> Matrix;
class Solution{
public:
    int recurMatrixChain(vector<int> &P, int lo, int hi){
        if (lo >= hi-1) return 0;
        int res = INT_MAX;
        for(int mid = lo+1; mid < hi; mid++){
            int tmp = recurMatrixChain(P, lo, mid)+recurMatrixChain(P, mid, hi)+P[lo]*P[mid]*P[hi];
            res = tmp < res ? tmp : res;
        }
        return res;
    }
};

int main(int argc, const char * argv[]) {
    unsigned seed = time(0);
    srand(seed);
    vector<int> p;
    int n = 4;
    for (int i = 0; i < n; i++){
        p.push_back((rand()%100)+1);
    }
    for (int i : p){
        cout << i << ',';
    }
    cout << endl;
    Solution s;
    cout << s.recurMatrixChain(p, 0, n-1) << endl;
    return 0;
}

使用迭代实现动态规划

建立备忘录 O ( n 3 ) O(n^3) O(n3),通过标记函数获得最终括弧添加位置 O ( n ) O(n) O(n)

#include <vector>
#include <stack>
#include <iostream>
#include <fstream>
#include <list>
#include <sys/stat.h>

using namespace std;
typedef vector<vector<int>> Matrix;

class Solution{
private:
    struct TreeNode{
        string val;
        TreeNode *lc, *rc;
    };
    vector<vector<int>> memo, mark; //备忘录与标记函数,标记函数在某些dp问题中不必需
    TreeNode* root;
public:
	//主算法
    int iterateMatrixChain(vector<int> &p){
        int n = p.size();
        memo = vector<vector<int>> (n-1, *new vector<int>(n-1, 0));
        mark = vector<vector<int>> (n-1, *new vector<int>(n-1, 0));
        for (int numberOfMatrices = 2; numberOfMatrices < n; numberOfMatrices++){
            for (int lo = 0; lo < n-numberOfMatrices; lo++){
                int hi = lo+numberOfMatrices-1;
                int least = INT_MAX;
                for (int endOfFirst = lo; endOfFirst < hi; endOfFirst++){
                    int startOfSecond = endOfFirst+1;
                    int tmp = memo[lo][endOfFirst] + memo[startOfSecond][hi] + p[lo]*p[startOfSecond]*p[hi+1];
                    if (tmp < least){
                        least = tmp;
                        memo[lo][hi] = tmp;
                        mark[lo][hi] = endOfFirst;
                    }
                }
            }
        }
        root = establish(mark, 0, n-2);
        return memo[0][n-2];
    }
    //建立表达式树
    TreeNode* establish(vector<vector<int>> &mark, int lo, int hi){
        TreeNode* cur = new TreeNode();
        if (lo == hi){
            cur->val = to_string(lo);
        }else{
            cur->val = ".";
            int mid = mark[lo][hi];
            cur->lc = establish(mark, lo, mid);
            cur->rc = establish(mark, mid+1, hi);
        }
        return cur;
    }
    //扁平化,以将括弧插入字符串
    list<string> inorder(TreeNode* cur){
        list<string> l;
        if (cur->val.compare(".") != 0){
            l.push_back("A_{");
            l.push_back(cur->val);
            l.push_back("}");
        }else{
            l.push_back("(");
            l.splice(l.end(), inorder(cur->lc));
            l.splice(l.end(), inorder(cur->rc));
            l.push_back(")");
        }
        return l;
    }
    //对外提供调用接口
    list<string> getSequence(){
        return inorder(root);
    }
};

//main(int argc, const char * argv[])测试程序中涉及文件io
int main(int argc, const char * argv[]) {
    vector<int> p = {30,35,15,5,10,20};
    Solution s;
    s.iterateMatrixChain(p);
    list<string> l = s.getSequence();
    string format1 = R"(\documentclass[10pt]{article}
\usepackage[usenames]{color} %used for font color
\usepackage{amssymb} %maths
\usepackage{amsmath} %maths
\usepackage[utf8]{inputenc} %useful to type directly diacritic characters
\begin{document}
\begin{align*})";
    string format2 = R"(\end{align*}
\end{document})";
    ofstream fs;
    fs.open("yourOwnWorkspace/matrix.tex", ios::out);
    fs << format1;
    for (auto i : l){
        fs << i;
    }
    fs << format2;
    fs.close();
    fs.open("yourOwnWorkspace/openlatex.sh", ios::out);
    fs << R"(cd yourOwnWorkspace)" << endl;
    fs << R"(latex ./matrix.tex)" << endl;
    fs << R"(dvipdf ./matrix.dvi)" << endl;
    fs.close();
    chmod("yourOwnWorkspace/openlatex.sh", S_IEXEC);
    system("yourOwnWorkspace/openlatex.sh");
    return 0;
}

在源代码文件夹打开终端,使用
g++ -std=c++17 main.cpp -o main.out,生成可执行文件
sudo ./main.out,输入本机密码后,可执行文件获得sh执行权限,sh启动自动化脚本生成pdf文件。
pdf文件中矩阵运算次序指示:
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-30 19:10:58  更:2022-01-30 19:12:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:37:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码