自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 递归

递归的定义是:A function defined in terms of itself is called recursive. 也就是说一个函数的定义需要用到这个函数的本身。递归是一个很奇妙的思想,从上面的定义看去,递归貌似一个死循环,这个当然是不对的,递归总会有一个结束的条件,也就是基准情况,这个基准情况规定了递归什么时候结束。下面来看一个例子:计算阶乘n! = n*(n-1)*...*

2013-11-29 16:10:32 955 1

原创 字符串的模式匹配

0) 引论这里主要想讨论一下字符串的模式匹配,主要是KMP算法。假设我们有一个字符串S,称之为原始串;另一个字符串T,称之为模式串;字符串匹配是指找出原始串S中是否含有模式串T,如果含有,则返回S中第一个匹配项的位置;例如S=“abcabcabdef”;T=“abcabd”;那么我们可以得到S中含有模式串T,我们返回S中第一个匹配项的位置,即3。1) Brute-Force

2013-11-25 08:31:59 1174

原创 选择排序

选择排序也是一种非常简单的排序算法,它的思想是:依次找出无序数组中的最小值,然后把它放到已排序的数据的后面。算法的时间复杂度为O(N^2)。另外选择排序是不稳定的。排序算法的不稳定是指,当待排序的数组中有相等元素时,当运行排序算法后,这组相等元素的位置发生改变,则称算法为不稳定的。当然稳不稳定对最终结果没多大意义1) 例子未排序序列:【39,28,51,62,78,9,25,36】

2013-11-24 11:56:02 697

原创 冒泡排序(BubbleSort)

这里来介绍一个应该算是最简单的排序算法--冒泡排序。冒泡排序的思想就是一次比较两个元素,如果元素的顺序错误,就交换着两个元素的位置,重复这一步骤直到没有错误的顺序为止。因为冒泡排序会使值比较小的元素从底部一步步的向上,知道顶部,就像小气泡从水中向上冒一样,因此取名冒泡

2013-11-24 11:31:17 812

原创 快速排序(Quicksort)

0)引论人如其名,快速排序之所以称之为快速排序就是因为在实践中,这个算法是最快的排序算法。它的平均运行时间为O(NlogN)。最坏的时间复杂度为O(N^2)。虽然像堆排序,归并排序的时间复杂度比较低,但是他们的实际运行时间并不比快速排序快,反而由于有一些拷贝的进程,使运行时间变得很慢。快速排序也是一种divide-and-conquer策略。1)快速排序基本步骤:a) 如果数据集S中的

2013-11-21 20:37:19 3944

原创 归并排序(MergeSort)

Merge是左堆哪里引入的一个概念,意思是把两个堆合并成一个堆。这里我们把归并的思想引入到排序中,通过把两个已排序的数据表合并来对数据进行排序。堆排序利用了递归的思想,它的最坏时间复杂度为O(NlogN)。如下图所示,由上图可知,归并排序需要3个游标,每个游标指向数组的起始位置,通过比较A[Aptr]与B[Bptr]的大小,然后将较小的值拷贝到数组C中,然后进行相应的游标的位置移动

2013-11-21 15:04:50 2088

原创 堆排序

0)引论这里我们介绍一下堆排序。堆是一种优先队列,它的性质很简单:树的最小值在根节点上,对于子树依旧成立。因此堆排序的思想也就明确了:把数据以堆的方式存储,然后依次输出根节点。这样就可以把数据按照从小到大的顺序排列出来了。如果需要从大到小排列,则只需要在构建堆的时候,使树的根节点为最大值就可以了。由堆的性质我们可以得出,堆排序的时间复杂度为O(NlogN)。1)堆排序由引论知道,我

2013-11-21 09:34:54 1066

原创 希尔排序(Shellsort)

0) 引论希尔排序时Donald Shell于1959年发明的一种改进插入排序的排序算法。对于插入排序我们知道,要想打破插入排序的时间界,那么必须要交换向距离比较远的元素。希尔排序通过引入增量序列,首先排序距离较远的元素,大大缩小逆序的数量,进而提高了插入排序的执行效率。1) 希尔排序希尔排序利用一个增量序列,h1,h2,...,ht,任何增量序列只需要满足h1=1即可。在使用增量hk

2013-11-20 21:22:35 1267

原创 插入排序

0)引论下面的几篇要集中整理一下排序算法。排序算法有很多种,思想各不相同,时间复杂度也不一样。这里先对要排序的数据做一些约束:1)待排序的数据存放在数组中,且索引为从0开始2) 待排序的数据均为正数之所以有这两个约束是为了简化算法,非整数数据只需做些许改动即可应用。下面介绍一种相当简单的排序----插入p

2013-11-20 16:53:52 978

原创 不相交集(The Disjoint Set ADT)

0)引论不相交集是解决等价问题的一种有效的数据结构,之所以称之为有效是因为,这个数据结构简单(几行代码,一个简单数组就可以搞定),快速(每个操作基本上可以在常数平均时间内搞定)。首先我们要明白什么叫做等价关系,而在这个之前要先有一个关系(relation)的定义Relation:定义在数据集S上的关系R是指,对于属于数据集S中的每一对元素(a,b),a R b要么是真要么是假。如果a

2013-11-19 10:03:05 10508 3

原创 深度学习之autoencoder

1)autoencoderautoencoder是一种无监督的学习算法,他利用反向传播算法,让目标值等于输入值。如图所示:Autoencoder尝试学习一个 的函数。也就是说autoencoder尝试逼近一个恒等函数,使得输出接近于输入 。当然为了使这个函数有意义,需要加入一些限制条件(比如说限制隐藏神经元的数目),就可以发现一些有意义的结构。Autoencoder可

2013-11-12 22:00:02 68580 13

