动态规划 入门

动态规划 入门

什么是动态规划

动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题[1]和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。 动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。

《算法图解》的定义是:“动态规划先解决子问题,再逐步解决大问题”

背包问题

假设你是一个贪婪的小偷,背着可装35磅物品的背包,在商场伺机偷取物品,你可盗窃的物品有下面三种:

物品

价格

重量

音响

3000美元

30磅

笔记本电脑

2000美元

20磅

吉他

1500美元

15磅

简单算法

最简单的算法是:枚举出所有可能的组合,从中找出价值最高的组合 这样可行,但速度非常慢。在仅有三件商品的情况下,需要计算8个不同的集合;有四件商品需要计算16个集合。每增加一件商品,需要计算的集合数都将翻倍!这种算法的运行时间为

O(an)

动态规划

动态规划的核心思想就是拆分子问题,记住过往,减少重复计算。 并且动态规划一般都是自底向上的。 《算法图解》并没有讲清楚何为动态规划,以及其实现,我将结合这篇博客来讲解 总的来说有四步:

  • 穷举分析
  • 确定边界
  • 找出规律,确定最优子结构
  • 写出状态转移方程

什么是最优子结构?有这么一个解释:

一道动态规划问题,其实就是一个递推问题。假设当前决策结果是f(n),则最优子结构就是要让 f(n-k) 最优,最优子结构性质就是能让转移到n的状态是最优的,并且与后面的决策没有关系,即让后面的决策安心地使用前面的局部最优解的一种性质

1. 穷举分析 背包可放35磅 放15磅

物品\重量

15

吉他 15磅

1500

笔记本电脑 20磅

1500

音响 30磅

1500

放20磅

物品\背包价值\重量

15

20

吉他 15磅 1500美元

1500

1500

笔记本电脑 20磅 2000美元

1500

2000

音响 30磅 3000美元

1500

2000

放35磅

物品\背包价值\重量

15

20

35

吉他 15磅 1500美元

1500

1500

1500

笔记本电脑 20磅 2000美元

1500

2000

3500

音响 30磅 3000美元

1500

2000

3500

不难看出: 1.如果放不下当前行的物品,则直接从上方单元格抄下价格 2.如果放得下,判断本行与上方的价值,填入最高价值

2.确定边界 边界情形为第一行,即最轻的物品需要填入,以保证下方单元格能获取到价格

3.确定最优子结构 当前单元格 = Max(上方单元格价值, 本行物品加入后的价值)

将第 i 件物品的价值 W[i] 加上 向容量为v-C[i] 的背包装入前 i-1 件物品 (现有容量v - 当前物品大小C[i]) 这个 子问题 的最大价值 F[i-1][v-C[i]] (先把第 i 件物品加入背包,然后考虑安排剩余的空间容量)

4.状态转移方程 f[i][j] = Max( f[i - 1][j] , f[i-1][v-C[i]])

leetcode例题

5.最长回文子串 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示: 1 <= s.length <= 1000 s 仅由数字和英文字母组成

代码实现:

public static String longestPalindrome(String s) {
        int len = s.length();
        if (len == 1) {
            return s;
        }
        int rsLen = 1;
        int start = 0;
        // 创建表格
        boolean[][] dp = new boolean[len][len];
        for (int i = 0; i < len; i++) {
            dp[i][i] = true;
        }

        char[] arr = s.toCharArray();

        /*
        初始化后的示例
        	0	1	2	3	4	right
        0	T	F	F	F	F
        1	F	T	F	F	F
        2	F	F	T	F	F
        3	F	F	F	T	F
        4	F	F	F	F	T
        left
        
        对角线 单字符是回文串
        */
//        先按 右指针(列) 遍历
        for (int right = 1; right < len; right++) {
//            再按行遍历
//            只需判断对角线上部,即 left < right
            for (int left = 0; left < right; left++) {
//                判断两端字符相等
                if (arr[left] == arr[right]) {
//                    边界情形  字符串长度小于3的情况
                    if (right - left < 3) {
                        dp[left][right] = true;
                    } else {
//                        普通情况,两头的字符相等的话,找 left + 1, right - 1
//                        即指针都向中间移一格,如果中间的是回文,那当前也是回文
                        dp[left][right] = dp[left + 1][right - 1];
                    }
                }
//                如果当前是回文,且当前字符串长度大于最大字符串长度
                if (dp[left][right] && right - left + 1 > rsLen) {
                    start = left;
//                    最大字符串长度
//                    如果直接取右指针会遇到奇偶问题
                    rsLen = right - left + 1;
                }
            }
        }
        return s.substring(start, start + rsLen);
    }

