算法
文章平均质量分 87
a60782885
这个作者很懒,什么都没留下…
展开
-
算法——查找之散列表
前面我们了解二叉树查找,虽然二叉树的查找已经很快了,但是仍然需要O(logn)的时间复杂度。我们能不能更快呢?我们就想到了一个方法,如果我们能够把所有查找的键转化为一个唯一的数字,那么我们就可以采用数组的形式来存放键和值,那么存取的速度就会非常快了,时间复杂度是O(1)。如果没有内存限制,我们可以做一个超大的数组来存放,那么所有查找都只需要一次访问就可以得到了。但是显然,我们并没有这么大的原创 2017-05-22 21:52:41 · 426 阅读 · 0 评论 -
平衡查找树之2-3树
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-2-3-Search-Tree.html 前面介绍了二叉查找树(Binary Search Tree),他对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。本文及后面文章介绍的平衡查找树的数据结构能够保证在最差的情况下也能达到lgN的效率,要实现这转载 2017-05-20 23:07:08 · 641 阅读 · 0 评论 -
算法——查找之二叉查找树
我们之前了解了二分查找,对于二分查找,仅仅盯着查找的话,二分查找确实是不错的。但是如果我们需要查找的数组,会改变呢?如果数组会改变,例如会删除其中某个元素,增加某个元素等。删除的话,如果需要删除的元素在数组的前面,那删除以后元素的移动又是一个很大的开销了。增加元素,也就是插入元素,需要再进行一次排序,开销也并不小。所以能不能在保持查找效率的同时,数组的修改的开销也不大的方法呢?这就提到了二原创 2017-05-19 13:27:09 · 593 阅读 · 0 评论 -
算法——查找之二分查找
对于查找,我们最容易想到的就是遍历了,但是当数组很大的时候,遍历查找的开销是很大的,时间复杂度是O(n)。而二分查找的开销就小了很多,时间复杂度是O(logn)。但是它是有前提条件的,数组必须是有序的。我们知道排序的时间复杂度是O(nlogn)。乍一看下去,似乎排序+二分查找的时间复杂度比顺序查找要大。但是我们排序是一次的,查找是多次的。例如查找n次的话顺序查找需要花费开销原创 2017-05-18 16:59:06 · 443 阅读 · 0 评论 -
算法——排序之堆排序
堆排序是一种基于堆的排序。要了解堆排序,首先我们要了解堆的特性。那么什么是堆呢?这里我们使用大顶堆,并且是二叉堆,且用数组实现的方式作为例子。在二叉堆的数组中,每个元素都要保证大于等于两个特定位置的元素,这里所说的特定位置,在树结构中就是它的子节点。所有节点都要满足上面所说的情况。如果我们画成二叉树的形式,我们就很容易理解了。可以看到,如果满足上面的特点的话,那么树的根节点原创 2017-05-17 15:51:39 · 375 阅读 · 0 评论 -
算法——图之加权有向图
这篇讨论加权有向图。加权有向图是在有向图的基础上,边的赋予权重信息的。加权有向图有很多应用。最典型的就是最短路径问题。我们日常生活中也经常遇到这种问题,例如从一个点出发,到达另外一个点,怎么过去才是最快的等等。而由于图的复杂性,最短路径问题并不十分的容易。例如,给定图的边的权重可能是负权重等。为了解决最短路径问题,我们首先要定义一种加权有向图的数据结构,良好的数据结构是成功原创 2017-05-27 15:26:17 · 21063 阅读 · 1 评论 -
算法——排序之快速排序
快速排序可能是应用最为广泛的排序算法了。应用广泛的主要原因是因为它实现简单,并且在一般应用中比其他算法要快得多。并且它具有良好的特性,他的时间复杂度是O(nlogn)。空间复杂度是O(1),也就是它可以进行原地排序,他只有递归调用产生的空间。原理:快速排序是一种分治的排序算法。他根据一个标杆元素,将一个数组分成两个部分,使得左边的部分的元素小于等于标杆元素,而右边的部分大于标杆元素。然后在原创 2017-05-16 20:02:34 · 857 阅读 · 0 评论 -
算法——图之加权图
加权图这里指无向加权图。加权图是一种为每条边关联一个权值或成本的图模型。也就是在无向图的基础上,每条边加上权值。加权图有很多应用,例如航空图中,边表示航线,权值表示距离或是费用。还能表示电路图,边表示导线,权值表示导线长度或是成本等等。在这些情形下,我们最感兴趣的当然是成本最小化,也就是最小生成树问题。最小生成树一副加权无向图的最小生成树(MST)是一棵权值之和最小的生原创 2017-05-25 19:32:55 · 18327 阅读 · 0 评论 -
算法——排序之归并排序
归并排序首先将数组分成两个(或两个以上)部分,分别进行排序,然后将这些有序的子数组归并起来。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子数组合并,得到完全有序的数组;即先使每个子数组有序,再使子数组间有序。归并排序最吸引人的是它能够保证任意长度为N的数组排序的时间和NlogN成正比。缺点是他需要的额外的空间也和N成正比。原创 2017-05-15 21:45:29 · 281 阅读 · 0 评论 -
算法——排序之简单排序
简单排序:直接选择排序冒泡排序直接插入排序希尔排序高级排序:归并快排堆排原创 2017-05-14 20:23:17 · 346 阅读 · 0 评论 -
算法——图之有向图
我们主要讨论一下方面:1.有向图的表示有向图的可达性有向图的路径2.判断有向图中是否有环拓扑排序,优先级限制下的调度问题3.有向图的强连通性有向图的可达性有向图的表示和无向图中的一样,我们也采用邻接表矩阵的方式来表示有向图。只需要修改addEdge方法,只增加一条边,而不是增加双向边就可以了。public class DiGraph原创 2017-05-24 20:02:43 · 7504 阅读 · 1 评论 -
算法——图之无向图
图的概念图是算法中是树的拓展,树是从上向下的数据结构,结点都有一个父结点(根结点除外),从上向下排列。而图没有了父子结点的概念,图中的结点都是平等关系,结果更加复杂。图的分类图可以分为无向图(简单连接),有向图(连接有方向),加权图(连接带权值),加权有向图(连接既有方向又有权值)。这篇讨论无向图。无向图的表示方法:1.邻接矩阵2.边的数组3.邻接表原创 2017-05-23 19:25:51 · 13507 阅读 · 0 评论 -
平衡二叉树之红黑树
前面一篇文章介绍了2-3查找树,可以看到,2-3查找树能保证在插入元素之后能保持树的平衡状态,最坏情况下即所有的子节点都是2-node,树的高度为lgN,从而保证了最坏情况下的时间复杂度。但是2-3树实现起来比较复杂,本文介绍一种简单实现2-3树的数据结构,即红黑树(Red-Black Tree)定义红黑树的主要是想对2-3查找树进行编码,尤其是对2-3查找树中的3-nodes节点添加额外的信息。红转载 2017-05-20 23:11:35 · 538 阅读 · 0 评论