摘要: 虽然Memory Pool/Cache似乎是比较偏系统底层的东西,但是很多大规模分配和释放memory的程序在到了优化阶段之后,使用Memory Pool/Cache几乎是一个必备的手段。这跟互联网应用的大量连接的应用类似,这类应用往往也要使用Thread Pool,来避免不停创建/销毁线程的高昂代价。至于Memory Pool和Memory Cache的相同与不同之处,我个人是这么理解的:1相同之处:(为了达到提高效率的目的)允许有效数据和无效数据并存。而且,无论是Pool还是cache,往往都是限定大小的区域(因为在运行时改变大小,就意味着巨大的开销)。2 不同之处:对Pool来说,有效数 阅读全文
posted @ 2011-05-12 01:30 微型葡萄 阅读(621) 评论(0) 推荐(0) 编辑
摘要: 数据结构中的经典问题之一就是根据二叉树的某种遍历序列重建二叉树,比如给出前序和中序序列,但是要求输出后序遍历的结果。这里仅仅帖一份根据前序和中序遍历重建二叉树的代码吧(要输出后序遍历的结果,只要添加一个后序遍历函数即可),正好是POJ 2255的答案。#include <iostream>#include <map>#include <utility>#include <functional>#include <string>#include <stack>using namespace std;typedef char 阅读全文
posted @ 2011-05-12 01:29 微型葡萄 阅读(662) 评论(0) 推荐(0) 编辑
摘要: 思路来自于微软的《编程之美》。注意:子序列(subsequence)和连续子数组还是不一样的,子序列可以是不连续的。/*****************************列出了四种算法,复杂度从O(N^3)到O(N)Author: MicroGrapeDate:2009-5-20*****************************/#include <iostream>using namespace std;/*O(N^3) algorithm*/int MaxSubSumA(int a[], int n){int maxsum = 0;for(int i = 0; i 阅读全文
posted @ 2011-05-12 01:24 微型葡萄 阅读(557) 评论(0) 推荐(0) 编辑
摘要: 其实这个算法写了很多次了,但是总是理解不深。这次专门拿出时间好好的分析一下。【基本原理】称为三角算法。以下面的简单图示表示。假设v1是我们的源点,它的最短路径长度已固定(为0)。那么首先找到的最短路径是v1-v2。找到v2之后,我们最短路径长度已固定的节点的集合就变成了{v1,v2}。那么需要更新与v2邻接的所有节点的最短路径长度的值,由于1+2<5,所以v3的最短路径长度就更新为3而不是保持为5。当然,如果v2到v3的距离大于4,v3的最短路径长度是不需要更新的。Dijkstra的最短路径算法往往有几种存储方式,例如:(1)邻接矩阵。形如a[i][j]来存储节点i与节点j之间的路径。( 阅读全文
posted @ 2011-05-12 01:24 微型葡萄 阅读(512) 评论(0) 推荐(0) 编辑
摘要: 【原理】这个算法也是求最短路径时常用的算法,但由于其复杂度为O(EV)其中E、V分别为边的总数和顶点的总数。如果当为稠密图时,E也是O(V^2)的级别,因此整体复杂度会达到O(E^3)。如果是稀疏图,则无法达到使用优先队列的Dijkstra算法的O(E*logV)。因此,Bellman-Ford算法更适合于稠密图。但是它相比Dijkstra算法更好的一点就是,它能够处理带有负权值的边。但是依然无法处理负权值的回路,如果遇到的话会检测到,从而退出程序。算法思想如下:Bellman-Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题。对于给定的带权(有向或无向)图 G=(V,E), 阅读全文
posted @ 2011-05-12 01:23 微型葡萄 阅读(596) 评论(0) 推荐(0) 编辑
摘要: 字符串匹配是算法中的一个重要领域,常用在计算机科学的自然语言处理和模式匹配中。(一)经典的字符串匹配算法(1)穷举或者暴力法/brute force简称BF。(2)大名鼎鼎的KMP算法(Knuth-Morris-Pratt)。(3)Horspool算法及Boyer-Moore算法。(4)其他:如Sunday算法,BOM算法(Backward Oracle Matching),BNDM算法(Backward Nondeterministic Dawg Matching)等等。这些我根本就没有看过,本文中就不再讨论了。(二)字符串匹配算法的联系和区别我们要进行字符串匹配,肯定是一个字符一个字符的比 阅读全文
posted @ 2011-05-12 01:21 微型葡萄 阅读(1017) 评论(0) 推荐(0) 编辑
摘要: 这里只贴一份来自《算法导论》的伪代码改写的代码。void KMP_prefix( const char *t, int *next ){int len = strlen(t) ;int i, j = -1 ; next[0] = -1 ;//请读者自行思考i什么时候增长for( i=1; i<len; ++i ) {//i永远和j+1位的比较(因为j初始值为-1)//如果失配就执行跳转。直到j为-1为止。while( (j+1>0)&&(t[j+1]!=t[i]) ) j = next[j] ;//如果匹配,则两个串的指针都增长if( t[j+1]==t[i] )+ 阅读全文
posted @ 2011-05-12 01:20 微型葡萄 阅读(387) 评论(0) 推荐(0) 编辑
摘要: 大名鼎鼎的“背包问题”我不敢企及去探讨,最近初学,感觉背包及相关问题真乃博大精深,于是把自己初学的体会写下来,帮助那些跟我一样也许暂时还没有思路的人。本文的核心算法都是动态规划。【问题】与背包问题近似的经典动态规划题目有(附相应的wiki条目):背包问题(knapsack problem)http://en.wikipedia.org/wiki/Knapsack_problem找零问题(coin changing/change making)http://en.wikipedia.org/wiki/Change-making_problem子集和问题(subset sum)http://en. 阅读全文
posted @ 2011-05-12 01:18 微型葡萄 阅读(1379) 评论(2) 推荐(0) 编辑
摘要: 矩阵连乘也是经典的动态规划的例子,而且能比较明显的把原来子问题的复杂度从指数级降为O(n^3),算是效果明显。【分析】算法的分析请见参考资料,我就不重复写了。就是写代码的时候需要注意两点:(1)这个程序是自底向上的动态规划。因为我们在一个段[ i : j ]中进行划分的时候,那么必须下面的每一个小段必须已经生成了。如下图所示:所以不能采用传统的那种i和j从头到尾的遍历(这种双重循环一般只适合于从前向后生成,比如最长公共子序列等动态规划)。(2)一开始对书中的递推式m[i][j] = m[i][k] + m[k][j] + pi-1 * pk * pj中的后面三项很不理解。为什么会是三项呢?书中 阅读全文
posted @ 2011-05-12 01:17 微型葡萄 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 【问题】随机抽样问题表示如下:要求从N个元素中随机的抽取k个元素,其中N无法确定。这种应用的场景一般是数据流的情况下,由于数据只能被读取一次,而且数据量很大,并不能全部保存,因此数据量N是无法在抽样开始时确定的;但又要保持随机性,于是有了这个问题。所以搜索网站有时候会问这样的问题。这里的核心问题就是“随机”,怎么才能是随机的抽取元素呢?我们设想,买彩票的时候,由于所有彩票的中奖概率都是一样的,所以我们才是“随机的”买彩票。那么要使抽取数据也随机,必须使每一个数据被抽样出来的概率都一样。【解决】解决方案就是蓄水库抽样(reservoid sampling)。主要思想就是保持一个集合(这个集合中的 阅读全文
posted @ 2011-05-12 01:07 微型葡萄 阅读(353) 评论(0) 推荐(0) 编辑
摘要: 原来不曾知道有这个好东西,找一个函数要用那种文件搜索软件等好久好久才能出来结果。Linux Cross Reference(LXR)全解决了!真是阅读Linux源代码的好工具。下面是google搜索出来的第一个:http://lxr.linux.no/优点是版本比较全哈,从2.6.11之后的所有版本都有。缺点就是速度比较慢。但是据说还可以在本机上搭建一个镜像。。。太麻烦了 没试。http://tomoyo.sourceforge.jp/cgi-bin/lxr/ident这个速度相当快,不过就是没有老版本的。 阅读全文
posted @ 2011-05-12 01:03 微型葡萄 阅读(881) 评论(0) 推荐(0) 编辑
摘要: proftpd是一个Linux下的多功能ftp服务器软件。官网见:http://www.proftpd.org/而FTPS是一个有安全机制的FTP协议,有相应的标准(RFC 4217 http://www.faqs.org/rfcs/rfc4217.html )。使用源代码安装proftpd# cd /usr/src# wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.10.tar.gz# tar -xvzf proftpd-1.2.10.tar.gz# cd proftpd-1.2.10编译之前要确定自己装了以下两个包:# apt-g 阅读全文
posted @ 2011-05-12 01:02 微型葡萄 阅读(2203) 评论(0) 推荐(0) 编辑
摘要: 又免费,功能也不错,还有什么需要说的呢。虽然没有商业的SecureCRT那么强大,连接到我的中文版Debian Linux服务器也不会乱码,夫复何求?官方地址:http://en.poderosa.org/ 阅读全文
posted @ 2011-05-12 01:02 微型葡萄 阅读(1602) 评论(0) 推荐(0) 编辑
摘要: 昨天在编译Xplot的时候,configure的时候报:checking for main in -lX11... no意即找不到X11库文件,后来在/usr/include/X11文件夹下也没有找到相应的头文件,证明确实是没安装X11。其实很简单,先运行# apt-get install libx11*查看一下到底x11的库有哪些,提示有很多包未安装,其中有libx11-dev。一般在开发中用到的都会后缀有dev字样。所以我就安装了这个包。# apt-get install libx11-dev重新configure就发现上文的那个no变成了yes。注:在我的fedora 10上需要两个包, 阅读全文
posted @ 2011-05-12 01:01 微型葡萄 阅读(2295) 评论(0) 推荐(0) 编辑
摘要: 现在专心研究网络了,云计算只要跟进就好了。TcpDump是Linux平台上常用的抓包工具,一般的Linux发行版中都包括了。官方网站见:http://www.tcpdump.org/===================TcpTrace=================TcpTrace就是个强大的包了,具体功能我还没有研究,现在只用到最简单的功能。官方网站点这里。安装只要下载tar包,然后按照常规configure/make/make install就可以了。不过要注意:安装TcpTrace之前,必须要安装libpcap,这个包在fedora官方源中有,输入下面的命令即可:# yum inst 阅读全文
posted @ 2011-05-12 01:01 微型葡萄 阅读(1342) 评论(0) 推荐(0) 编辑
摘要: 这个工作流可以表示为tcpdump=>tcptrace=>xplot,即tcpdump产生的数据为16位数据,需要经过tcptrace解读成人可读或者xplot可表示的数据(xplot所需数据文件后缀名为xpl)。tcpdump截取数据的用法网上很多,请你自己google。然后就是用tcptrace加选项,来产生xplot可显示的数据。每种图形在tcptrace中所需的选项,可以见此页:http://www.tcptrace.org/manual/node11_tf.html。然后直接用下面的命令即可画图(xxx.xpl为tcptrace所产生的数据文件):# xplot xxx. 阅读全文
posted @ 2011-05-12 01:00 微型葡萄 阅读(852) 评论(1) 推荐(0) 编辑
摘要: 今天实验室进了三台IBM x3650做Hadoop试验之用。第一次接触蓝色巨人的东西,硕大的体积几乎挤爆了我的办公桌,不过倒是觉得那风扇的噪音特别好听。。。夸IBM几句吧:机器做的真人性,前后都有USB口;前面板甚至加了一个VGA接口(这样在前面板调设备会十分简单,鼠标键盘显示器都直接可用);作为服务器IBM专门提供了系统引导盘,用来做RAID;两颗4路Xeon至强CPU+做RAID5之后的558G硬盘+8G内存让我high到极点,YY着什么时候这样的配置会变成我的笔记本。。。sigh,废话少说。引导盘完了之后装了Debian 4.0,还是RC版。再夸夸Debian吧,虽然我只用了一张CD安装 阅读全文
posted @ 2011-05-12 00:59 微型葡萄 阅读(1052) 评论(0) 推荐(0) 编辑
摘要: CentOS如果装英文版,如果在系统语言里改为汉语后会导致所有的显示都是乱码的方块。那么需要两个中文支持的包:fonts-chinese-3.02-12.el5.noarch.rpmfonts-ISO8859-2-75dpi-1.0-17.1.noarch.rpm一个是中文字体,一个是字体显示,两个包。可以在下面地址下载:http://ftp.dc.volia.com/pub/CentOS/CentOS/页面搜索即可。下载后,在命令行安装:rpm -ivh XXXX(XXXX代表上面那两个包的全名,rpm不会不知道怎么用吧?)安装完成后,重新启动即可。=============中文输入==== 阅读全文
posted @ 2011-05-12 00:58 微型葡萄 阅读(420) 评论(0) 推荐(0) 编辑
摘要: 本文介绍内核如何给自己分配物理内存并管理。对应《深入》第8章。在《深入》第2章“内存寻址”(或者是我博客中的这篇文章,点这里)中,已经介绍了内核如何给自己分配1G的线性地址的。但是物理内存的分配及管理恐怕更复杂而且更有必要:内存分配和释放的速度(由内存管理的算法决定)影响内核的工作效率。首先介绍概念:页框:通俗的说就是物理内存上的单元。请注意与“页”的区别。页有两重意思,不过最多的用法是指线性地址的单元。所以一个是实际物理内存的单元,一个是线性地址/虚拟内存的单元。在大多数情况下,页框大小等于页的大小,为4KB,使得一个页框恰好可以容纳一个页的数据。(1)为什么要进行内存管理?内存管理的目的总 阅读全文
posted @ 2011-05-12 00:57 微型葡萄 阅读(336) 评论(0) 推荐(0) 编辑
摘要: 软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者。本文重点在于介绍这三者之间的关系。(函数细节将不会在本文中出现,可以参考文献,点这里)(1)上半部和下半部的区别上半部指的是中断处理程序,下半部则指的是一些虽然与中断有相关性但是可以延后执行的任务。举个例子:在网络传输中,网卡接收到数据包这个事件不一定需要马上被处理,适合用下半部去实现;但是用户敲击键盘这样的事件就必须马上被响应,应该用中断实现。两者的主要区别 阅读全文
posted @ 2011-05-12 00:56 微型葡萄 阅读(381) 评论(0) 推荐(0) 编辑