算法之动态规划
一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。 由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。 与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。
三、适用的情况能采用动态规划求解的问题的一般要具有3个性质: (1) 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。 (2 ...
设计思维
一、设计思维的概念定义设计思维 Design ThinkingDesign is not just whtat it looks like and feels likeDesign is a mindest that are used to focus on any kind of problemsDesing Thinking = Innovative Problem Solving Process
设计面临3个问题
你知道的 Known knowns
你不知道的 known unknowns
未知的 big unknowns
对应英文
Known knowns you know how to solve them
known unknowns You know ways to find out how to solve them
big unknowns You don’t konw how to solve them because you don’t konw the root cause.
怎样定义一个问题是未知的 how to identify bi ...
算法之分支限界法
分支限界法
一、基本描述类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
(1)分支搜索算法所谓“分支”就是采用广度优先的策略,依次搜索E-结点的所有分支,也就是所有相邻结点,抛弃不满足约束条件的结点,其余结点加入活结点表。然后从表中选择一个结点作为下一个E-结点,继续搜索。
选择下一个E-结点的方式不同,则会有几种不同的分支搜索方式。
1)FIFO搜索
2)LIFO搜索
3)优先队列式搜索
二、分支限界法的一般过程由于求解目标不同,导致分支限界法与回溯法在解空间树T上的搜索方式也不相同。回溯法以深度优先的方式搜索解空间树T,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。
分支限界法的搜索策略是:在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展对点。为了有效地选择下一扩展结点,以加速搜索的 ...
算法之分治算法
一、基本概念
在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……
任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素的排序问题,当n=1时,不需任何计算。n=2时,只要作一次比较即可排好序。n=3时只要作3次比较即可, …。而当n较大时,问题就不那么容易处理了。要想直接解决一个规模较大的问题,有时是相当困难的。
二、基本思想及策略
分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问 ...
Github使用Issue管理软件项目
原文http://www.ruanyifeng.com/blog/2017/08/issue.html
一、Issue是什么?Issue是指一项待完成的工作。通常可以访问为“问题”、“事物”例如
软件的bug
一项功能建议
待完成的任务
每个Issue应该包含所有历史信息,方便后来人查看,了解整个历史过程。
Issue起源于客户部门。用户反馈问题后,客服部门创建一个工单。以后每次与该用户的交流,都需要更新工单,记录全部信息。这样其他的客户人员接待此客户时,知道以前给该客户做过什么,该继续做什么。
二、Issue管理系统Issue管理系统,需要具有这些功能
项目管理
Issue优先级
Issue阶段
Issue处理人员
日程安排
统计、监控
团队合作
讨论
通知
三、Github Issues3.1 基本用法每个Github仓库,都有一个Issues面板
进入面板后,可以创建新Issue
创建Issue时,左侧填入 Issue 的标题和内容,右侧是四个配置项
Assignees:人员
Labels:标签
Projects:项目
Milestone:里程碑
3.2 Assig ...
算法之贪心算法
贪心算法一、基本概念:
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。
二、贪心算法的基本思路: 1.建立数学模型来描述问题。 2.把求解的问题分成若干个子问题。 3.对每一子问题求解,得到子问题的局部最优解。 4.把子问题的解局部最优解合成原来解问题的一个解。
三、贪心算法适用的问题 贪心策略适用的前提是:局部最优策略能导致产生全局最优解。 实际上,贪心算法适用的情况很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。
四、贪心算法的实现框架 从问题的某一初始解出发; while (能朝给定总目标前进一步) { ...
使用Vue构建项目
一、简介Vue 是一个前端框架,特点是方便数据绑定和组件化
官网 https://cn.vuejs.org/
数据绑定比如你改变一个输入框 Input 标签的值,会自动同步更新到页面上其他绑定该输入框的组件的值
组件化页面上小到一个按钮都可以是一个单独的文件.vue,这些小组件直接可以像乐高积木一样通过互相引用而组装起来
二、简单Demo12345678910111213141516171819202122<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>Vue 测试实例-螃蟹壳</title> <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script></head><body> <div id="app"> <p>{ ...
IP地址库
项目中,经常会用到判断用户来源,所使用语言。使用IP判断是常用的方法。那就需要一个准确的IP地址库。这里有2种方法
一、ip2regionip2region是准确率99.9%的ip地址定位库,0.0x毫秒级查询,数据库文件大小只有1.6M。
定时更新99.9%准确率,定时更新:数据聚合了一些知名ip到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比纯真啥的准确多了。每次聚合一下数据需要1-2天,会不定时更新。
标准化的数据格式每条ip数据段都固定了格式:城市Id|国家|区域|省份|城市|ISP。其中,只有中国的数据精确到了城市,其他国家只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家。(请忽略前面的城市Id,个人项目需求)
客户端已经集成的客户端有:java, php, c,python,php扩展,nodejs,golang。
算法提供了两种查询算法,响应时间如下:客户端/binary算法/b-tree算法/Memory算法:java/0.x毫秒/0.x毫秒/0.1x毫秒 (使用Rand ...
使用composer发布自己的PHP依赖包
目标一直使用composer包管理器,直接使用别人的代码十分方便。但想把自己的一些代码也共享出来。所以想提交自己的包给别人使用。
流程1. 安装composer
2. 项目发布到github
3. 包发布到packagist
4. 设置packagist包自动同步
1. 安装composer参考http://www.phpcomposer.com/
2. 项目发布github参考相关文章
3. 包发布到packagist1. 访问https://packagist.org,注册登录,可以使用github账号登录
2. submit ,此时如果有相同名字的包,会提示,确认
4. packagist包自动同步假如你每次更新了项目,还需要到packagist点击update,十分麻烦。所以这里最好设置一个自动同步,当然packagist提供了api的方式来操作,这个也是挺麻烦。packagist和github已经打通了,可以直接在github上设置就行了。ok
在github上打开你的项目,点击setting 》 Installed integrations 》Add Service 选 ...
Go 实现冒泡排序
通过Go语言实现冒泡排序
代码12345678910111213141516171819202122232425262728293031323334353637package main import ( "fmt")func main() { fmt.Println("hello") s := []int{6, 3, 1, 7, 5, 8, 9} fmt.Println(s) bubble(s) fmt.Println(s)}/** * 排序算法 */func bubble(slice [] int){ leng := len(slice) for i:=0; i < leng - 1; i++{ for j:=i+1; j < leng; j++ { if slice[j] > slice[i] { swop(slice, j, i) } } }}/** * 左右值交换 */func swo ...