代码改变世界

随笔分类 -  编程

算法与数据结构基础 - 图(Graph)

2019-09-20 13:22 by bangerlee, 1153 阅读, 收藏, 编辑
摘要: 图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图。依据不同维度,图可以分为有向图/无向图、有权图/无权图、连通图/非连通图、循环图/非循环图,有向图中的顶点具有入度/出度的概念。 面对图相关问题,第一步是将问题转为用图表示(邻接表/邻接矩阵),二是使用图相关算法求解。 相关Leet 阅读全文

算法与数据结构基础 - 递归(Recursion)

2019-09-17 15:03 by bangerlee, 1560 阅读, 收藏, 编辑
摘要: 递归基础 递归(Recursion)是常见常用的算法,是DFS、分治法、回溯、二叉树遍历等方法的基础,典型的应用递归的问题有求阶乘、汉诺塔、斐波那契数列等,可视化过程。 应用递归算法一般分三步,一是定义基础条件(base case),二是改变状态、向基础条件转移,三是递归地调用自身。例如 LeetC 阅读全文

算法与数据结构基础 - 分治法(Divide and Conquer)

2019-08-13 13:11 by bangerlee, 1587 阅读, 收藏, 编辑
摘要: 分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解、最终合并结果,分治法用伪代码表示如下: 分治法简单而言分三步 Divide、Conquer、Combine,图示如下: 和动态规划、贪心等一样,分治法是一种算法思想,不是用于解决专门某类问 阅读全文

算法与数据结构基础 - 合并查找(Union Find)

2019-04-20 15:14 by bangerlee, 4574 阅读, 收藏, 编辑
摘要: Union Find算法基础 Union Find算法用于处理集合的合并和查询问题,其定义了两个用于并查集的操作: Find: 确定元素属于哪一个子集,或判断两个元素是否属于同一子集 Union: 将两个子集合并为一个子集 并查集是一种树形的数据结构,其可用数组或unordered_map表示: F 阅读全文

LSM Tree存储组织结构介绍

2015-03-01 21:16 by bangerlee, 13137 阅读, 收藏, 编辑
摘要: LSM Tree(Log Structured Merge Trees)数据组织方式被应用于多种数据库,如LevelDB、HBase、Cassandra等,下面我们从为什么使用LSM tree、LSM tree的实现思路两方面介绍这种存储组织结构,完成对LSM tree的初步了解。 存储背景回顾 L 阅读全文

协程 及 libco 介绍

2014-10-02 19:09 by bangerlee, 5867 阅读, 收藏, 编辑
摘要: libco 是腾讯开源的一个协程库,主要应用于微信后台RPC框架,下面我们从为什么使用协程、如何实现协程、libco使用等方面了解协程和libco。 why协程 为什么使用协程,我们先从server框架的实现说起,对于client-server的架构,server最简单的实现: while(1) { 阅读全文

rtags——node.js+redis实现的标签管理模块

2012-12-03 00:08 by bangerlee, 3433 阅读, 收藏, 编辑
摘要: 引言在我们游览网页时,随处可见标签的身影:进入个人微博主页,可以看到自己/他人的标签,微博系统会推送与你有相同标签的人游览博文,大多数博文有标签标记,以说明文章主旨,方便搜索和查阅网上购物,我们经常使用标签进行商品搜索,如点选 “冬装” + “男士” + “外套” 进行衣物过滤rtags就是一个用于... 阅读全文

函数调用过程探究

2012-05-22 01:30 by bangerlee, 50155 阅读, 收藏, 编辑
摘要: 引言如何定义函数、调用函数,是每个程序员学习编程的入门课。调用函数(caller)向被调函数(callee)传入参数,被调函数返回结果,看似简单的过程,其实CPU和系统内核在背后做了很多工作。下面我们通过反汇编工具,来看函数调用的底层实现。基础知识我们先来看几个概念,这有助于理解后面反汇编的输出结果... 阅读全文

如何使用strace+pstack利器分析程序性能

2012-04-30 01:00 by bangerlee, 39231 阅读, 收藏, 编辑
摘要: 引言 有时我们需要对程序进行优化、减少程序响应时间。除了一段段地对代码进行时间复杂度分析,我们还有更便捷的方法吗? 若能直接找到影响程序运行时间的函数调用,再有针对地对相关函数进行代码分析和优化,那相比漫无目的地看代码,效率就高多了。 将strace和pstack工具结合起来使用,就可以达到以上目的 阅读全文

No!No!No! It's not fashion!

2011-11-08 23:38 by bangerlee, 2701 阅读, 收藏, 编辑
摘要: 还记得搞怪的hold住姐Miss Lin么,对于人们常规的行为,Miss Lin会挑起夸张的眉毛说:"Oh my God, it's not fashion!"。如果程序员圈子里有位Miss Lin,对于一些功能的实现,她会认为哪些编码实现方法是not fashion的,哪些是fashion的呢?下... 阅读全文

代码度量工具——SourceMonitor的学习和使用

2011-09-18 10:02 by bangerlee, 36423 阅读, 收藏, 编辑
摘要: 引言我们提倡编写功能单一、结构清晰、接口简单的函数,因为过于复杂的函数会给我们带来很多问题:加深其他开发人员理解代码的难度;不方便测试人员对其编写测试用例;容易隐藏错误;出现问题难以定位……怎样的函数算是复杂的函数?哪些代码散发着“臭味”?除了依靠经验丰富的程序员的敏锐嗅觉,我们还可以通过工具,对我... 阅读全文

代码静态分析工具——splint的学习与使用

2011-09-07 23:33 by bangerlee, 48661 阅读, 收藏, 编辑
摘要: 引言最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便。PC-Lint是一款针对C/C++语言、windows平台的静态分析工具,FlexeLint是针对其他平台的PC-Lint版本。由于PC-Lint/FlexeLint是商业的程序分析工具,不便于大家对其进行... 阅读全文

内存池的实现(二)

2011-09-01 21:24 by bangerlee, 20667 阅读, 收藏, 编辑
摘要: 《内存池的实现(一)》中,介绍了使用内存池的原因,设计内存池应该考虑的问题,最后给出一个简单的内存池实现例子。使用上一篇文章中介绍的内存池实现方案,要在一定的限定条件下,下面我们来看更通用的内存池实现——Apache服务器的内存池实现。Apache服务器的开发人员将代码中可移植的部分整理出来,编辑成... 阅读全文

内存池的实现(一)

2011-08-31 23:38 by bangerlee, 51323 阅读, 收藏, 编辑
摘要: 引言 C/C++下内存管理是让几乎每一个程序员头疼的问题,分配足够的内存、追踪内存的分配、在不需要的时候释放内存——这个任务相当复杂。而直接使用系统调用malloc/free、new/delete进行内存分配和释放,有以下弊端: 内存池(memory pool)是代替直接调用malloc/free、 阅读全文

函数库学习入门指引

2011-08-31 21:58 by bangerlee, 4401 阅读, 收藏, 编辑
摘要: 在学习某一函数库的时候,我们经常做的第一件事, 就是把该函数库的源码下载回来进行编译和安装(一般是这三步:./configure -> make -> make install),然后写一些调用库函数的小用例,看其能否正常运行以及运行后的效果。完成库函数安装,当我们满心期待地使用GCC进行用例编译的... 阅读全文