算法题 leecode 851. 喧闹和富有

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc leecode 上第851题 1. 题目如下 在一组 N 个人(编号为 0, 1, 2, …, N-1)中,每个人都有不同数目的钱,以及不同程度的安静(quietness)。 为了方便起见,我们将编号为 x 的人简称为 “person x “。 如果能够肯定 person x 比 person y 更有钱的话,我们会说 richer[i] = [x, y] 。注意 richer 可能只是有效观察的一个子集。 另外,如果 person x 的安静程度为 q ,我们会说 quiet[x] = q 。 现在,返回答案 answer ,其中 answer[x] = y 的前提是,在所有拥有的钱不少于 person x 的人中,person y 是最安静的人(也就是安静值 quiet[y] 最小的人)。 示例: 输入:richer = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], quiet = [3,2,5,4,6,1,7,0] 输出:[5,5,2,5,4,5,6,7] 解释: answer[0] = 5, person 5 比 person 3 有更多的钱,person 3 比 person 1 有更多的钱,person 1 比 person 0 有更多的钱。 唯一较为安静(有较低的安静值 quiet[x])的人是 person 7, 但是目前还不清楚他是否比 person 0 更有钱。 answer[7] = 7, 在所有拥有的钱肯定不少于 person 7 的人中(这可能包括 person 3,4,5,6 以及 7), 最安静(有较低安静值 quiet[x])的人是 person 7。 其他的答案也可以用类似的推理来解释。 2. 提示 2.1 思考 对于示例,我们能够根据richer信息得出如下关系 我们能够得到富有程度的关系如上图 ...

June 12, 2018 · 2 min

elasticsearch 中暂时移除一个节点

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 前言 在维护ES集群的过程中,我们会经常遇到将某个ES实例临时下线,比如机器换硬盘,系统参数调整,调整完毕后,再将ES实例重新上线。ES提供了非常便利的API来支持这一点。 操作过程 比如我们有这样一个ES集群,node-2需要临时下线 step 1 PUT _cluster/settings { "transient" : { "cluster.routing.allocation.exclude._name" : "node-2" } } 注意 这个操作是transient集群重启后,这个设置会失效 step 2 step1 配置完成以后,我们就会看到shard在集群中开始迁移,待迁移完成以后,对node-2进行处理 step 3 PUT _cluster/settings { "transient" : { "cluster.routing.allocation.exclude._name" : "" } } 只要让_name匹配不到对用的node即可 总结 除了_name 之外, 还可以用_ip、_host进行匹配 参考资料 Shard Allocation Filtering 请我喝瓶饮料

June 11, 2018 · 1 min

lucene中的 *.del文件

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 注意:本文基于lucene 3.1 引言 最近一直在看lucene相关的资料,今天介绍一下lucene中的索引文件的一部分 *.del文件 概述 如果索引文件中,有被删除的doc,则lucene会创建*.del文件 *.del 记录了被删除doc的ID 采用2中方法 1)BitVector BitVector等同于C++中的bitset,每个bit对应一个doc 如下图,假定共有24个doc,其中10、12被删除 注意 在一个segment中,doc ID从0开始 2) DGaps 如果segment中的文档数量较多,而被删除的文档很少,那么将有大量的bit为0,少量为1。这种稀疏的BitVector,非常浪费存储空间。因此lucene提供了 DGaps这种存储格式,我们可以把它看做是BitVector的一种压缩格式。 它的思想是这样的,只有少量的bit被置为1,那么就只记录非0的字节, 所以对于每个非0的字节,需要一个二元组去记录 (Dgap, NonzeroByte) Dgap 表示该字节是第几个字节(从0开始,用vint表示, 关于vint可参考我的另一篇文章VINT–针对INT型的压缩格式) NonzeroByte 表示这个字节的值 对于上面的例子,只有byte1 是非0字节,所以最终结果如下 00000001 00010100 参考资料 1.Apache Lucene - Index File Formats 请我喝瓶饮料

June 5, 2018 · 1 min

