随笔分类 -  程序相关

摘要:前一阵子一直在写排序的系列文章,最近因为一些事情耽搁了几天,也穿插了几篇其他类别的随笔。今天还是回到排序上面来,善始善终,呵呵。今天要介绍的也是一种效率很高的排序——堆排序思想堆排序,顾名思义,就是基于堆。因此先来介绍一下堆的概念。堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要大于其孩子,最小堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求,其实很好理解。有了上面的定义,我们可以得知,处于最大堆的根节点的元素一定是这个堆中的最大值。其实我们的堆排序算法就是抓住了堆的这一特点,每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大堆,依次类 阅读全文
posted @ 2012-03-08 09:46 ~大器晚成~ 阅读(22206) 评论(5) 推荐(1) 编辑
摘要:今天来说一个简单的需求:在一个序列中找到第二大的元素。一眼看到这个问题,感觉解决的方法有很多,因为这并不是一个困难的问题。随便一想,能有下面几种解法:1 首先排序,然后取第二个位置的元素2 循环遍历元素序列,找到最大的元素,然后将其移除。再重复此过程,得到第二大的元素当然还有其他的思路,这里就不一一列举了。如果大家有什么好的想法,可以给我留言,咱们一起探讨。仔细分析一下,不难发现,上面的方法虽然可以达到目的,但是效率都不高。第一种方法相当于一次排序过程,最快也要O(nlogn)的时间才能完成。而第二种方法需要循环遍历序列两次,O(n)+O(n)的时间复杂度虽然不是无法接受,但毕竟还是要循环两次 阅读全文
posted @ 2012-03-06 10:35 ~大器晚成~ 阅读(12734) 评论(65) 推荐(3) 编辑
摘要:今天在使用hadoop时遇到一个需求,要将具有一定关系的若干个大表进行合并join,乍看起来比较困难。但是仔细分析了一下,还是可以比较好的解决问题的。况且在海量数据处理中,这是一个非常普遍常见的需求。因此写下来和大家分享一下。如果哪为仁兄看后有更好的办法,咱们也可以切磋一下。欢迎拍砖,哈哈。下面描述一下需求,有如下两种数据数据Akey value1 value2 value3...valuen数据Bvalue1 a1 a2 a3....anvalue2 b1 b2 b3....bn...valuen x1 x2 x3...xn目标数据key value1 a1 a2 a3...an value 阅读全文
posted @ 2012-03-01 17:13 ~大器晚成~ 阅读(8485) 评论(5) 推荐(1) 编辑
摘要:今天介绍快速排序,这也是在实际中最常用的一种排序算法,速度快,效率高。就像名字一样,快速排序是最优秀的一种排序算法。思想快速排序采用的思想是分治思想。快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。举例说明一下吧,这个可能不是太好理解。假设 阅读全文
posted @ 2012-02-29 10:13 ~大器晚成~ 阅读(313536) 评论(71) 推荐(33) 编辑
摘要:在前面的文章中,已经向大家介绍了插入排序和选择排序两种基本的排序方法。今天要介绍的是另外一种排序方法——冒泡排序。思想同之前介绍的两种排序方式一样,冒泡排序也是最简单最基本的排序方法之一。冒泡排序的思想很简单,就是以此比较相邻的元素大小,将小的前移,大的后移,就像水中的气泡一样,最小的元素经过几次移动,会最终浮到水面上。举例分析说明一下,如下数据:2 7 4 6 9 1 首先比较最后两个数字,发现1比9小,于是前移2 7 4 6 1 9 然后比较6和12 7 4 1 6 9 继续前移,然后是4和12 7 1 4 6 9 7和1比较2 1 7 4 6 9 2和11 2 7 4 6 9 至此,第一 阅读全文
posted @ 2012-02-28 09:40 ~大器晚成~ 阅读(11838) 评论(9) 推荐(5) 编辑
摘要:今天继续介绍排序算法系列的第二讲,选择排序。选择排序也是一种常见的排序方法,非常简单。废话不说,来看看吧。思想还是先来看看选择排序的思想。选择排序的思想非常直接,不是要排序么?那好,我就从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素。相比于插入排序的固定元素找位置,是两种思维方式。不过条条大路通罗马,两者的目的是一样的。代码 for(int i=0; i<v.size(); i++){ int min = v[i]; ... 阅读全文
posted @ 2012-02-27 10:03 ~大器晚成~ 阅读(76031) 评论(13) 推荐(8) 编辑
摘要:各种排序算法应有尽有,看看这里http://coolshell.cn/articles/3933.html,很牛吧。有了这个,还敢说自己学不好排序么,呵呵什么?不明白哪个快那个慢?那看看这里http://www.sorting-algorithms.com/一句话总结,高手都在民间。。。 阅读全文
posted @ 2012-02-24 17:10 ~大器晚成~ 阅读(3241) 评论(5) 推荐(2) 编辑
摘要:好久没有写文章了,前一阵子身体不适。从今天开始,想把各种排序算法总结一下,基础才是最终要的,况且现在各种面试都会考到排序知识,希望我的文章能给大家带来一些帮助。这个排序系列没有主要次要之分,也不按难易顺序,完全随机。今天先说说插入排序。思想插入排序的思想有点像打扑克抓牌的时候,我们插入扑克牌的做法。想象一下,抓牌时,我们都是把抓到的牌按顺序放在手中。因此每抓一张新牌,我们都将其插入到已有的排好序的手牌当中,注意体会刚才的那句话。也就是说,插入排序的思想是,将新来的元素按顺序放入一个已有的有序序列当中。举个例子可能更容易理解一些,假设有这样一系列数字: 8 2 4 9 3 6 首先我们考虑数字. 阅读全文
posted @ 2012-02-23 12:14 ~大器晚成~ 阅读(8605) 评论(5) 推荐(2) 编辑
摘要:之前写过两篇科普文章,使用gdb调试程序入门篇和中级篇,今天打算把最后的一部分写完,就是所谓的高级篇。其实很简单,也没有多复杂。只是个人认为gdb的使用,掌握到这个地方,对于常规的调试需求就已经足够了。至于更高级的应用,肯定是多多益善。但是学习工具的目的就在于提高工作效率,没有必要为了技术而技术,技术永远都只是一种工具。不知道这个观点是否会被技术迷所鄙视,呵呵。不多废话了,言归正传。 查看运行时数据 在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是: print <expr> pr. 阅读全文
posted @ 2012-02-09 13:35 ~大器晚成~ 阅读(9019) 评论(0) 推荐(3) 编辑
摘要:闲话少叙,经过上篇文章的铺垫后,咱们趁热打铁,继续学习。 设置断点 break <function>在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。 break <linenum>在指定行号停住。 break filename:linenum在源文件filename的linenum行处停住 break filename:function在源文件filename的function函数的入口处停住 break *address在程序运行的内存地址处停住 break if i=100 表示当i为10 阅读全文
posted @ 2012-02-08 18:46 ~大器晚成~ 阅读(3509) 评论(3) 推荐(2) 编辑
摘要:今天介绍一下gdb,如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。 GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序的执行环境。 一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如: > c. 阅读全文
posted @ 2012-02-07 22:58 ~大器晚成~ 阅读(14828) 评论(0) 推荐(2) 编辑
摘要:上篇文章介绍了makefile的编写方法,相信大家有所收获。本文继续深入makefile,看看还有哪些高级用法可以大大提升我们的工作效率。本文是接着上篇博文——如何自己编写Makefile的,因此如果没有看过上篇文章的,建议先阅读一遍,以便更好地理解本文。 在规则中使用通配符 一个简单的例子 clean: rm -f *.o 表示删除所有.o文件,这很好理解。 print: *.c lpr -p $? touch print 表明print的生成依赖于所有.c文件,$?是一个自动化变量,以后会详细介绍。 文件搜寻 在一些大的工程中,有大量的源文件,我们通常的做法是把这许多... 阅读全文
posted @ 2012-02-06 09:48 ~大器晚成~ 阅读(13605) 评论(0) 推荐(5) 编辑
摘要:相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云。在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide。其实makefile并没有想象的那么难写,只要你明白了其中的原理,自己实践几次。你也可以自己写makefile,让别人对你头来羡慕的目光。 下面本人介绍一下自己的学习成果,初学阶段,欢迎大家多多指正。 简单的说,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至可以在makefile中执行shell脚本。makefile带来的好处就是——“自动化编译”,一旦... 阅读全文
posted @ 2012-02-05 15:33 ~大器晚成~ 阅读(138531) 评论(13) 推荐(23) 编辑
摘要:最近使用shell,用到的一些东西,很简单,也没有任何逻辑。写在这里只是为了帮助自己记忆,就当个凌乱的笔记了。希望对大家有所帮助,请多指教1 if else if [ $# -lt 5 ];then help exit 1 else do something... fi 其中 -lt 相当于 < -gt相当于> 2 while 下面的程序将循环执行101次,注意-ge为大于等于 x=100 while [ $x -ge 0 ] do something... ((x=x-1)) //此处特别注意,shell中的运算需要这样写 ... 阅读全文
posted @ 2012-02-02 15:27 ~大器晚成~ 阅读(1341) 评论(0) 推荐(1) 编辑
摘要:最近一直在使用Linux,积累了一些经验和使用技巧。废话不说,拿来和大家分享一下。1 查看文件的行数wc -l filepath2 文件排序sort -k1 -k2 -t " " -n -r filepath 上面的命令为按照第一列,第二列进行数字倒序排列文件记录,分隔符为\t。特别注意:当含有中文排序时,需要特殊指定LC_ALL=C进行排序。命令为 LC_ALL=Csort -k1 -k2 -t " " -n -r filepath3 查看当前进程ps ux4 查看进程占用资源情况top ctrl+c退出5 查看硬盘和内存df -h / free6 s 阅读全文
posted @ 2012-01-18 11:31 ~大器晚成~ 阅读(1022) 评论(0) 推荐(0) 编辑
摘要:转自:http://blog.csdn.net/liuxincumt/archive/2010/12/15/6076903.aspx经常遇到的exception是:PipeMapRed.waitOutputThreads(): subprocess failed with code N"OS error code 1: Operation not permitted" "OS error code 2: No such file or directory" "OS error code 3: No such process" &quo 阅读全文
posted @ 2012-01-13 18:20 ~大器晚成~ 阅读(5535) 评论(0) 推荐(0) 编辑
摘要:今天说说正则表达式。这可是写程序经常遇到的,也是一个程序员必须掌握的技术。其实不只是java,任何的技术任何的语言都离不开正则表达式,而且他们得形式都大同小异,基本上是一样的。下面先说说正则表达式,这里推荐一篇文章,http://blog.csdn.net/cping1982/article/details/1900808 其中详细的介绍了正则表达式的常用方法,可以说已经非常详细了。我就不多解释了。下面给出一些常用的正则程序:1 去除字符串两边的空格/***去掉字符串两边的空格*@paramres传入的字符串*@return去掉空格之后的字符串*/publicstaticStringTrimS 阅读全文
posted @ 2011-07-12 19:22 ~大器晚成~ 阅读(565) 评论(0) 推荐(1) 编辑
摘要:今天说说java中的pdf读取,实话说,这是一个很恼人的任务。现在网络上的pdf各种各样,分析出来的文本也是千差万别,目前最流行的jar包pdfbox也只能做到把文字分析出来,并无法很好的控制分析的顺序,格式,字体等信息。(也许可以,是我对pdfbox了解还不够,如果是这样的话,大家一定要告诉我~先谢过了哈。)这给后续的工作带来了很大的麻烦。比如我想提取pdf的一些关键词或标题等有用信息,而分析出来的文本大多没有规律可言,甚至不同pdf分析的顺序也不一样,有些分析出来第一行是标题,有些标题要到第十行甚至更靠后,总体说来这个任务远远没有达到我之前的预期。这里介绍一下,一个为了和大家交流一下,更重 阅读全文
posted @ 2011-07-08 22:09 ~大器晚成~ 阅读(11153) 评论(3) 推荐(0) 编辑
摘要:Java中的多线程经常被使用,而且功能还是比较强大的。下面来简单介绍一下。本人经常使用的多线程方式是去实现Runnable的run方法,然后在外面用start方法进行调用。这样感觉思路更清晰一些。好了,上代码,一看就明白了。比如我要设计一个线程A.代码如下:publicclassThreadAimplementsRunnable{/**(non-Javadoc)*@seejava.lang.Runnable#run()*启动线程 */publicvoidrun(){System.out.println("Astarted");}}OK,很简单吧。A线程定义完毕。下面进行A线 阅读全文
posted @ 2011-07-08 22:00 ~大器晚成~ 阅读(412) 评论(0) 推荐(0) 编辑
摘要:废话不多说,今天为大家带来java中下载网络资源的方法。Java中的下载,通常是使用HttpURLConnection类,这个类的功能也很强大,接下来让我们看看如何使用这个类吧~首先先介绍一下,本文讲到的下载资源分为两种:html源代码以及网络上的资源文件,他们的下载方式还是有一点区别的。1 下载html源代码首先说一下URL请求的两种方式:Get和PostPost与Get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。下图为本人使用firebug查看某网站post请求的截图从中可以看到,post参数包含5部分,拼接成字符串后为q=%E4%B8%AD%E6%9 阅读全文
posted @ 2011-07-04 22:13 ~大器晚成~ 阅读(1997) 评论(0) 推荐(0) 编辑