算法
文章平均质量分 81
dolphin98629
这个作者很懒,什么都没留下…
展开
-
对一道面试题的总结与扩展思考(关于一笔画问题的数学分析)
摘要前几天参加了一个公司的面试,其中被问到了一个题。面试官在纸上画了一个图形(具体图形见下文),问我能不能一笔画出这个图形,要求每条边必须只走一次,并且画的过程中笔不能离开纸。当时我没有试着去画 ,而是凭着自己图论方面的知识在几秒钟之内告诉面试官不可能做到,然后简单说了一下理由。面试结束后我翻阅了图论相关的资料,发现当时自己虽然给出了正确答案,但理由并不完全正确。昨天我花了几个小时仔细研究转载 2015-02-07 10:54:56 · 1724 阅读 · 0 评论 -
【啊哈!算法】算法11:堆——神奇的优先队列(上)
堆是什么?是一种特殊的完全二叉树,就像下面这棵树一样。 有没有发现这棵二叉树有一个特点,就是所有父结点都比子结点要小(注意:圆圈里面的数是值,圆圈上面的数是这个结点的编号,此规定仅适用于本节)。符合这样特点的完全二叉树我们称为最小堆。反之,如果所有父结点都比子结点要大,这样的完全二叉树称为最大堆。那这一特性究竟有什么用呢? 假如有14个数分别是9转载 2015-05-18 13:34:29 · 953 阅读 · 0 评论 -
【坐在马桶上看算法】算法8:巧妙的邻接表(数组实现)
之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M。对于稀疏图来说,M要远远小于N2。先上数据,如下。1234564 51 4 94 3 81 2 52 4 61转载 2015-05-18 13:31:20 · 640 阅读 · 0 评论 -
【坐在马桶上看算法】算法12:堆——神奇的优先队列(下)
接着上一Pa说。就是如何建立这个堆呢。可以从空的堆开始,然后依次往堆中插入每一个元素,直到所有数都被插入(转移到堆中为止)。因为插入第i个元素的所用的时间是O(log i),所以插入所有元素的整体时间复杂度是O(NlogN),代码如下。1234567n=0;for(i=1;i{转载 2015-05-18 13:36:21 · 921 阅读 · 0 评论 -
自己写的LinkList
#ifndef _C_ALG_COMMON_H_#define _C_ALG_COMMON_H_#include <string.h>#include <stdlib.h>#ifndef __cplusplus#define inline __inline#endif#ifdef __cplusplusextern "原创 2016-12-26 11:22:13 · 282 阅读 · 0 评论 -
自己写的Queue
CAlgQueue.h#ifndef _C_ALG_QUEUE_H_#define _C_ALG_QUEUE_H_#include #include #include "CAlgCommon.h"#ifdef __cplusplusextern "C" {#endiftypedef struct { unsigned int head; unsigned int ta原创 2016-12-26 12:25:29 · 447 阅读 · 0 评论 -
自己写的共享内存链表CAlgShareList
CAlgShareList.h#ifndef _C_ALG_SHARE_LIST_H_#define _C_ALG_SHARE_LIST_H_#include #include #include "CAlgCommon.h"#ifdef __cplusplusextern "C" {#endif#define ALG_SHARE_LIST_INVALID_POS (-1)原创 2016-12-26 12:27:30 · 1218 阅读 · 0 评论 -
自己写的共享内存hash链表
CAlgHashList.h#ifndef _C_ALG_HASH_LIST_H_#define _C_ALG_HASH_LIST_H_#include #include #include #include "CAlgShareList.h"#ifdef __cplusplusextern "C" {#endiftypedef struct{ unsigned in原创 2016-12-26 12:29:31 · 1598 阅读 · 0 评论 -
MySQL索引背后的数据结构及算法原理
下面是一位牛人写得关于数据库索引的精品之作,因为很好,不敢修饰,转载至此与博友共享。原文链接:MySQL索引背后的数据结构及算法原理本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree...转载 2018-04-13 13:50:42 · 178 阅读 · 0 评论 -
【坐在马桶上看算法】算法9:开启“树”之旅
我们先来看一个例子。 这是什么?是一个图?不对,确切的说这是一棵树。这哪里像树呢?不要着急我们来变换一下。 是不是很像一棵倒挂的树,也就是说它是根朝上,而叶子朝下的。不像?哈哈,看完下面这幅图你就会觉得像啦。 你可能会问:树和图有什么区别?这个称之为树的东西貌似和无向转载 2015-05-18 13:32:46 · 71 阅读 · 0 评论 -
【坐在马桶上看算法】算法7:Dijkstra最短路算法
上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”。本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径。 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下。转载 2015-05-18 13:29:09 · 479 阅读 · 0 评论 -
程序设计中的计算复用(Computational Reuse)
从斐波那契数列说起我想几乎每一个程序员对斐波那契(Fibonacci)数列都不会陌生,在很多教科书或文章中涉及到递归或计算复杂性的地方都会将计算斐波那契数列的程序作为经典示例。如果现在让你以最快的速度用C#写出一个计算斐波那契数列第n个数的函数(不考虑参数小于1或结果溢出等异常情况),我不知你的程序是否会和下列代码类似:public static u转载 2015-02-07 10:39:24 · 482 阅读 · 0 评论 -
【坐在马桶上看算法】算法2:邻居好说话:冒泡排序
简化版的桶排序不仅仅有上一节所遗留的问题,更要命的是:它非常浪费空间!例如需要排序数的范围是0~2100000000之间,那你则需要申请2100000001个变量,也就是说要写成int a[2100000001]。因为我们需要用2100000001个“桶”来存储0~2100000000之间每一个数出现的次数。即便只给你5个数进行排序(例如这5个数是1,1912345678,2100000000,1转载 2015-05-15 17:03:29 · 479 阅读 · 0 评论 -
【坐在马桶上看算法】算法3:最常用的排序——快速排序
上一节的冒泡排序可以说是我们学习第一个真正的排序算法,并且解决了桶排序浪费空间的问题,但在算法的执行效率上却牺牲了很多,它的时间复杂度达到了O(N2)。假如我们的计算机每秒钟可以运行10亿次,那么对1亿个数进行排序,桶排序则只需要0.1秒,而冒泡排序则需要1千万秒,达到115天之久,是不是很吓人。那有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。转载 2015-05-15 17:07:40 · 91 阅读 · 0 评论 -
【坐在马桶上看算法】算法4:队列——解密QQ号
新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问QQ号,小哈当然不会直接告诉小哼啦,原因嘛你懂的。所以小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则。规则是这样的:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数再放到这串数的末尾,再将第5个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一转载 2015-05-15 17:19:10 · 672 阅读 · 0 评论 -
【坐在马桶上看算法】算法5:解密回文——栈
上一节中我们学习了队列,它是一种先进先出的数据结构。还有一种是后进先出的数据结构它叫做栈。栈限定只能在一端进行插入和删除操作。比如说有一个小桶,小桶的直径只能放一个小球,我们现在向小桶内依次放入2号、1号、3号小球。假如你现在需要拿出2号小球,那就必须先将3号小球拿出,再拿出1号小球,最后才能将2号小球拿出来。在刚才取小球的过程中,我们最先放进去的小球最后才能拿出来,而最后放进去的小球却可以最先拿转载 2015-05-15 17:26:37 · 411 阅读 · 0 评论 -
【啊哈!算法】最快最简单的排序——桶排序
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ahalei.blog.51cto.com/4767671/1362789最快最简单的排序——桶排序 在我们生活的这个世界中到处都是被排序过的。站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照转载 2015-05-15 16:50:15 · 486 阅读 · 0 评论 -
【坐在马桶上看算法】算法10:二叉树
二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树。更加严格的递归定义是:二叉树要么为空,要么由根结点、左子树和右子树组成,而左子树和右子树分别是一棵二叉树。 下面这棵树就是一棵二叉树。 二叉树的使用范围最广,一棵多叉树也可以转化为二叉树,因此我们将着重讲解二叉树。二叉树中还有连两种特殊的转载 2015-05-18 13:33:16 · 448 阅读 · 0 评论 -
【坐在马桶上看算法】算法6:只有五行的Floyd最短路算法
暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。 上图中有4个城市8条公路,公路上的数字表示这条公路的长短。请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题这也被称为“多源最短路径”问题转载 2015-05-18 13:28:21 · 465 阅读 · 0 评论 -
用实例给新手讲解RSA加密算法
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助。 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Ri...转载 2019-01-08 14:02:36 · 432 阅读 · 0 评论