redigo提示connection pool exhausted

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1. 引言 线上的某个服务(Golang开发)使用Redis作为消息队列,使用的redis库是garyburd/redigo, 这两天出现如下错误 connection pool exhausted 2. 产生原因 阅读源码pool.go 阅读get()即可 type Pool struct { // Dial()方法返回一个连接,从在需要创建连接到的时候调用 Dial func() (Conn, error) // TestOnBorrow()方法是一个可选项,该方法用来诊断一个连接的健康状态 TestOnBorrow func(c Conn, t time.Time) error // 最大空闲连接数 MaxIdle int // 一个pool所能分配的最大的连接数目 // 当设置成0的时候,该pool连接数没有限制 MaxActive int // 空闲连接超时时间,超过超时时间的空闲连接会被关闭。 // 如果设置成0,空闲连接将不会被关闭 // 应该设置一个比redis服务端超时时间更短的时间 IdleTimeout time.Duration // 如果Wait被设置成true,则Get()方法将会阻塞 Wait bool ... ... } 以上异常的原因是这样的,在garyburd/redigo中,得到连接的步骤如下 尝试从空闲列表中,获得一个可用连接;如果成功直接返回,失败则尝试步骤2 如果当前的Active 连接数 < MaxActive,则尝试创建一个新连接;如果成功直接返回,失败则尝试步骤3 判断Wait为true则等待,否则报出异常 // ErrPoolExhausted is returned from a pool connection method (Do, Send, // Receive, Flush, Err) when the maximum number of database connections in the // pool has been reached. var ErrPoolExhausted = errors.New(&quot;redigo: connection pool exhausted&quot;) 3. 解决方法 设置MaxActive,设MaxActive=0(表示无限大)或者足够大。 设置Wait=true,当程序执行get(),无法获得可用连接时,将会暂时阻塞。 4. 完整的初始化连接池的代码 func NewRedisPool(redisConf context.RedisConf) *redis.Pool { address := fmt.Sprintf(&quot;%v:%v&quot;, redisConf.Host, redisConf.Port) dbOption := redis.DialDatabase(redisConf.Db) pwOption := redis.DialPassword(redisConf.Password) // **重要** 设置读写超时 readTimeout := redis.DialReadTimeout(time.Second * time.Duration(redisConf.ConTimeout)) writeTimeout := redis.DialWriteTimeout(time.Second * time.Duration(redisConf.ConTimeout)) conTimeout := redis.DialConnectTimeout(time.Second * time.Duration(redisConf.ConTimeout)) redisPool := &amp;redis.Pool{ // 从配置文件获取maxidle以及maxactive,取不到则用后面的默认值 MaxIdle: redisConf.MaxIdleConn, MaxActive: redisConf.MaxActiveConn, // **重要** 如果空闲列表中没有可用的连接 // 且当前Active连接数 &lt; MaxActive // 则等待 Wait: true, IdleTimeout: time.Duration(redisConf.IdleTimeout) * time.Second, Dial: func() (redis.Conn, error) { c, err := redis.Dial(&quot;tcp&quot;, address, dbOption, pwOption, readTimeout, writeTimeout, conTimeout) if err != nil { return nil, err } return c, nil }, } return redisPool }

June 4, 2018 · 1 min

vint--针对int型的压缩格式

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1. 引言 vint是lucene所采用的针对int型的压缩方法。 对于绝大多数语言,int型都占4个字节,不论这个数据是100、1000、还是1000,000。vint的理念是采用可变长的字节,来表示一个整数。数值较大的数,使用较多的字节来表示,数值较少的数,使用较少的字节来表示。 2. vint的格式定义 A variable-length format for positive integers is defined where the high-order bit of each byte indicates whether more bytes remain to be read. The low-order seven bits are appended as increasingly more significant bits in the resulting integer value. Thus values from zero to 127 may be stored in a single byte, values from 128 to 16,383 may be stored in two bytes, and so on. ...

June 2, 2018 · 2 min

身在互联网圈的一些感受

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 絮絮叨叨 自从把我的博客从CSDN迁出,独立成站以后,就很少在微信上发技术文章了, 主要是2个原因: 阅读微信的都是碎片时间, 而技术文章很多都需要深度的思考,不少还需要动手实际操作 在微信上粘贴代码太不放方便了 最后 欢迎访问我的个人博客 萌叔 今天来聊点最近的一些感受。 1. 中国崛起 我曾经跟我的同事们开玩笑,我说以后外国程序员,都必须要学中文,不然他们就看不到第一手的技术资料。 这几年中国程序员在世界上的影响力越来越大,这可能得益于中国有最大的互联网消费群体。 举几个例子 中国有世界上最大的redis使用平台,据新浪公布的资料,他们的redis平台有500+server,2000+的实例,不过这个应该不是单个集群的规模。 golang虽然是Google开发的语言,但是最大golang社区在中国,从几届gopher china大会的热闹程度,就可以看出golang在中国的火热程度 在前端领域巨牛的开源JavaScript项目VUE.js,为Github有史以来星标数第10多的项目,其作者是中国的尤雨溪 2. 处理能力压倒实际需求 曾经和一个美发行业的朋友聊过天,他所在的公司是一家有将近10余家分店的连锁企业,可是每天产生的订单数不超过1000单。 所以我的感觉是对绝大数领域,社区存在的解决方案的处理能力足够满足需要,数据库、或者某些框架只需要做简单的配置,就能够满足他们的日常需要了。二次开发,尤其是性能领域的二次开发的重要性变得相对较低。 3. 成熟的解决方案层出不穷 在10年前,甚至是几年前,技术资料非常难找。很多问题都没有很好解决方案,问都不知道该问谁。而现在各种社区里有各种乐于回答问题的好心人。各种开源或者收费云服务的解决方案满大街都是。 举几个例子 电商你可以用ShopsN 日志收集可以用ELK(elasticsearch + logstash + kibana) 监控你可以用zabbix或者open-falcon 这些方案很多都是开箱即用,就像使用yum或者apt-get一样简单。 而且应对绝大多数场景,已经绰绰有余。真正需要进行二次开发的只剩下扳着指头都能数出来的寥寥几家。 我不禁有些担忧,我们这些程序员的出路在哪儿。 总结 絮絮叨叨的说点心里话吧,也想听听大家的吐槽。 请我喝瓶饮料

June 1, 2018 · 1 min

float型/int型数据和底层2进制表示互转

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 引言: 因为需要打印float型/int型二进制表示 这里封装了几个函数,方便日后使用。 struct_utils.py import struct def type2bin(num, fmt): ll = [bin(ord(c)) for c in struct.pack(fmt, num)] res = [] for item in ll: res.append(item.replace(&#039;0b&#039;, &#039;&#039;).rjust(8, &#039;0&#039;)) return &#039;&#039;.join(res) def bin2type(bits, fmt): return struct.unpack(fmt, struct.pack(fmt, int(bits, 2)))[0] def float2bin(num): return type2bin(num, &#039;&gt;f&#039;) def bin2float(bits): return bin2type(bits, &#039;&gt;f&#039;) def int2bin(num): return type2bin(num, &#039;&gt;i&#039;) def bin2int(bits): return bin2type(bits, &#039;&gt;i&#039;) def long2bin(num): return type2bin(num, &#039;&gt;q&#039;) def bin2long(bits): return bin2type(bits, &#039;&gt;q&#039;) if __name__ == &#039;__main__&#039;: res = float2bin(5.5) print res res = bin2float(res) print res print &#039;-----------------&#039; res = int2bin(345) print res res = bin2int(res) print res print &#039;-----------------&#039; res = long2bin(345) print res res = bin2long(res) print res 请我喝瓶饮料

May 30, 2018 · 1 min

如何生成全局唯一ID

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 前言 在分布式环境中,生成全局唯一ID是非常需求。本文将介绍几种常见生成方法,并对它们的优缺点做出点评。 0. 8个字节 语言或数据库 内建类型 Golang uint64 Java long Python int MySQL bigint unsigned 2 ^ 32(4个字节)最多只有40多亿,对于高并发的系统,肯定不是够的。 以新浪微博为例,每天的新增的微博量都过亿,所以考虑到ID的容量,这个ID的长度至少是8个字节 1. UUID 长度: 为16 bytes, 128 bits 44e91a8a58d111e8ae84784f43a6cab8 见参考资料1: 5种版本 时间的版本 DCE Security MD5哈希 (伪)随机数 SHA-1哈希 以Version 1为例子 time_inc + clk_seq + node points time_inc时间精度为100 ns 即使在100ns以内,2次生成的time_inc也不会重复,因为会自动加1 clk_seq 为2个bytes一般是随机数(2 ^ 16 为65536) 协议文档中写明,此字段可以用来防止时钟回拨,但是在高并发情况下,也很难保证不出现冲突。 node取mac地址 下面是python的uuid库生成的一组ID a7748921-58d9-11e8-a727-784f43a6cab8 a70b016e-58d9-11e8-8a8c-784f43a6cab8 a6991957-58d9-11e8-8874-784f43a6cab8 a5b143ba-58d9-11e8-9600-784f43a6cab8 2. snowflake 长度: 8 bytes ...

May 16, 2018 · 2 min

推荐点golang入门资料

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 前言 一个大学同学在微信上发消息问我,有没有Golang入门的资料 1. 书籍 Golang入门书的话,对于有一定开发经验的我觉得 beego的作者的谢孟军 电子书地址 书名:《Go Web 编程》 推荐理由: golang入门书籍。作者是beego的作者的谢孟军,他的golang入门介绍很实用,并且谈了不少web开发中的技术要点 2. 开源项目 使用Golang很大程度就是为了高性能,所以必须要对性能这块格外关注 这里推荐几个开源项目 2.1 fasthttp valyala/fasthttp 高性能web框架,了解web框架的不二出路,号称相比官方库有10倍性能提升 关键词: 协程池 2.2 nsq nsqio/nsq 分布式的消息分发平台 多种worker内存中围绕着channel来工作 注意:这基本是大量Golang服务的常态,所以这个项目要特别关注 关键词: channel 2.3 open-falcon open-falcon 小米开源的监控系统 open-falcon里面保罗万象, 像一个小型的生态系统 open-falcon中多个系统的交互,大量使用RPC,另外open-falcon中各个组件的启停管理方式值得借鉴。 关键词: rpc heartbeat 3. 视频资源 Gopher大会视频 请我喝瓶饮料

May 4, 2018 · 1 min

算法题(9)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 问题描述 如下图所示,从矩阵(m*n)的(0, 0)出发,然后只能向下、向右,到达矩阵的对角(m-1, n-1) 求从(0,0)到(m-1, n-1) 一共有多少种走法 解题思路 解决这个问题,我们可以参考动态规划的思想 要到达(m-1, n-1), 就必须到达(m-2, n-1)或者(m-1, n-2) 从(m-2, n-1)到(m-1, n-1) 只有一种走法 从(m-1, n-2)到(m-1, n-1) 只有一种走法 那么从(0, 0)到(m-1, n-1)的走法数量 f(m-1, n-1) = f(m-2, n-1) + f(m-1, n-2) 递归算法 采用递归算法可以很容易写出代码 def try_walk(m, n): if m == 1 and n == 1: return 0 return walk(m -1, n -1) def walk(x, y): if x == 0 and y == 0: return 1 res = 0 if x - 1 &gt;= 0: res += walk(x - 1, y) if y - 1 &gt;= 0: res += walk(x, y - 1) return res if __name__ == &#039;__main__&#039;: print (1,1), try_walk(1, 1) print (1,2), try_walk(1, 2) print (2,2), try_walk(2, 2) print (2,3), try_walk(2, 3) print (3,3), try_walk(3, 3) 参考动态规划的思想,可以记录cache (x,y)到(0,0) 走法的数量,加快速度 ...

May 4, 2018 · 2 min