Algorithms
文章平均质量分 77
hustyangju
这个作者很懒,什么都没留下…
展开
-
单链表的头结点和结点
大家都知道单链表是由头结点和0~n个结点构成,头结点和结点的数据类型相同,都是自定义的结点数据类型:这里定义一种:typedef struct LNode{ElemType data;LNode *next;}LNode, *LinkList;重点来了:虽然头结点和结点的数据类型相同,但是他们又有很大区别。(1)作用不同单链表虽然是单向的,但涉及到单链表操原创 2013-11-08 17:47:07 · 1747 阅读 · 0 评论 -
hash实现--开放寻址方式
原文:http://blog.csdn.net/aa2010aa/article/details/4908113转载 2014-11-25 10:12:10 · 1373 阅读 · 1 评论 -
算法经典书籍推荐
原文:luoypeng.blog.163.com/blog/static/47275404201182293012142/学计算机的人是幸福的,因为在这个领域中有如此多的通俗易懂(相对来说)的经典好书,你需要做的只是坚持把它们一本一本读下去而已。在这里列出一些我看过或者准备看的算法书籍,以供参考。 1. CLRS 算法导论 算法百科全书,只做了前面十几章的习题,便感觉受益无穷。转载 2015-01-12 10:54:00 · 1314 阅读 · 0 评论 -
斐波那契堆(fibonacci heap)基础
斐波那契堆是由一组最小堆有序树组成,其中的每棵树都必须符合最小堆属性。 简单点,斐波那契堆是由一组有点特别的树组成。除了两个与元素删除有关的 操作(EXTRACT-MIN和DELETE)之外,它的其它操作都能在常数时间内完成。可 以看下斐波那契堆和二叉堆的运行时间对比表:斐波那契堆的特点:不涉及删除元素的操作有O(1)的平摊时间。 Extract-Min和Delete的数目和其它相比较小时原创 2015-03-04 11:07:17 · 2452 阅读 · 0 评论 -
深度优先算法、广度优先算法 与 图的遍历
/***********************************/深度优先算法/***********************************/和树的遍历相似,若从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph)。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。图的遍历顺序有两种:深度优先搜转载 2015-03-20 09:31:43 · 2811 阅读 · 0 评论 -
最小生成树算法
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。克鲁斯卡尔(Kruskal)算法(只与边相关)算法描述:克鲁斯卡尔算法需要对图的边进行访问,所以克鲁斯卡尔算法的时间复杂度只和边又关系,可以证明其时间复杂度为O(eloge)。原创 2015-03-10 16:58:35 · 1291 阅读 · 0 评论 -
动态规划:从新手到专家
March 26, 2013作者:Hawstein出处:http://hawstein.com/posts/dp-novice-to-advanced.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。前言本文翻译自TopCoder上的一篇文章: Dynami转载 2015-03-18 08:50:51 · 544 阅读 · 0 评论 -
KMP字符串模式匹配详解
感谢原作者的努力:http://blog.csdn.net/a_b_c_abc/article/details/536925KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。一. 简单匹配算法先来看一个简单匹配算法的函数:int Index_BF ( char转载 2015-03-24 09:26:48 · 936 阅读 · 0 评论 -
稳定排序与不稳定排序
这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相转载 2015-04-13 20:53:32 · 501 阅读 · 0 评论 -
c/c++ 数据结构之位图(bitmap)详解
1. 概述位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用。本文介绍了位图的实现方法及其应用场景。2. 位图实现(1)自己实现在位图中,每个元素为“0”或“1”,表示其对应的元素不存在或者存在。#define INT_BITS sizeof(int)#define SHIFT 5 // 2^5=32#define MASK原创 2015-07-23 15:17:48 · 12098 阅读 · 2 评论 -
使用bitmap处理海量数据
bitmap是一个十分有用的结构。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位电话号码扩展:bloom filter可以看做是对原创 2015-07-23 15:43:09 · 933 阅读 · 0 评论 -
BloomFilter——大规模数据处理利器
loom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 一. 实例 为了说明Bloom Filter存在的重要意义,举一个实例: 假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。为转载 2015-07-23 15:59:43 · 476 阅读 · 0 评论 -
带‘.‘和’*‘的字符串匹配
’.‘代表一个任意字符a’*‘代表0~n个a测试两个字符串是否匹配#include #include using namespace std;bool matchCore(const char* str,const char* pattern){ if(*str=='\0' && *pattern=='\0') return true; if(*原创 2015-09-01 17:16:27 · 664 阅读 · 0 评论 -
红黑树和AVL树的比较
1. 红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。 红黑树能够以O(log2 n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构,能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统原创 2014-05-27 16:41:40 · 17895 阅读 · 1 评论 -
动态规划(DP)算法
一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能转载 2014-06-04 11:03:25 · 1438 阅读 · 0 评论 -
stack and queue
1 stack栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。栈的基本运算有六种:构造空栈:InitStack(S)、判栈空: StackEmpty(S)、判栈满: StackFull(S)、进栈: Push(S,x)、可形象地理解为压入,这时栈中会多一个元素退栈: Pop(S) 、 可形象地理解为弹原创 2013-12-15 14:35:53 · 930 阅读 · 0 评论 -
递归式求解
算法设计中经常会用到递归,利用递归式的方法可以清晰地显示算法的整个过程,而对于分析算法的复杂度,解递归式就有了用处,这里的方法来自于《算法导论》。1. 代换法代换法只能用于解那种很容易猜的情形,它可用来确定一个递归式的“O”和“Ω”界。举例,确定递归式 T(n) = 2*T(└n/2┘) + n 的一个“O”界1.1 先猜测有某个界存在由于这个递归式与合并排序的计算原创 2014-05-07 11:01:46 · 1346 阅读 · 0 评论 -
连续子序列最大和问题的四种经典解答
问题描述 给定(可能是负的)整数序列A1, A2,...,AN, 寻找(并标识)使Sum(Ak)(k >=i, k <= j)的值最大的序列。如果所有的整数都是负的,那么连续子序列的最大和是零。原创 2014-05-07 20:47:57 · 6160 阅读 · 0 评论 -
堆 的取最值删除操作和插入操作
堆的删除按定义,堆中每次都只能删除第0个数据。为了便于重建堆,实际的操作是将最后一个数据的值赋给根结点,然后再从根结点开始进行一次从上向下的调整。调整时先在左右儿子结点中找最小的,如果父结点比这个最小的子结点还小说明不需要调整了,反之将父结点和它交换后再考虑后面的结点。相当于从根结点将一个数据的“下沉”过程。堆的插入每次插入都是将新数据放在数组最后。可以发现从这个新原创 2014-05-08 15:59:46 · 1274 阅读 · 0 评论 -
堆排序算法分析
1 大堆和小堆(max-)原创 2014-05-08 14:20:39 · 1121 阅读 · 0 评论 -
插入排序(insert_sort)与 并归排序(merge_sort) 算法分析
(一)插入排序算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素原创 2014-05-09 13:53:05 · 2933 阅读 · 0 评论 -
计数排序(counting_sort) 算法分析
线性排序的一种(时间复杂度为(n))计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。计数排序的特征当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用原创 2014-05-09 14:56:05 · 2201 阅读 · 0 评论 -
链接法(chaining)构建散列表(hash table)(C++实现)
散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过把键值通过一个函数的计算,映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。一个通俗的例子是,为了查找电话簿中某人的号码,可以创建一个按照人名首字母顺序排列的表(即建立人名x到首字母F(x)的一个函数关系),在首原创 2014-05-14 15:53:52 · 4101 阅读 · 0 评论 -
C++实现二叉搜索树的常用操作
实现操作(1)二叉搜索树的建立(2)二叉搜索树的插入(3)二叉搜索树的三种递归遍历(前序、中序和后续)(4)二叉搜索树的三种非递归遍历(前序、中序和后续)(5)二叉搜索树的逐层打印有时间再实现:(6)二叉搜索树的前驱和后继查找(7)二叉搜索树的删除源码分析:#include #include #include using namespace st原创 2014-05-16 15:21:31 · 1964 阅读 · 0 评论 -
快速排序 与 随机快速排序 算法分析
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序的优点:(1)原址排序,空间复杂度较小。(2)虽然最坏情况下(有序数组)原创 2014-05-09 10:33:48 · 3981 阅读 · 0 评论 -
快速选择(quick_select) 算法分析
快速选择算法,就是从给定的一个集合S={a1,a2,...an}中选出第K个大小的数,或者给出其所在的下标之类的。如果使用排序,比如merge_sort,然后返回第K个元素的下标,复杂度是O(NlogN)如果使用heap_sort,或者优先队列,则复杂度是O(NlogK)如果使用quick _sort的一个变种,叫 quick select,则平均复杂度为O(N),最坏复杂原创 2014-05-09 15:48:07 · 11913 阅读 · 0 评论 -
链表的C++实现
有的时候,处于内存中的数据并不是连续的。那么这时候,我们就需要在数据结构中添加一个属性,这个属性会记录下面一个数据的地址。有了这个地址之后,所有的数据就像一条链子一样串起来了,那么这个地址属性就起到了穿线连结的作用。链表有:单链表,双链表,单循环链表,双循环链表。理解单链表,其他几种也就大同小异。 相比较普通的线性结构,链表结构的优势是什么呢?我们可以总结一下: (1)原创 2014-05-13 10:11:47 · 1315 阅读 · 0 评论 -
拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序执转载 2015-09-06 16:47:33 · 496 阅读 · 0 评论