原创 二项队列

0)引论左堆的合并,插入,删除最小的时间复杂度为O(logN)。二项队列就是为了对这些结果进一步提高的一种数据结构。利用二项队列,这三种操作的最坏时间复杂度为O(logN),但是插入的平均时间复杂度为O(1)。1)二项队列二项队列不是一棵树,它是一个森林,由一组堆序的树组成的深林,叫做二项队列。二项队列有几个性质比较重要(a) 每一颗树都是一个有约束的堆序树,叫做二项树(b

2013-11-09 22:54:15 9367 9

原创 左堆(Leftist Heaps)

0)引论为什么要提出左堆这么一个概念呢?有了二插堆还不够么。这是因为前面提到的数据结构在支持合并(merge)操作的时候是比较差的。比如对于一个二叉查找树来说,要把两个二叉查找树合并,那么可能需要把一个二叉树的结点一个一个的插入到另一个二叉树中,这个的时间消耗是一个很恐怖的事情。因此我们引入左堆。1) 左堆的一些基本概念零路径长(null path length)Npl(X):结点X到

2013-11-09 16:09:32 5754

原创 Priority Queue(Heaps)--优先队列(堆)

0)引论前面已经有了链表,堆栈,队列,树等数据结构,尤其是树,是一个很强大的数据结构,能做很多事情,那么为什么还要引进一个优先队列的东东呢?它和队列有什么本质的不同呢?看一个例子,有一个打印机,但是有很多的文件需要打印,那么这些任务必然要排队等候打印机逐步的处理。这里就产生了一个问题。原则上说先来的先处理,但是有一个文件100页,它排在另一个1页的文件的前面,那么可能我们要先打印这个1页的文件

2013-11-09 13:44:53 33176 10

原创 哈希(Hashing)

0)引论哈希(Hashing)是以一种能以常数平均时间进行插入,查找,删除的技术。常数时间一般意义上是指O(1)。是的,Hashing是一种技术,从英文名也可以看出,这是动名词,一般动名词大多表示的不是一个静态的东西。就像抽象数据结构(ADT),ADT是一系列的操作的集合。而不应该是一般以为的抽象的一种数据结构。可见不同语言的表示以及翻译是一件很重要的事情。扯远了,回到正题。不同于二叉

2013-11-07 11:50:14 10270

原创 伸展树

伸展树是一种相对简单的树结构,它保证从空树开始任意M次对树的操作最多花费O(MlogN)的时间。这种保证并不能排除某次操作的时间为O(N)的可能,但是能保证每次操作平均的时间为O(logN)。对于一系列的操作,有的可能花费时间多些,有的少些。伸展树基于这样的一个事实:“对于时间花费为O(N}的二叉树操作是可以接受的,只要这种操作相对比较不频繁发生。”对于一个二叉查找树,可能有的操作

2013-11-05 20:02:45 1242 1

原创 AVL树

前面介绍了二叉查找树,二叉查找树的平均时间复杂度为O(logN),是相当低的,因此是一种非常优异的模型。但是这只是对一个随机输入的二叉查找树有效(平衡的二叉树)。当我们进行一定次数的插入(或删除)后,可能会导致二叉树不平衡,甚至退化成链表,这样会重新使时间复杂度变为O(logN).为此,引入AVL树。AVL树是Adelson-Velskii和Landis于1962年发明的自平衡二叉树。在一个二

2013-11-05 15:49:46 1076

原创 B 树

0)引论大多数的查找树都是二叉树,这个可以理解,因为二叉树相对来说比较简单,易行,用递归方式编程也较易实现。这里介绍一种非二叉的树,即B树。1)B树一个M阶的B树,应该具有以下的性质:(1)根节点要么是叶子,要么具有2-M个子节点(2)非叶节点(根节点除外)具有[M/2]-M个子节点(3)所有的叶节点具有相同的深度(4)所有的数据都存储在叶节点上也就是说与二叉树不同

2013-11-04 21:46:28 887

原创 二叉树

0)首先回顾一些树的基本概念:根节点(root):没有父亲的结点。树叶(leaf):没有儿子的结点。路径(path):是一个结点到另一个结点的序列表示,这些结点都应该是父子关系。路径的长(length): 路径上边的条数。为序列个数减一。深度(depth):根结点到某一结点的唯一路径的长。高(height):某一结点到树叶的最长路径的长。如图所示:  树的遍

2013-11-04 10:46:42 911

原创 队列

队列与堆栈不同,队列是一边进,另一边出的表,如下图所示:队列的主要操作也比较少,主要的有入队,出队,检查队列是否为空,队列一般会有两个标志位,即Front和Rear,表示对头和队尾,通过对这两个标志位进行操作,可以对队列进行适当的操作。0) 链表声明与实现struct QueueModel{ int Capacity; int Front; int Re

2013-11-02 22:49:32 904

原创 堆栈

堆栈就是插入和删除都在一个方向的一种表的数据结构,也就是所谓的“先进后出”,其实就像一个瓶子,只有一面是能够打开的,要想拿出最里面的东西,就要先吧上面的东西移开。下图形象的显示了什么是堆栈。其实这个图说明了一切                                                                                  对堆栈的操作比

2013-11-02 20:01:17 930

原创 链表

链表由一系列不必再内存中相连的结构组成,每一个结构都含有表元素和指向该元素后继元的结构的指针。这个是定义,看着比较晕。其实链表就是一个表,表中有两个内容,一个是一些基本元素,另外一个是指针,顺着这个指针,可以找到下一个表。如图所示:链表分有头结点的链表,和没有头结点的链表,上图是有头结点的链表,没有头结点的链表就是把头部分去掉。即一般来说带有头结点的链表比较常用,在检查是否

2013-11-02 16:18:39 979

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除