代码改变世界

随笔分类 -  Algorithm

红黑树并没有我们想象的那么难(下)

2013-09-29 16:22 by 捣乱小子, 4026 阅读, 收藏, 编辑
摘要: 上、下两篇已经完成, 希望能帮助到大家.红黑树并没有我们想象的那么难(上):http://daoluan.net/blog/?p=2057红黑树并没有我们想象的那么难(下):http://daoluan.net/blog/?p=2112SGI STL map 实现概述根据上一节的红黑树分析, 结合 sgi stl map 的实现, 看看红黑树的源码是如何实现的. 以下主要以代码的注释为主. sgi stl map 底层实现是_Rb_tree类, 为了方便管理,_Rb_tree 内置了_M_header, 用于记录红黑树中的根节点, 最小节点和最大节点. 在插入删除中都会对其进行维护. 找到一. 阅读全文

红黑树并没有我们想象的那么难(上)

2013-09-26 11:01 by 捣乱小子, 39785 阅读, 收藏, 编辑
摘要: <红黑树并没有我们想象的那么难> 上、下两篇已经完成, 希望能帮助到大家. 红黑树并没有我们想象的那么难(上) 红黑树并没有我们想象的那么难(下) 红黑树并没有想象的那么难, 初学者觉得晦涩难读可能是因为情况太多. 红黑树的情况可以通过归结, 通过合并来得到更少的情况, 如此可以加深对红黑树的理解. 阅读全文

最长回文子串(Longest Palindromic Substring)

2013-07-05 15:39 by 捣乱小子, 13089 阅读, 收藏, 编辑
摘要: 一个「对称」的序列,就可称为回文序列,譬如:aba,abba 等。详细介绍参看:http://zh.wikipedia.org/wiki/%E5%9B%9E%E6%96%87%E6%95%B0最长回文子串问题是要求在给出的一个序列中,找到最长的回文字串。譬如:一个序列 cabccba,它的最长回文子串是 abccba。暴力暴力穷举可以解决问题。三个循环穷举所有可能的序列。for i in range(0,len(str)) for j in range(i,len(str) is_palindromic_number(i,j)//这里有个循环但算法的复杂度是... 阅读全文

面试题:把负数移动到正数之前,不能改变正负数原先的次序

2013-05-03 14:58 by 捣乱小子, 2560 阅读, 收藏, 编辑
摘要: 如:-5,7,1,9,-12,15 变成 -5,-12,7,1,9,15。如何解?题目要求:空间复杂度O(1),时间复杂度O(N),排序稳定。空间上只能利用循环变量,标记变量等;时间上可以说是过一遍数组就完事了。分治用分治可以解决问题:首先把规模为 N 的问题划分成两个规模近似为 N/2 的子问题,两个子问题得到解决后进行合并得到整个问题的答案。对于本篇的问题,主要考虑合并该怎么解决,也就是假设:将数组 arr 分成 arr1 和 arr2。设 arr1 为 [----++++],arr2 为 [------+++],如何得到 arr 为 [----------+++++++]。显然,只要将 阅读全文

【字符串匹配】KMP算法之道

2012-06-14 00:58 by 捣乱小子, 2287 阅读, 收藏, 编辑
摘要: 修订于2012-06-18,心急的读者可以着重看“有趣的字符串匹配提示”,这个例子看懂了,KMP也就差不多了。闲话上午算法考试的时候,感觉OK,前一两星期幸好把图算法都吃透了一遍,复习的时候节省了时间:)。前一半考题不理解背书的都可以,有几题没记过,不靠谱地照着理解写下来。最后的吹水题让我想起了之前的比赛,有一题是曹老师给的实验题,刚好比赛上出现了,而且相似度极高。要是高考,曹老师可就红了:)。这也让我捡了便宜。我们校区2012的招生计划出来了,结果我们校区悲催到只招30个法语本科生,也就是说2012的本科孩子只有30人。不知道法语的怎么看,但对这个校区的未来,我是看不到什么希望。“坑爹啊.. 阅读全文

【图论】信手拈来的Prim,Kruskal和Dijkstra

2012-05-30 23:53 by 捣乱小子, 8201 阅读, 收藏, 编辑
摘要: 关于三个简单的图论算法 prim,dijkstra和kruskal三个图论的算法,初学者容易将他们搞混,所以放在一起了。 prim和kruskal是最小生成树(MST)的算法,dijkstra是单源最短路径的算法。 prim 最小生成树prim算法采用了贪心策略:把点分成两个集合,A为已被处理(已经在最小生成树中)的顶点,B为待处理的顶点,(A,B)也就是一个割。若边(u,v)满足u∈A,v∈B,那么(u,v)就是通过割(A,B)的一条边。 很自然的,会有一定数量的边会通过该割,其中权重最小的边就是轻边。 什么是轻边? 左边集合和右边集合就组成一个割,其中边... 阅读全文

【图论】拓扑排序应用

2012-05-22 23:52 by 捣乱小子, 4865 阅读, 收藏, 编辑
摘要: 拓扑排序虽是一种排序,但是它跟平时所接触的sort或者qsort不同,排序的意义不同。拓扑排序针对有向无回路图(DAG)而言的,不应用与存在回路的有向图。【图论】广度优先搜索和深度优先搜索 有说到了BFS和DFS,拓扑排序是DFS的一个应用。有向无回路图能说明事件的发生的先后的顺序。比如穿衣服,士兵排队等。一个具体的例子,有N个物体,下面给出物体的重量比较,比如(a,b)表示a比b重等等,问已给出的条件是否会矛盾?其实就是判断用所给条件所组织的一个图中是否会存在环?在DFS中加入时间戳,完成DFS后让节点按第二时间戳排序,就得到了DAG的拓扑排序结果。【图论】有向图是否存在环 拓扑排序还可以解 阅读全文

