时间轮 简述 顾名思义,时间轮就像一个轮子,在转动的时候外界会指向轮子不同的区域,该区域就可以被使用。因此只要将不同时间的定时器按照一定的方法散列到时间轮的不同槽(即时间轮划分的区域)之中,就可以实现在运转到某个槽时,进行判断该定时器是否已经到达运行时间(需要判断是由于有的定时器并非在这一圈就需要运行,可能需要后面几圈才会运行。 从图中也可以看出,每个槽中的定时器是以(双向)链表形式存储的,每次添加的时候直接插入到链表的开始(头插法)。值得注意的是,由于使用头插法,因此在运行到某个槽时,需要遍历一遍链表,已检查是否有到达时间的计时器,有的话就运行,并删除结点。 至于在每转到一个槽时都要检查是否到达运行时间,可以这样理解:时间轮进行散列的方法就是取余运算,假设每个槽的间隔为1s,共有n个槽,当前转到了第cur个槽,那么一个定时在 t s以后运行的定时器就要放在第( cur + t % n ) % n个槽,并在运行t / n圈后到达该槽时才会运行。因此一个槽中的定时器运行的时间是相差i( 继续阅读 >>


王良 18/07/31 17:08:21
879. 盈利计划 帮派里有 G 名成员,他们可能犯下各种各样的罪行。 第 i 种犯罪会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与。 让我们把这些犯罪的任何子集称为盈利计划,该计划至少产生 P 的利润。 有多少种方案可以选择?因为答案很大,所以返回它模 10^9 + 7 的值。 示例 1: 输入:G = 5, P = 3, group = [2,2], profit = [2,3] 输出:2 解释: 至少产生 3 的利润,该帮派可以犯下罪 0 和罪 1 ,或仅犯下罪 1 。 总的来说,有两种方案。 示例 2: 输入:G = 10, P = 5, group = [2,3,5], profit = [6,7,8] 输出:7 解释: 至少产生 5 的利润,只要他们犯其中一种罪就行,所以该帮派可以犯下任何罪行 。 有 7 种可能的计划:(0),(1),(2),(0,1),(0,2),(1,2),以及 (0,1,2) 。 提示: 1 <= G <= 继续阅读 >>


陈文浩 18/07/30 21:41:40
以前没有认真的总结readline,发现它的功能还是很赞的,这次记录一下,方便日后查看 安装 在deepin下可以用这个命令(Ubuntu和deepin一样) sudo apt-get install libreadline6-dev 原型 #include <readline/readline.h> #include <readline/history.h> ①char *readline (const char *prompt);//返回值就是读取的字符串 ②void add_history(const char *string);//用来返回历史 ③typedef char *rl_compentry_func_t(const char *text, int state); ④char **rl_completion_matches(const char *text, rl_compentry_func_t *entry_func); 继续阅读 >>


陈文浩 18/07/30 20:45:15
该webServer使用epoll+threadpool实现,支持GET、POST方法,并添加CGI进行数据计算并返回网页信息,可以解析返回html、picture、mp3、js、css等文件,可以实现稳定的运行。 使用c++编写。 源码请看我的Github。 流程简述 启动服务器,在浏览器输入服务器地址,将向服务器发送HTTP请求 服务器接收数据,新建任务,将任务添加到任务队列 从线程池中唤醒某线程,执行任务。若没有任务线程会处于wait状态;若任务过多,会存储在任务队列中,等待空闲线程来执行 某线程获得任务后,读取浏览器发送的请求信息,进行解析HTTP首部,根据对应的结果来进行相应的处理,返回信息,若文件不存在则返回404.html,若请求方法不存在则返回501错误信息。 若是POST,则需要调用CGI进行处理,并返回相应的信息。 任务结束后,需要进行delete,因为在主进程中,为避免任务未运行完便被析构,需要使用new来新建对象,为避免内存泄露,需要在任务结束后使用delete释放资源 继续阅读 >>


王良 18/07/28 16:45:42
上篇博文写到爬取教务系统获取信息时,登录时的验证码是手动输入的,所以就想试试能不能自别识别验证码并填充。查阅了很多信息,选取了Tesseract。 What is Tesseract ? Tesseract是能够运行在多种操作系统上的开源ORC(Optical Character Recognition , 光学字符识别)引擎,目前由Google维护,是最精确的开源ORC引擎之一。与Microsoft Office Document Imaging(MODI)相比,我们可以不断地训练,使图像转换文本的能力不断增强;如果团队深度需要,还能以它为模板,开发出符合自身需求的OCR引擎。 How to use Tesseract 1. 安装 ubuntu 下可以直接进行安装 sudo apt-get install tesseract-ocr 安装图像解析的包 sudo apt-get install libpng12-dev sudo apt-get install lib 继续阅读 >>


李猛 18/07/28 16:17:30
为了提高Tesseract识别的准确性,需要对图片进行一些处理。 灰度化 RGB颜色模型 一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以产生多种多样的色光,且三原色的红绿蓝不可能用其他单色光合成。 RGB色彩模式使用RGB模型为图像中每个像素的RGB分量分配一个0~255范围内的强度值。RGB图像仅仅使用三种颜色,R(red)、G(green)、B(blue),就能够使它们依照不同的比例混合,在屏幕上呈现16777216(256 * 256 * 256)种颜色。 什么是灰度化 在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。0%的灰度RGB数值是255,255,255;1%灰度的RGB数值是253,253,253;2%灰度RGB值为250,250,250。 灰度图像与黑白图像不同,在计算机图像领域中黑 继续阅读 >>


李猛 18/07/28 16:16:48
题意:原题链接 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 给定 target = 5,返回 true。 给定 target = 20,返回 false。 很显然,遍历该二位数组是最愚蠢的做法,如果这样做也是挺智障的。那有没有更好的想法呐?emmmmmmm,好吧,还是直说吧,就不废话了 。用我们刚刚讲过的二叉查找树的思路解决。 思路:从该二维数组右上角的数字开始,如果该数字和target相等,那么查找完毕;如果小于,往左走,如果大于往下走 。就像二叉查找树一样,就 继续阅读 >>


刘生玺 18/07/28 15:34:19
在需要频繁开线程时,创建和销毁线程会话费大量时间,为了提高效率,我们可以在任务开始前,先创建一定数量的线程。这样在接收到任务时,就可以直接使用线程池中处于wait状态的线程,在任务结束后线程回到wait状态,等待新任务的到来,这就避免了线程的创建与销毁,从而提高程序执行效率。 所需数据 需要存储有多少线程( int thread_number ) 需要开辟对应的数组,存储线程号( pthread_t *threads ) 需要一个任务队列来存储未执行的任务,便于线程竞争任务并执行( task_queue ) 需要一个flag来标记线程池是否结束,该标记可以在线程池结束后唤醒所有处于等待线程的线程,让它们可以正常退出(其中,所有线程处于脱离(detach)状态) 互斥锁与条件变量,用于避免在获取与添加任务时发生错误(同步与互斥) 运行流程 执行ThreadPool的构造函数,初始化有关数据,进行线程的创建,并将线程进行脱离(使线程在运行完后可以自动回收) 创建的线程会去执行工作线程, 继续阅读 >>


王良 18/07/28 10:35:57
   最近写项目写得让人有点烦躁,于是找了点新鲜的东西搞——二叉查找树(BST),来提提兴趣,废话不多说,现在就让我们进入BST的世界吧! 1. 定义 二叉查找树(Binary Search Tree),又称二叉排序树(Binary Sort Tree),亦称二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值; 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值; 左、右子树也分别为二叉排序树; 比如:    其实说了这么多,不就是左边的节点比根节点小,右边的节点比根节点大嘛。哼~(当然还有相等的情况) 2. BST的来源 数组和链表以及BST在使用数据时的优缺点: 数据结构 优点 缺点 数组 直接使用下标查找 不便于删除或者插入 链表 删除或者插入方便 不便于查找 BST 兼顾具有两者的优点 。。。 可见 继续阅读 >>


刘生玺 18/07/27 14:49:03
新版正方教务系统请点这里:模拟登陆新版正方教务管理系统(获取学籍信息、课表和成绩) 最近想学点爬虫玩玩,拿学校的教务系统练练手。学校与很多高校一样,用的是正方教务管理系统,非常的不好用,经常出现登陆不上去、卡死的情况,主页如下图所示: 主页地址:http://222.24.62.120 模拟登录 1. 分析登录的URL和所需提供的数据 我们输入学号、密码和验证码登录后,点击登录。这时浏览器会向服务器提交一个POST请求: 我们由上图中的数据可知,登录请求的URL地址为: http://222.24.62.120/default2.aspx 所提交的数据除了学号、密码、验证码、用户类型,还有其他的数据: __VIEWSTATE在源码中可以找到,是一个隐藏域,猜测是用来做验证 <input type="hidden" name="__VIEWSTATE" value="dDwxNTMxMDk5Mzc0Ozs+lYSKnsl/mKGQ7CKkWFJ 继续阅读 >>


李猛 18/07/27 14:05:34