2016-08-03 ruki
tbox提供了两种定时器: 一种是基于最小堆的高精度定时器,精确到ms级别,但是时间复杂度在O(logn) 还有一种就是基于timing-wheel时间轮算法的低精度定时器,时间复杂度仅为O(1),实常数级别的,相当的快。 这个定时器是参考了linux内核的timer算法实现,不过linux那个比较通用,实现复杂,tbox中为了考虑精简性和低资源,对其算法做了精简 使得其资源占用更小,效率更高,但是使用场景上会有些限制,可以根据自己的实际情况,来判断使用需要用这个定时器来优化性能,还是使用高精度版本。 ltimer低精度定时器,提供了几种精度模式: TB_LTIMER_TICK_100MS:100毫秒级别 TB_LTIM 继续阅读 »
2016-08-03 ruki
tbox内部提供了两种定时器实现:timer和ltimer timer: 高精度版本,采用最小堆实现,复杂度是:O(log(n)) ltimer: 低精度版本,采用linux内核中的timing-wheel算法,复杂度是:O(1) 这里主要讲解下,如何使用timer实现高精度的定时器任务,精确到ms级别,对于低精度的ltimer,可以参考:低精度定时器的使用 下面先给个简单的例子来说明: ```c /* 定义一个定时器任务处理函数 * * @param killed 表示当前任务是否被tb_timer_task_kill强行kill掉的 * @param priv 投递任务时传入的用户自定义数据指针 */ stat 继续阅读 »
2016-04-17 Lanffy
前段时间在segmentfault回答了一个关于算法的问题,感觉很有趣,记录下来. 继续阅读 »
2018-05-21 Mystery0 M
废话 因为四月份的蓝桥杯省赛拿了省一等奖,也报了国赛,加上6月2号的ACM,所以在这段时间里面要搞搞算法。 这段时间的面试(只面了京东(校招)和头条(内推)),暴露出来的是Java基础了解的不够深入,同时算法一直以来都是我的薄弱环节,希望这两个比赛能够让我得到一点提升。 这篇文章是为了我能够记住解题的思想同时也算是整理一下思路。 什么是LCS LCS(Longest Common Subsequence)——最长公共子序列 定义 一个序列S任意删除若干个字符得到新序列T,则T叫做S的子序列。 两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列。 这里主要区分一下子序列和子串(最长公共子序列和最长公 继续阅读 »
2013-06-13 Robert Zhang
分析:此题不难,但特别容易超时!——这正是困难之处:有n个元素的集合的子集共有2^n个,枚举算法的时间复杂度在O(2^n),且本题除枚举外别无他法(NP完全),因此必须尽一切可能性优化,着力在降低计算中n的值(以下1、2项优化)。关键的优化有以下几点(按重要性排列): 继续阅读 »
2017-05-30 Robert Zhang
如果考虑一般情况:把n个元素划分成p组(p = k + 8)、每组3个元素,分别计算每种划分的“难用度”然后找出最小值,这种穷举算法时间复杂度巨大、不可用。 题目中说筷子数组l是按长度排好序的,这是一点很重要的提示:如果我们拿l[i]做A筷,则B筷一定是l[i + 1]才能保证(A - B) ^ 2最小,至于C筷,只要它的序号大于i + 1即可。 继续阅读 »
2014-10-08 Xie Jingyi
从今天起至10月11日,持续连载。 关于计算机 ENIAC 出现于1946年。 是最早的计算机。 是电子管计算机。 其他 阶码,即浮点数的指数部分。 IPv6是128位的。 求补码:二进制下:各位取反再加1 或 把原码减1再取反。 关于算法 各种排序的时间复杂度 快速排序:$O(nlogn)$,最坏为$O(n^2)$。 冒泡排序:$O(n^2)$。 归并排序:$O(nlogn)$。 计数排序:$O(n)$。 插入排序:$O(n^2)$。 关于树 完全二叉树 vs 满二叉树:完全二叉树最后一层不一定满。 前序遍历:中左右;中序遍历:左中右;后序遍历:左右中。 节点数 继续阅读 »
2016-08-04 ruki
最近稍微整理了下tbox的utils模块,发现里面有很多都是一些,之前放置的hash算法,例如:md5, sha1, crc32, adler32啊什么,比较凌乱。 因此我抽时间整理下这些hash算法,打算单独建立个hash算法模块,来放置各种大大小小的hash算法。 顺便把tbox里面用到的一些字符串hash算法,也做了些整理,一并归并到这个新模块中,例如比较常用的一些字符串哈希: bkdr, fnv, fnv-1a, aphash, rshash, djb2, murmur, sdbm, blizzard ... 其中 bkdr 的效果比较好,因此目前作为tbox里面主要的string哈希来用,其他的hash虽然实现 继续阅读 »
2016-07-26 ruki
简介 这是一个可以直接解释执行从ida pro里面提取出来的x86汇编代码的虚拟机。 非常精简,整体架构上不能跟那些成熟的虚拟机相比,主要目标是够用、能用、轻量就行,如果觉得代码架构设计的不是很好的话,也不用过于吐槽哈。。 虽然我还有写过两个比较成熟的虚拟机项目(jvm和avm),虽然架构上比这个更完善,更容易扩展,功能也更强大 但是毕竟是给公司写的,没法拿出来分享。。 背景 先说说,为什么要写这个东西。。 之前有段时间,我在用ida逆向分析某些程序的算法,并且要把它提取出来将其跨平台运行,这个时候我首先考虑到是ida的F5插件 毕竟这个可以直接反成c/c++代码,还是很强大的,基本上98%的x86汇编代码,我在通过 继续阅读 »
2015-08-25 Li Shuai
之前两个月的时间全组投入到了我们自己的TV launcher的开发, 这算是比较重要的项目, 涉及到公司未来OTT的战略性产品, 所以重视程度比较高。 我负责了轮播服务的后端开发, 当然整个技术栈还是以Tornado/Redis/MongoDB为主。经常听到兄弟们抱怨学习了那么多算法, 进BAT也得面试算法什么的, 有个啥子用, 撸了这么多年代码, 用不到啥算法, 不也照样撸的风声水起吗。哥下面就小小展示一下, 其实算法这东西是有用的, 你带着算法和数据结构的一些思想思考问题, 和你仅仅凭经验写东西, 结果是很不一样的。 所谓轮播:指的是像电视台那样的一天24小时的滚动播放,由服务端生成播放列表(频道\频道的视频列表等), 并计算 继续阅读 »