- 博客(307)
- 资源 (19)
- 论坛 (1)
- 收藏
- 关注
原创 Redis源码剖析之数据过期(expire)
我之前统计过我们线上某redis数据被访问的时间分布,大概90%的请求只会访问最新15分钟的数据,99%的请求访问最新1小时的数据,只有不到千分之一的请求会访问超过1天的数据。我们之前这份数据存了两天(近500g内存数据),如果算上主备的话用掉了120多个Redis实例(一个实例8g内存),光把过期时间从2天改成1天就能省下60多个redis实例,而且对原业务也没有啥太大影响。 当然Redis已经实现了数据过期的自动清理机制,我所要做的只是改下数据写入时的过期时间而已。假设Redis没有数据过期的机制,
2021-01-24 12:03:16
45
1
翻译 正则引擎的几种分类
正则表达式引擎是正则表达式匹配算法的基础。其有多种不同的实现,但大多数都是基于Henry Spencer的NFA引擎。正则引擎有两个大分类,DFA和NFA,像Perl、Java、.Net、PHP、Python、Ruby……等大多是工具都是用了NFA引擎。少数广泛被使用的工具如mawk使用了POSIX NFA引擎(NFA的一种变种)。以高效著称的工具采用了更为高效的DFA引擎。诸如GNU awk,GNU egrep和Tcl之类的一些工具结合了NFA / DFA两种引擎,将两者的优点结合在一起。基于不同类型
2021-01-17 13:40:02
40
原创 Redis源码剖析之robj(redisObject)
我们在之前的文章中已经了解过一部分Redis的数据结构了,尤其是dict 中讲到,可以把redis看做一个hashtable,存储了一堆的key-value,今天就来看下key-value中value的主要存储结构redisObject(后文统称robj)。 robj的详细代码见object.c字段详解相对与其他几个数据结构,robj相对简单,因为只包含了几个字段,含义都很明确。typedef struct redisObject { unsigned type:4; // 数据
2021-01-10 22:52:51
53
原创 我的2020年终总结
对于大多数人来说,2020年啥也没干,就光见证历史了。前一段时间华盛顿邮报向读者征集如何描述2020年,一个九岁小孩拔得头筹。 过马路前你左右都看了,结果被潜水艇给撞了。 一句简单的调侃却道出了这一年的魔幻。记得武汉封城那天晚上,我正好在回家的火车上,窗外车轮撞击铁轨声音吵得人无法入眠。当我打开微博看到武汉封城的通知,才意识到问题的严峻性,那一刻我隐约感觉到今年注定是不平凡的一年。作为一个互联网宅男,我的2020受疫情影响很小,毕竟闭门不出是肥宅的日常。但我深知2020波澜不惊的我,要感谢很多人无畏
2021-01-01 23:12:43
346
1
原创 Redis源码剖析之字典(dict)
Dict在redis中是最为核心的一个数据解构,因为它承载了redis里的所有数据,你可以简单粗暴的认为redis就是一个大的dict,里面存储的所有的key-value。redis中dict的本质其实就是一个hashtable,所以它也需要考虑所有hashtable所有的问题,如何组织K-V、如何处理hash冲突、扩容策略及扩容方式……。Redis中hashtable的实现,但Redis创新的引入了渐进式hash以减小hashtable扩容是对性能带来的影响,接下来我们就来看看redis中的dict有何
2020-12-06 16:44:49
135
原创 Redis源码剖析之跳表(skiplist)
最近要换新工作了,借着新老工作交替的这段窗口放松了下,所以专栏拖更了,不过我心里毫无愧疚,毕竟没人催更。 不过话说回来天天追剧 刷综艺的日子也很是枯燥,羡慕你们这些正常上班的人,每天都有正经工作内容,感觉你们过的很充实。[狗头]计算机领域有很多种数据结构,数据结构的存在要么是为了节省时间、要么是为了节省空间,或者二者兼具,所以就有部分数据结构有时间换空间,空间换时间之说。其实还有某些以牺牲准确性来达到节省时间空间的数据结构,像我之间讲过的bloomfilter就是其中的典型。而今天要讲的skiplis.
2020-11-22 17:18:07
169
1
原创 面试题精选:神奇的斐波那契数列
斐波那契数列,其最开始的几项是0、1、1、2、3、5、8、13、21、34…… ,后面的每一项是前两项之和,事实上,斐波那契在数学上有自己的严格递归定义。 f0 = 0f1 = 1f(n) = f(n-1) + f(n-2) 斐波那契数列其实有很多有趣的性质,比如你拿斐波那契里每项数为半径绘制1/4圆弧,你就会得到著名的黄金螺旋线。 上图只是绘制到了10多项,如果继续绘制,会变成下面这样。。另外斐波那契数还有一个神奇的性质,f(n-1)/f(n)约等于黄金分割比例,n越大,其越接近黄金
2020-11-19 11:16:17
178
翻译 CAP理论及其证明
CAP是所有分布式系统的基础理论,任何分布式系统只能满足以下三种状态中的任意两种。一致性(Consistency)可用性(Availability)分区容错性(Partition tolerance)何为CAP理论?CAP理论是指一个分布式系统不能同时满足一致性、可用性和分区容错性。听起来简单,但一致性、可用性和分区容错性分别是指啥?甚至分布式系统是啥?在这篇文章中,我们会引入一个简单的分布式系统来解释清楚何为可用性、一致性、和分区容错性。更多信息可以参考Gilbert和Lynch的论文Pe
2020-10-28 23:46:56
203
1
原创 今年是冷冬?我爬了北京10年的气温,哟 还真是!
WARNING: 非严谨气相数据分析,旨在表达数据分析过程,结论还是看看就好,更严谨的信息请查阅专业的气相资料。10月份的北京,仿佛酷热的夏季戛然而止,然后变成了春夏秋冬随机播放的模式,与往年不同的是今年很多人都在说“今年比去年冷多了”。 之前网络上就在传受拉尼娜现象的影响,今年会是个冷冬,似乎大家早已将今年的冬天和冷关联在了一起。 那问题就来了,今年的冷是真冷还是“冷冬”给大家的心理暗示?为了搞清楚这个问题,我想到了我之前写的天气数据爬虫,当时我是为了学习fbprophet,然后就写了用fbpr.
2020-10-24 09:04:58
211
原创 Redis源码剖析之快速列表(quicklist)
@TOC何为quicklist,上次说到ziplist每次变更的时间复杂度都非常高,因为必须要重新生成一个新的ziplist来作为更新后的list,如果一个list非常大且更新频繁,那就会给redis带来非常大的负担。如何既保留ziplist的空间高效性,又能不让其更新复杂度过高? redis的作者给出的答案就是quicklist。 其实说白了就是把ziplist和普通的双向链表结合起来。每个双链表节点中保存一个ziplist,然后每个ziplist中存一批list中的数据(具体ziplist大小可配置
2020-10-18 21:49:15
596
1
原创 Redis源码剖析之压缩列表(ziplist)
本来打算只用一篇文章来讲解Redis中的list,在实际写作过程中发现Redis中有多种list的实现,所以准备拆成多篇文章,本文主要讲ziplist,ziplist也是quicklist的基础。另外还有skiplist,skiplist虽然是list,当主要和set命令相关,所以会放到后面。本文主要涉及到的源码在ziplist.c何为ziplist?我们可以在ziplist.c源码头部找到一段Redis作者的一段介绍。The ziplist is a specially encoded duall
2020-10-04 23:00:56
1727
2
原创 面试题精选:单链表排序也能玩出花来
今天国庆节,祝大家中秋节快乐,顺便给大家拜个早年[狗头]。不过最近还在准备面试的同学们不要浪太狠,还是要好好学习的鸭。单链表的排序在数据结构类的面试题中简直是集大成者,什么排序、链表、链表删除、添加…… 都能体现在单链表排序上,也非常考验候选者的编程基本功,思路说起来很简单,但能不能写出来又是另外一回事了。有些人觉得面试面这种题意义不大,谁实际工作中会写过单链表的排序,不都是直接调Collections.sort()吗? 是,没错 是这样,也许对某些人而言,他会这道题和不会这道题对将来的工作产生不了任何
2020-10-01 11:16:54
2532
1
原创 Redis源码剖析之SDS(Simple Dynamic String)
SDS(simple dynamic string)是Redis提供的字符串的封装,在redis中也是存在最广泛的数据结构,它也是很多其他数据结构的基础,所以才选择先介绍SDS。 SDS也兼容部分C字符串API(strcmp,strlen),它如何兼容C字符串我觉得也是有个很sao的操作,等看完我这篇博客你就明白了。在开始正式内容前,我先抛几个问题(有些也是面试高频题),带着问题去学习也是一种非常好的学习方法。C语言中也算是支持String了,为什么Redis还要自己封装一个?SDS中的D(dynam
2020-09-26 12:47:36
2620
2
原创 面试题精选:字符串替换
字符串处理在程序猿日常工作工作中非常常见,常见到几乎各种语言中都已经封装好了字符串相关的API,我们只需要直接拿过来用就好。就拿Java为例,jdk中的String()类几乎封装了所有字符串相关的操作,其方法数量有近百个,几乎满足了程序猿所有字符串相关的操作。正是因为这么方便,估计大多数Java程序猿都没自己实现过字符串的replace。这里正式引入一下今天的精选面试题:不依赖第三方库 实现一个字符串替换replace(String str, String target, String replacem
2020-09-20 21:25:12
1834
2
原创 Redis源码剖析系列博文开篇&大纲
今年我启动了好几个比较有挑战的个人项目,比如写一门编程语言、成为一名视频UP主、写科幻小说…… 这些项目目前进度都很堪忧,一方面这些项目挑战都比较大,另一方面业余时间还要忙着吃吃喝喝、追剧、刷综艺、睡懒觉…… 不过有个项目进度不至于那么不堪,那就是今天的猪脚——《Redis源码剖析》系列博文,今天也是这个系列博文的开篇。为此,我也在github上建立了中文注解版的Redis源码库,详见https://github.com/xindoo/redis,目前已经添加近700行的中文注释,欢迎Star和关注。
2020-09-20 21:19:50
1404
1
原创 面试题精选:数据伪造
这道题应该算是我原创的的一道题,来源于我遇到的一个具体需求。大致需求是已知一批数和每个数出现的次数,然后写个接口,每次调用都能返回已知数据中的某个数,且返回的概率和原始数据中每个数出现的概率一致,题目描述起来有些绕口,我们来举个实际的例子。以上面的输入为例,要求实现的接口必须以11.96%的概率返回5、18.10%的概率返回91……16.55%的概率返回98,当然我的要求不仅仅是这几个数,而是可能有10^5个数。 先别急着往下看,给你几分钟先思考下。各种语言其实都内置了random函数,可以随机返回i
2020-09-13 19:46:33
2813
2
原创 程序猿职场求生指南[手动狗头]
职场法则: 只要你努力工作,办事靠谱,思虑周全,从不给领导添麻烦,从不向领导提要求。勤勤恳恳,兢兢业业…… 坚持下去,公司里的杂活,破事儿,棘手的事就都成了你的,而且你的老板会更有钱。如何在职场中干最少的活拿最多的钱,一定是困扰大部分社畜的终极难题,今天我将尝试从 工作、社交、生活、团队管理 四个维度来解答这个问题,相信大家看完之后在职场中肯定会如鱼得水。工作篇时间规划作为久经沙场的社畜,深知时间规划的重要性,毕竟这是其他人(尤其是主管)感知你工作态度、工作效率、沟通能力、时间安排……等很多能力.
2020-09-13 12:37:35
11392
10
原创 我背着CSDN偷偷记录了大半年我博客数据[手动狗头]
作为一个数据控+一个有追求的技术博主,总是希望自己能知道自己博客历史每日粉丝数量、阅读量、积分、评论……的数据,然而官方博客管理后台给展示的数据太少了,只有每日访问量、评论数、粉丝数、收藏数这几个数据,而且目前最多只能看最近一个月的数据。如果想看更久的数据、想看自己积分的变化、想看总排名 周排名的变化……没有这些数据,我作为技术博主年底的年终总结怎么办?没有这些数据,我怎么知道自己长期是否进步了,进步速度又是什么样的? 这当然难不住一个优秀的程序猿,本着没有困难创造困难也要上的态度,我用Jsoup写
2020-09-06 16:23:04
3180
5
原创 面试题精选:两个线程按顺序交替输出1-100
陆陆续续,各个公司的校招季都开始了,我也成为了我司的校招面试官,最近也面了不少同学了,面试过程中也发现了很多问题,即有面试者的、也有面试官的、更有自己的问题,这里先挖个坑,后续写个博客详细聊聊,感兴趣的同学可以关注下。另外,我也有个专栏《面试题精选》,里面收录我之前写的一些面试题博客,长期更新、永久免费,近期我会多写一些面试题相关的博客,希望能帮助到在找工作的各位。今天分享一道Java多线程的面试题,更多面试,我在几年前面试的时候被问到过,当时我完全不知道怎么写,毕竟那个时候我还是运维。现在我面试别人的时
2020-09-06 13:56:55
5049
13
原创 Java中synchronized与ReentrantLock性能对比
前两天逛博客的时候看到有个人写了一篇博客说ReentrantLock比synchronized慢,这就很违反我的认知了,详细看了他的博客和测试代码,发现了他测试的不严谨,并在评论中友好地指出了他的问题,结果他直接把博客给删了 删了 了……很多老一辈的程序猿对有synchronized有个 性能差 的刻板印象,然后极力推崇使用java.util.concurrent包中的lock类,如果你追问他们synchronized和lock实现性能差多少,估计没几个人能答出来。 说到这你是不是也很想知道我的测试结果?
2020-08-23 19:10:15
3164
6
原创 如何把百度伪装成Google
作为技术人使用百度被鄙视?但因为种种原因无法使用Google,为了解决这个尴尬的问题,我特意研发了一款chrome插件,可以将百度的logo换成google的logo,完美的解决这个尴尬的问题。 妈妈再也不用担心我因为用百度搜索技术问题而被同事嘲笑了。使用效果如下:看到这也许你有很多的问题,但是 不要问,问就是插件我已上架到chrome网上商店了,大家可以直接在网上商店搜索 goodu 即可找到,安装后即可以最方(zi)便(qi)快(qi)捷(ren)的的方式使用google。备注:大家可以
2020-08-09 19:55:13
10135
31
原创 如何制作一个可以自动更新的Github个人主页
Github近期上线一个新的功能,就是你在自己账号下创建一个和自己用户名同名的仓库,并在仓库下创建一个README.md文件,这个文件就会被展示在你的Github个人主页。源于markdown的强大描述能力,你可以在你的Github首页展示各种各样的信息,甚至有人直接将自己个人简历挂上面,极大丰富了Github的可玩性。比如我的Github账号是xindoo ,我直接建个xindoo代码库,然后写个README.md文件介绍自己,最终展示效果如上图,大家也可以直接到我Github主页查看。不过我个人设计的
2020-08-09 18:14:58
5024
11
原创 JDK11现存性能bug(JDK-8221393)深度解析
这是一篇鸽了很久的博客,因为博客内容和素材早就准备差不多了,但就是一直懒得整理,今天终于下定决心终于整理出来了。先大致介绍下这个bug,准确说这个应该是jdk11新引入的zgc的一个bug,该bug在被触发的情况下会导致进程CPU使用率会逐渐升高,如果不管的话最终CPU会到100% 影响服务可用性,而且这个性能bug在jdk11最新的代码中仍未修复。不过不用担心,这个bug触发的要求比较苛刻,估计这也是jdk开发者不修复该bug的原因之一。另外,我在翻看jdk12源码时发现该bug已被修复,并且有些相关设
2020-07-12 13:07:16
6970
6
原创 生日悖论是啥?我用它省了上百G的内存
生日悖论: 是指在不少于 23 个人中至少有两人生日相同的概率大于 50%。例如在一个 30 人的小学班级中,存在两人生日相同的概率为 70%。对于 60 人的大班,这种概率要大于 99%。从引起逻辑矛盾的角度来说,生日悖论并不是一种 “悖论”。但这个数学事实十分反直觉,故称之为一个悖论。生日悖论是有个有趣的概念,但这和我省上百G的内存有什么关系?背景首先介绍下背景,工作中我负责了一个广告数据系统,其中一个功能就是对同一次请求的广告曝光去重,因为我们只需要知道这次请求这个广告的一次曝光就行了,那些同一
2020-07-04 13:44:53
5115
2
转载 为什么美国程序员工作比中国程序员工作轻松、加班少?
转自:量子位(整理)+ 知乎按惯例,先问是不是,再问为什么。从知乎回答浏览量看,是的。那么为什么美国程序员就可以到点下班回家,而中国程序员就要每天“主动”、“无偿”加班呢?仔细看了群众们热情的回答之后,大概可以分为几派:1、产品经理不够通情达理,导致效率低下2、表演性加班,太早回家会被认为不努力工作3、不尊重技术人才,35岁警告⚠️4、中国处于后发追赶,不加班是追不上的一起来看看具体的吐槽内容:开发和 PM 的斗争...
2020-07-02 12:22:42
492
2
翻译 一文理解操作系统虚拟内存
原文地址An introduction to virtual memory计算机是用来执行简单任务的复杂机器:比如 上网、文本编辑、网页服务、视频游戏……,还可以对数据进行操作,图片 音乐 文本 数据库……当计算机不使用的时候,程序和数据都安静地躺在磁盘里,即便你关机了数据也会在。运行一个应用就是让处理器(CPU)读取和执行程序代码的机器指令处理数据。磁盘可以保存大量的信息,但存取的时候都非常非常慢,比CPU慢得多,如果CPU直接从磁盘中读取指令,显然会成为整个系统的性能瓶颈。为此,主存/内存(R.
2020-06-25 14:44:58
389
原创 Json字段选取器介绍和实现
最近为了工作方便写了一个小工具,这个小工具作用很简单,就是从一个json字符串中筛出你想要的部分。介绍背景是这样的,我们为了线上调试方便,有个工具可以模拟发起一次数据请求,然后将结果以json的形式展示到页面上。但问题是这个数据包含的信息非常多,动不动就上千行(如上图),但每次debug的时候,只想看里面特定的几个字段,平常只能依赖于浏览器搜索工具一行一行搜,可能想看的字段会间隔好几屏,一行行看即低效还容易漏。 如果要看JsonArray的数据,我之前是拷贝出来,然后用grep把字段筛出来,但这样又丢.
2020-06-20 22:54:42
421
原创 从0到1打造正则表达式执行引擎(二) NFA转DFA
在上篇博客从0到1打造正则表达式执行引擎(一)中我们已经构建了一个可用的正则表达式引擎,相关源码见https://github.com/xindoo/regex,但上文中只是用到了NFA,NFA的引擎建图时间复杂度是O(n),但匹配一个长度为m的字符串时因为涉及到大量的递归和回溯,最坏时间复杂度是O(mn)。与之对比DFA引擎的建图时间复杂度O(n^2),但匹配时没有回溯,所以匹配复杂度只有O(m),性能差距还是挺大的。DFA和NFA我们已经多次提到了NFA和DFA,它俩究竟是啥?有啥区别?首先,NF
2020-05-31 20:03:26
1114
1
原创 技术团队如何培养新人
文章目录对新人设立明确的阶段性目标提高新人培训的优先级和重视程度完善师徒体系增加理论知识的比重模拟实战经验分享定期培训题外话水一篇我17年写的内容。背景是我当时工作方向上的变化,但一直感觉上手很慢。刚工作时也有这种体会,当时纯觉得自己菜,但后来看了《Site Reliability Engineering》和《The effective engineer》之后发现不完全是自己菜,而是缺少正确的指引,很多东西完全靠自己踩坑才知道了,学习效率很低。这种状态下,除了被别人质疑能力外,还会逐渐产生自我怀疑,导致情
2020-05-18 21:50:50
650
原创 面试题精选:循环队列
近期在面试找工作的小伙伴们很多啊,我周围就有好几个认识的朋友在找工作,于是我突发奇想在CSDN开了一个面试题精选的专栏,主要会关注一些算法题、设计题,次要会补充一些java面试相关的题(比较本博主是java出身)。其实在此之前已经写过一些相关的文章了,已经整理到专栏里的,后续会持续更新,希望对大家有所帮助,有兴趣的旁友可以关注下。今天分享的面试题是循环队列,我对这道题记忆深刻,因为我在14年参加来校招面试的时候,二面面试官就问了这道题,当时我没有完全答上来(不过面试官居然给我过了),后来我当面试官的时候也
2020-05-10 17:06:57
394
原创 从0到1打造正则表达式执行引擎(一) 正则表达式转NFA
文章目录前置知识有限状态机状态机下的正则表达式串联匹配并连匹配 (正则表达式中的 **|**)重复匹配(正则表达式中的 **? + ***)重复0-1次 ?重复1次以上重复0次以上匹配指定次数特殊符号(正则表达式中的 **. \d \s……**)子表达式(正则表达式 **()**)练习题代码实现建图匹配下集预告功能完善化DFA引擎正则引擎优化今天是五一假期第一天,这里先给大家拜个晚年,咳咳!!我...
2020-05-01 17:28:42
10076
16
原创 面试题精选:求根号2简单?高级算法你肯定不会
前两天逛github看到一道很简单的面试题——如何不用库函数快速求出2\sqrt22的值,精确到小数点后10位! 第一反应这不很简单嘛,大学数据结构课讲二分查找的时候老师还用这个做过示例。但转念一想,能作为大厂的面试题,背后绝对没有那么简单,于是我google了下,结果找到了更巧妙的数学方法,甚至发现了一件奇闻趣事…… 一道简简单单的面试题,不仅能考察到候选人的编程能力,还能间接考察到候选人的数...
2020-04-12 20:30:23
1183
原创 欢迎关注我的微信公众号
公众号注册n年了,但一直都没怎么发过文章,真是五年运营四年敷衍,去年年底在做自我年终总结的时候放下豪言说要开始重新运营公众号了,但一拖就拖到了3月底。这几个月想了好久的公众号定位,大概有些方向了(下文细说),所以决定摒弃我这间歇性踌躇满志持续性萎靡不振的毛病,硬着头皮开更了。自我介绍大家好 我是xindoo,这个id在我上高中的时候就被我创造出来了,也用了好久了,所以基本上你在全球各网站看到名...
2020-03-22 23:51:17
502
1
原创 StampedLock源码分析
文章目录前言乐观锁 or 悲观锁源码分析构造函数读锁相关API乐观读锁的实现读锁的获取读锁的释放写锁相关API写锁的获取写锁的释放其他API读锁转写锁写锁转读锁转乐观锁ReadLockView和WriteLockView注意事项参考资料前言之前已经说过了ReentrantLock ReentrantReadWriteLock,可以参考之前的博客。在ReentrantReadWriteLock源...
2020-03-22 16:22:04
585
翻译 技术人必须知道的42个谷歌搜索技巧
前言作为一个技术人,经常会遇到自己不懂或不知道的东西,这个时候就必须使用搜索引擎搜索相关的资料,当然大部分人都逃不过google,google上的内容繁多,如何快速检索和筛选自己想要的信息却成了问题。其实google提供了高级搜索的方式,只是很多人都不太清楚,配合简单的google搜索表达式,可以让你的搜索事半功倍,这里我济源巧合看到国外一篇网站对google搜索命令总结比较完整,整理翻译如下,...
2020-03-15 22:31:11
1493
原创 Antlr实战之JSON解析器slowjson
最近一直在学习编译原理,然后就了解到了antlr4这个强大的工具,antlr的全称是(Another Tool for Language Recognition),是一款很强大的词法和语法分析工具,虽然是用java写成的,但它也能生成c++、go……等语言的代码。它的主要作用就是你可以用巴科斯范式来描述语法规则,然后它帮你生成对应的解析器。大家都知道实践是最好的学习方式,要快速深刻地理解antl...
2020-03-08 20:49:11
760
转载 刘未鹏:为什么你应该(从现在开始就)写博客
今天转载一篇刘未鹏10多年前的一篇博客《为什么你应该(从现在开始就)写博客》,我觉得总结的非常好,上大学的时候我就看过了,因为这篇博客所以我从13年开始坚持写博客。刘未鹏最近博客也不更了,可能他的博客慢慢就沉下去了,但我觉得他很多优质的内容不能沉,就比如这篇文章,我觉得很适合初入CSDN、刚开始学技术的同学,所以特此转载一次。 原文地址http://mindhacks.cn/2009/02/1...
2020-03-01 18:33:20
643
1
翻译 Java volatile 关键词
文章目录变量可见性问题Java volatile可见性保证volatile 完全可见性保证指令重排序挑战Java volatile和有序性(Happens-Before)保证volatile还不够什么时候volatile就足够了?volatile的性能考量原文地址Java中的volatile关键词被用来将变量标记为“存储在内存中”。准确地的讲每次volatile变量的读取和写入都是直接操作内存,...
2020-02-23 19:41:58
305
红黑树 red-black
2013-04-19
《OpenCL异构计算》全书所有插图及实现代码
2013-04-19
acm Hdoj 离线版 1000-3000题 可搜索查找
2012-10-07
算法导论 第三版英文版 有索引
2012-07-02
workflow.zip
2019-08-19
是否可以提供博客流量统计的功能?
发表于 2018-03-16 最后回复 2018-03-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人 TA的粉丝