参考: 1.《算法图解》人民邮电出版社 2. 看一遍就理解:动态规划详解

本文转载于网络 如有侵权请联系删除

相关文章

  • SpringCloud Config配置中心(5)

    SpringCloudConfig配置中心Config架构 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,springcloudconfig可以实现微服务中的所有系统的配置文件的统一管理,而且还可以实现当配置文件发生变化的时候,系统会自动更新获取新的配置。Gitee搭建ConfigServer的后端存储,专门存放配置,以供在客户端获取在Gitee上新建项目spring-cloud-config服务端配置1、引入pom文件<!--spring-cloud整合config-server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency>复制2、添加配置文件application.ymlspring: application: ####注册中心应用名称 name:c

  • SAP CRM IBASE的archive方法

    ThereisoneIBASE112467whichcontainsoneobjectcomponent.ThisIBASEisintendedforarchive.Therearetwoapproachestoarchiveit.(1)YoucouldusetcodeSARAandtype“CRM_IBASE”asarchiveobject,andpressthebuttons“Preproc”,“Write”and“Delete”onebyonetogothroughthearchiveprocess.(2)Youcouldalsomanuallyrunreportforeachofthethreeprocessonebyone.YoucouldfindthereportnameforeachstepviatcodeAOBJ:TheoverviewintroductionaboutIBASEarchivecouldbefoundinsaphelp.Step1:pre-processsteprunreportRIBARCHVandspecifyIBASEID=112467,andgo

  • 「进击的前端工程师」CSS色彩揭秘

    微信搜索【前端食堂】你的前端食堂,记得按时吃饭。本文已收录在前端食堂Githubhttps://github.com/Geekhyt/front-end-canteen,感谢Star。每每提及色彩,我总会想起苏轼的一年好景君须记,正是橙黄橘绿时,白居易的日出江花红胜火,春来江水绿如蓝,朱熹的等闲识得东风面,万紫千红总是春。也许世界本无色彩。古人曾用诗词赋予了这个世界色彩,而如今是物理的光学让我们认识到了色彩。那么本文将带你揭秘CSS中的色彩。先赞在看,养成习惯!CSS中的colorCSS1只支持16个基本颜色关键字 CSS2在CSS1的基础上添加了橙色orange CSS3增加了147个关键字 CSS4只增加了一个关键字rebeccapurpleCSS3中新增147个颜色关键字https://www.w3school.com.cn/cssref/css_colornames.asp我知道你会说这个CSS4的新增的一个关键字rebeccapurple是什么鬼?还嫌我英文单词记的不够多吗?搞个这么难记的东西出来?但实际上,CSS的作者EricMeyer的女儿丽贝卡死于脑癌,享年六岁。这是她

  • 网卡中断绑定

    网卡中断获取网卡设备所有中断[root@PowerCycle_1_DL380G7~]#cat/proc/interrupts|grep-iweth0 52:12403213291261409420135773214576211377229PCI-MSI-edgeeth0-0 53:2524026472257052653924070241920PCI-MSI-edgeeth0-1 54:277002046223116238762243822416PCI-MSI-edgeeth0-2 55:31063117293684049616470PCI-MSI-edgeeth0-3 56:000000000000PCI-MSI-edgeeth0-4 57:345040603890518042514640PCI-MSI-edgeeth0-5 58:11484412300151303526127892613259271240723PCI-MSI-edgeeth0-6 59:000000000000PCI-MSI-edgeeth0-7 复制查看机台node信息(附录:WhatisNUMA)[root@Po

  • 「nodejs + docker + github pages 」 定制自己的 「今日头条」

    前言在闲暇之余,我们经常会逛各种社区,逛掘金看技术软文,逛虎扑看今日赛事,逛头条看热门时事,逛91……每个社区都有各种各样的资讯,但有时我们只想看某个社区的某些资讯。那我们能不能将这些社区里我们想要的信息做一下整合定制成自己的“今日头条”呢?思路每天定时抓取资讯的标题和链接整合后发布到自己的网站这样每天只要打开自己的网站就可以看到属于自己的今日头条啦~抓取资讯puppeteer定时任务node-schedule部署docker+githubpages我的今日头条掘金社区前端热门文章今日头条热门时事虎扑社区nba赛事QQ音乐热门音乐ok,开撸...项目初始化npminit-y复制today'shot │README.md └───html ││index.html//网站入口,用于部署githubpages └───resource ││index.json//资讯数据,爬取存放文件 └───tasks//任务队列 ││index.js ││juejin.js ││top.js ││nba.js ││music.js ││jianshu.js └───tools//工具类 │i

  • 答应我,别再写上千行的类了好吗

    答应我,别再写上千行的类了好吗?最近在对已有项目进行扩展的时候,发现要改动的一个类它长766行,开放了近40个public接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性如果你身边有一个类写上千行的猿,一定要把此文转给ta为什么类不能过长?类过长——读不通,扩展不通读不通——直接用滚轮滚都得好几秒,就算是原作者,时间长了恐怕也难以理清整个类,更不用说是其他的读者扩展不通——一个类有过多的接口,会让扩展这个类变得异常困难,一动千行类过长——可能有冗余代码此时CV工程师打了个冷战冗余代码,就是重复代码,通常出自使用Ctrl+C,Ctrl+V来生产代码的CV工程师之手,冗余代码的危害非常大:冗余代码使方法、类过长,不简洁冗余代码会造成发散式修改(冗余代码需要变动时,每一处Ctrl+V都需要修改)类过长——多半是职责过多一个类开放几十个接口,绝对存在职责过多的问题,就像图中的Tom猫一样手忙脚乱,一个类的职责过多也有巨大问题:违反设计原则——单一职责原则(单一职责原则要求一个类只实现一个职责,比如一只Tom只做扫地、

  • 并发编程之上下文切换学习笔记

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/u014427391/article/details/101290000介绍上下文切换之前先介绍一下进程、线程的相关概念,以便于更好地理解上下文切换进程:在操作系统中的定义是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。在早期的操作系统中,确实是由进程直接执行程序的,所谓程序就是数据、指令及其组织形式的描述。进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度线程:早期的操作系统程序是由进程执行,现在的操作系统就是由线程执行的,进程是线程的容器,每一个进程都有它自己的地址空间,一般情况下,包括文本区域(textregion)、数据区域(dataregion)和堆栈(stackregion)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。线程拥有自己独立的栈和共享的堆,线程是共享堆,不共享栈的,线程同样由操作系

  • 怎样从公网访问内网Oracle数据库

    公网访问内网Oracle数据库本地安装了Oracle数据库,只能在局域网内访问,怎样从公网也能访问本地Oracle数据库?本文将介绍具体的实现步骤。1.准备工作1.1安装Java1.7及以上版本执行命令java-version检查Java安装和配置是否正确。1.2安装并启动Oracle数据库默认安装的Oracle数据库端口是1521。2.实现步骤2.1下载并解压holer软件包Holer软件包:holer-client.zip2.2修改holer配置文件在holer官网上申请专属的holeraccesskey或者使用开源社区上公开的accesskey信息。例如申请得到的holer信息如下,这里以此holer信息为例:--------------------------------------------- HolerClient:holerdemo@gmail.com AccessKey:8866daebe02846t88s166733595fff5d --------------------------------------------- InternetAddress:holer

  • 【干货】通过OpenFace来理解人脸识别

    【导读】本文是StephanieKim的一篇博文你,作者探讨的是一个老生常谈的话题“人脸识别”,介绍针对人脸识别任务的一个特定的开源库——OpenFace。作者之所以专门介绍该开源库,说明该库必然是有其独特的优势。与GoogleFaceNet和FacebookDeepFace不同,它主要聚焦在移动设备上的实时人脸识别,旨在用少量数据实现高准确率。本文还介绍了OpenFace原理、训练过程、及相关案例,刚兴趣的读者不妨读一读,相信不会令你失望。专知内容组编辑整理。UnderstandingFacialRecognitionThroughOpenFace人脸识别已经成为我们生活中越来越普遍的一部分。如今,智能手机使用人脸识别来进行访问控制,动画电影如(“阿凡达”)则使用它来为带来逼真的运动和表情。警方的监控摄像机使用脸部识别软件来识别被逮捕的罪犯,这些模型也被用于零售店进行有针对性的营销活动。当然,我们都会使用celebritylook-a-like和Facebook’sautotagger等应用来对我们自己,我们的朋友以及我们的家人进行分类。人脸识别可用于许多不同的应用,但并不是所有的人

  • ModuleNotFoundError: No module named &#39;_ctypes&#39;的解决方案

    1前言 在腾讯云上pipinstallsklearn时报这个错误,如下: File"/usr/local/python3/lib/python3.7/ctypes/__init__.py",line7,in<module> from_ctypesimportUnion,Structure,Array ModuleNotFoundError:Nomodulenamed'_ctypes' 复制 原因:Python3中有个内置模块叫ctypes,它是Python3的外部函数库模块,它提供兼容C语言的数据类型,并通过它调用Linux系统下的共享库(Sharedlibrary),此模块需要使用CentOS7系统中外部函数库(Foreignfunctionlibrary)的开发链接库(头文件和链接库)。 由于在CentOS7系统中没有安装外部函数库(libffi)的开发链接库软件包,所以在安装pip的时候就报了"ModuleNotFoundError:Nomodulenamed'_ctypes'"的错误。 2步骤 安装外部函数库(libffi) yuminstalllibffi-dev

  • 「开盘价」与「收盘价」各指什么,它们是如何确定的?

    在A股市场中,开盘价是由交易日早上9:15分至9:25分的集合竞价确定的。 收盘价则是由交易日下午14:57分至15:00分的集合竞价确定的。 而集合竞价是指对一段时间内接收的买卖申报一次性集中撮合的竞价方式。 以我国竞价交易制度为例,集合竞价时成交价格的确定原则是: 1、在有效价格范围内选取成交量最大的价位; 2、高于成交价格的买进申报与低于成交价格的卖出申报全部成交; 3、与成交价格相同的买方或卖方至少一方全部成交。两个以上价位符合上述条件的,上海证券交易所规定使未成交量最小的申报价格为成交价格。若仍有两个以上申报价格符合条件,取其中间价为成交价格。深圳证券交易所取距前收盘价最近的价位为成交价。集合竞价的所有交易以同一价格成交。集合竞价未成交的部分,自动进入连续竞价。 链接:https://www.zhihu.com/question/384284873/answer/1122663490

  • 剑指offer面试题3-数组中重复的数字

    题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 解法一:时间复杂度O(n),空间复杂度O(n) classSolution{ public: //Parameters: //numbers:anarrayofintegers //length:thelengthofarraynumbers //duplication:(Output)theduplicatednumberinthearraynumber //Returnvalue:trueiftheinputisvalid,andtherearesomeduplicationsinthearraynumber //otherwisefalse boolduplicate(intnumbers[],intlength,int*duplication){ /*思路:遍历数组创建map,再遍历map得到第一个重复的数

  • 剑指offer JZ-16

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 示例1 输入 复制 {1,3,5},{2,4,6}复制 返回值 复制 {1,2,3,4,5,6}复制 思路 1.非递归:   申请新的空间用于存放合并后的链表;   若当前pHead1的val值不大于pHead2的val值,则将pHead1放入新链表中,并将pHead1后移一位;   若当前pHead2的val值不大于pHead1的val值,则将pHead2放入新链表中,并将pHead2后移一位;   若某一指针为空,且另一指针非空,则将非空指针加入新链表   这样的时间复杂度为O(n+m),空间复杂度为O(1) /* structListNode{ intval; structListNode*next; ListNode(intx): val(x),next(NULL){ } };*/ classSolution{ public: ListNode*Merge(ListNode*pHead1,ListNode*pHead2) { if(pHead1==nul

  • HashTable和HashMap有什么区别已经你自己的理解(面试题)

    两者简介: HashMap简介:  HashMap是基于哈希表实现的,每一个元素是一个key(数据类型必须一致)-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。     HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。     HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。     HashMap存数据的过程是:     HashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一个单向链表。当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,计算方法

  • [转]jQuery.Autocomplete实现自动完成功能(详解)

    本篇文章除了介绍jquery.autocomplete基本参数外,主要说明jquery.autocomplete的数据源的格式问题。     1、jquery.autocomplete参考地址 http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/ http://docs.jquery.com/Plugins/Autocomplete 2、jquery.autocomplete详解 语法: autocomplete(urlordata,[options]) 参数: urlordata:数组或者url [options]:可选项,选项解释如下: 1)minChars(Number) 在触发autoComplete前用户至少需要输入的字符数,Default:1,如果设为0,在输入框内双击或者删除输入框内内容时显示列表。 2)width(Number) 指定下拉框的宽度,Defau

  • CORS、XSS 概念

    CORS介绍 跨域资源共享Cross-OriginResourceSharing,CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。CORS是对同源策略的破坏。 因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。 CORS分类 请求分成两类:简单请求(simplerequest)和非简单请求(not-so-simplerequest)。 XSS介绍 XSS(CrossSiteScripting)攻击全称跨站脚本攻击,是为不和层叠样式表(CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!

  • react之redux简化版

    需求:用redux来实现获取数字加减后的值。 效果如下: 需要Header和Content组件。Header组件如下 importReact,{Component}from'react' exportdefaultclassHeaderextendsComponent{ render(){ return( <div> 值:0 </div> ) } } 复制 Conttent组件代码如下 importReact,{Component}from'react' exportdefaultclassContentextendsComponent{ addNum=()=>{ letnum=this.selectDom.value; } cutNum=()=>{ letnum=this.selectDom.value; } render(){ return( <div> <selectref={c=>this.selectDom=c}> <optionvalue="1">1</option> <o

  • redis cpu占用过高100%,清理病毒事件

    日常查看服务器状态,发现cpu占用过高100%。 使用top命令发现redis竟然占用了700%之多,但是启用的命令是个随机串,显示中招了。 于是通过systemctlstatus[进程id]查看所在目录,及父进程,找出了  /tmp/kdevtmpfsi 和 /tmp/kinsing还有redis目录下的一些./kinsing*****的文件, 最终解决办法是,先把这些文件都删除,然后把进程杀掉。最后新建一个用户,将redis的整个目录权限给这个新用户。 #创建新用户 useraddi_redis #新用户创建密码 passwdi_redis #将redis目录权限转至该用户 chown-Ri_redis:i_redis[redis目录]复制   解决问题的思路,参考 https://www.cnblogs.com/wlphp/p/12115050.html   ===================== update ============================== 今天发现这个挖矿病毒

  • Android中不能在子线程中更新View视图的原因

    这是一条规律,很多coder知道,但原因是什么呢? 如下: Whenaprocessiscreatedforyourapplication,itsmainthreadisdedicatedtorunningamessagequeuethattakescareofmanagingthetop-levelapplicationobjects(activities,broadcastreceivers,etc)andanywindowstheycreate.Youcancreateyourownthreads,andcommunicatebackwiththemainapplicationthreadthroughaHandler.Thisisdonebycallingthesame post or sendMessage methodsasbefore,butfromyournewthread.ThegivenRunnableorMessagewillthenbescheduledintheHandler'smessagequeueandproces

  • PCB板的故障排查和维修1——电容损坏

    电容损坏引发的故障在电子设备中是最高的,其中尤其以电解电容的损坏最为常见。电容损坏表现为:(1)、容量变小(2)、完全失去容量(3)、漏电(4)、短路电容在电路中所起的作用不同,引起的故障也各有特点。在工控电路板中,数字电路占绝大多数,电容多用做电源滤波,用做信号耦合和振荡电路的电容较少。用在开关电源中的电解电容如果损坏,则开关电源可能不起振,没有电压输出;或者输出电压滤波不好,电路因电压不稳而发生逻辑混乱,表现为机器工作时好时坏或开不了机,如果电容并在数字电路的电源正负极之间,故障表现同上。这在电脑主板上表现尤其明显,很多电脑用了几年就出现有时开不了机,有时又可以开机的现象,打开机箱,往往可以看见有电解电容鼓包的现象,如果将电容拆下来量一下容量,发现比实际值要低很多。 电容的寿命与环境温度直接有关,环境温度越高,电容寿命越短。这个规律不但适用电解电容,也适用其它电容。所以在寻找故障电容时应重点检查和热源靠得比较近的电容,如散热片旁及大功率元器件旁的电容,离其越近,损坏的可能性就越大。 有些电容漏电比较严重,用手指触摸时甚至会烫手,这种电容必须更换。在检修时好时坏的故障时,排除了接触不

  • Spring------mysql读写分离

    1.为什么要进行读写分离 大量的JavaWeb应用做的是IO密集型任务,数据库的压力较大,需要分流 大量的应用场景,是读多写少,数据库读取的压力更大 一个很自然的思路是使用一主多从的数据库集群:一个是主库,负责写入数据;其它都是从库,负责读取数据.主从库数据同步.   mysql原生支持主从复制 mysql主(称master)从(称slave)复制的原理:1、master将数据改变记录到二进制日志(binlog)中, 这些记录叫binarylogevents2、slave将master的binarylogevents拷贝到它的中继日志(relaylog)3、slave重做中继日志中的事件,将改变反映它自己的数据(数据重演)   解决读写分离的方案大致有两种: 1)在应用层给读/写分别指定数据库 好处是数据源切换方便,不用引入其他组件.但是不能动态添加数据源. 2)使用中间件解决 好处是源程序不需要做任何改动,还可以动态添加数据源.但中间件会带来一定的性能损失. 目前有mysql-proxy,mycat,altas等   2.MySQL主从配置

相关推荐

推荐阅读