算法之贪心算法
贪心算法一、基本概念:
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。
二、贪心算法的基本思路: 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 ...
Go实现GET接收数据
目的go语言实现处理表单输入, 接受Get参数, 打印获取到数据
实现主要使用net/http包实现,使用net/http包中ListenAndServe
1func ListenAndServe(addr string, handler Handler) error
监听TCP网络地址addr然后调用具有handler的Serve去处理连接请求.通常情况下Handler是nil,使用默认的DefaultServeMux
Code1234567891011121314151617181920212223242526272829303132333435363738394041package mainimport( "fmt" "net/http" "log" "strings")func main() { fmt.Println("hello, world") http.HandleFunc("/", sayHelloName) e ...
Go实现青蛙跳台算法
问题一只青蛙一次可以跳 上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共需要多少种跳法。
思路首先考虑n等于0、1、2时的特殊情况,f(0) = 0 f(1) = 1 f(2) = 2其次,当n=3时,青蛙的第一跳有两种情况:跳1级台阶或者跳两级台阶假如跳一级,那么 剩下的两级台阶就是f(2);假如跳两级,那么剩下的一级台阶就是f(1),因此f(3)=f(2)+f(1)当n = 4时,f(4) = f(3) +f(2)以此类推………..可以联想到斐波拉契数列(Fibonacci数列)
方法一,递归123456789101112131415161718192021222324252627282930313233343536package mainimport ( "fmt" "time")func main() { t1 := time.Now() a := jump(42); elapsed := time.Since(t1)//运行时间 t2 ...
PHP实现青蛙跳台阶算法
问题一只青蛙一次可以跳 上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共需要多少种跳法。
思路首先考虑n等于0、1、2时的特殊情况,f(0) = 0 f(1) = 1 f(2) = 2其次,当n=3时,青蛙的第一跳有两种情况:跳1级台阶或者跳两级台阶假如跳一级,那么 剩下的两级台阶就是f(2);假如跳两级,那么剩下的一级台阶就是f(1),因此f(3)=f(2)+f(1)当n = 4时,f(4) = f(3) +f(2)以此类推………..可以联想到斐波拉契数列(Fibonacci数列)
方法一,递归1234567891011121314function jump($n){ if($n == 1){ return 1; }elseif($n == 2){ return 2; }else{ return jump($n - 1) + jump($n-2); }}$time1 = time();echo jump(42);$tim ...
API接口通过设置Access-Control-Allow-Origin实现跨域访问
例如:客户端的域名是www.client.com,而请求的域名是www.server.com如果直接使用ajax或者Api访问,会有以下错误
123XMLHttpRequest cannot load http://www.server.com/server.PHP.No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://www.client.com' is therefore not allowed access.
解决方法在被请求的Response header中加入
123456// 指定允许其他域名访问 header('Access-Control-Allow-Origin:*'); // 响应类型 header('Access-Control-Allow-Methods:POST'); // 响应头设置 header('Access-Control- ...
form-data与x-www-form-urlencoded的区别
在postman中 有form-data、x-www-form-urlencoded、raw、binary这几种不同的传值方式
form-data是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;
由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件
x-www-form-urlencoded是application/x-www-from-urlencoded,会将表单内的数据转换为键值对,比如,name=Java&age = 23
raw可以上传任意格式的文本,可以上传text、json、xml、html等
binary相当于Content-Type:application/octet-strea ...