【图论】广度优先搜索和深度优先搜索

2012-05-18 09:23 by 捣乱小子, 38206 阅读, 收藏, 编辑
摘要: 写在最前面的两种图的遍历算法在其他图的算法当中都有应用,并且是基本的图论算法。广度优先搜索广度优先搜索(BFS),可以被形象的描述为“浅尝辄止”,具体一点就是每个顶点只访问它的邻接节点(如果它的邻接节点没有被访问)并且记录这个邻接节点,当访问完它的邻接节点之后就结束这个顶点的访问。广度优先用到了“先进先出”队列,通过这个队列来存储第一次发现的节点,以便下一次的处理;而对于再次发现的节点,我们不予理会——不放入队列,因为再次发现的节点:无非是已经处理完的了;或者是存储在队列中尚未处理的。《算法导轮》对两种搜索都采用了很聪明的做法,用白色WHITE来标志未发现的节点,用灰色GRAY来标志第一次被发 阅读全文

背包问题(01背包,完全背包,多重背包)

2012-05-06 18:27 by 捣乱小子, 48302 阅读, 收藏, 编辑
摘要: 写在最前面的近日为以下琐事烦身: 差不多要向学院提交项目申请了,本来是想做个多模式的IM系统的,可是跟往届通过审核的项目比起来,缺乏创新和研究价值,所以在文档上要多做手脚,花点心思。 一大堆的作业,每每期中都是这样。 一直想读的DirectUI开源代码一直没有进展下去。 准备五月底的软件设计比赛。魔... 阅读全文

《编程珠玑,字字珠玑》910读书笔记——代码优化

2012-04-15 13:39 by 捣乱小子, 4897 阅读, 收藏, 编辑
摘要: 写在最前面的 再庞大复杂的代码编译器都能接受,编译器会变得越来越聪明,让我们原本的代码更加高效。但是代码执行的多变与不可预测性,如果编译器大肆“优化”,偶尔或者大胆的说“在大多数情况下”,会得到“聪明反被聪明误”的后果,所以编译器非常小心谨慎,一遇到不可预测后果的优化,它就会立即折返,停止这一步的优化工作,因为它不知道程序员的本意是什么,“它怕得罪你”。 程序员要编写容易优化的代码,以帮助编译器扫清障碍。关于代码优化,笔者特别喜欢《深入理解计算机系统》一书中的第五章,有兴趣的可以阅读一下。代码优化小剖代码优化的方法总结了5种。 将函数展开,即内敛函数,以优化函数的调用。 《从简单的算法初探过. 阅读全文

《编程珠玑,字字珠玑》45678读书笔记——编程技巧

2012-04-06 21:03 by 捣乱小子, 2931 阅读, 收藏, 编辑
摘要: 写在最前面的 就像上一篇文章说的,“编程永远是后话”!在有了可靠的问题分析过程和数据结构的选择,能正确运行的“二分搜索”代码出现之前,把其主要的思路先在草稿上实现,即伪代码。但由于伪代码执行结果的不确定性,需要有一个验证的过程。笔者非常不喜欢这个过程,因为这个过程很繁琐,而且推出的结论不一定是正确的(毕竟没有实实在在在机器上运行得到正确的结果),在笔者看来,给一个算法题,知道用什么算法,数据结构,如果能用伪代码实现,离成功已经不远了。 但后来我又反驳了自己的观点(矛盾体啊),理由:至少到目前为止,写的都是小程序、小算法题,验证过程可能已经被潜移默化解决了。实战演练:动态规划矩阵连乘... 阅读全文

《编程珠玑,字字珠玑》1234读书笔记——多路归并排序

2012-03-29 12:49 by 捣乱小子, 5189 阅读, 收藏, 编辑
摘要: 写在前面的2012年3月25日买下《编程珠玑》,很期待但不知道它能给我带来什么! 编程珠玑,字字珠玑。但是翻译有点拗口,有时候整句话读下来都不知道在讲什么,多少有点掩饰了珠玑的魅力,真怀疑是不是直接有道翻译了。位图数据结构法在“开篇”的里,讲述了排序的一个问题,大意就是,对一个“最多占n位的(就是n位的整数),随机的,无重复的(互异无序)”的整数序列进行排序,那么这个序列的总长度len#include#include#include#includeusingnamespacestd;#defineMAX10000//总数据量,可修改#defineMAX_ONCE2500//内存排序MAX_ON 阅读全文

基于顺序表哈夫曼树

2011-11-12 10:59 by 捣乱小子, 2407 阅读, 收藏, 编辑
摘要: 基于顺序表创建赫夫曼树说明:赫夫曼树在信息传输上有很多的用途,刚刚学习二叉树,就遇上了赫夫曼,在学习算法的时候学到了不少的的东西。代码实现: 1//哈弗曼节点数据结构2structHuffmanNode//数据结构的设计是本赫夫曼的一大败笔,我居然用了里面的很多东西我居然用了指针。3{4intweight;5chardata;6HuffmanNode*leftChild,*rightChild,*parent;7HuffmanNode():leftChild(NULL),rightChild(NULL),parent(NULL){}8HuffmanNode(intelem,HuffmanNod 阅读全文