【算法】
Kevin_Leong
这个作者很懒,什么都没留下…
展开
-
堆与堆排序
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。先说说什么是堆,堆通常是一个可以被看做一棵树的数组对象。满足下列性质:1.堆中某个节点的值总是不大于或不小于其父节点的值;2.堆总是一棵完全树(完全树就是叶结点仅在层次最大的两层出现的树)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那原创 2014-02-22 22:44:43 · 1255 阅读 · 0 评论 -
排序:插入排序
插入排序,基本上就是我们平时打牌,拿牌排序的算法了。具体表现如下:具体代码:void Insertsort1(int a[], int n){ int i, j, k; for (i = 1; i < n; i++) { //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置 for (j = i - 1; j >= 0; j--)原创 2014-02-24 09:45:34 · 815 阅读 · 0 评论 -
排序:一些排序的总结
稳定性所谓稳定排序,就是相等的两个数,排序前是什么顺序,排序后也是什么顺序。比如a=1,b=3,c=1,a,b,c这3个数进行排序,a本来在c前面,如果能保证排序后,a还是在c前面,就是稳定排序,否则就是不稳定排序。内外排序我们一般提到排序都是指内排序,比如快速排序,堆排序,归并排序等,所谓内排序就是可以在内存中完成的排序。RAM的访问速度大约是磁盘的25万倍,我们当然希望如果原创 2016-07-01 09:43:51 · 737 阅读 · 0 评论 -
树:一些关于树的面试题
之前讲了树,也讲了其基本的操作。现在看看关于树的一些面试题面试题:重建二叉树题目:输入某二叉树的序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出图2.6所示的二叉树并输出它的头结点。二叉树结点的定义如下:struct Binary Tree Node{ int m_nVa原创 2014-02-25 00:40:00 · 3458 阅读 · 0 评论 -
链表:链表环问题总结
之前写了篇关于链表的博客,突然想起以前遇到的一些关于链表环问题的情况。所以赶紧百度了一下,现在作一下整理。给定一个单链表,只给出头指针h:1、如何判断是否存在环?2、如何知道环的长度?3、如何找出环的连接点在哪里?4、带环链表的长度是多少?1、如何判断是否存在环?对于问题1,使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fa...原创 2014-02-24 18:01:02 · 1635 阅读 · 0 评论 -
排序:选择排序
顾名思义,选择排序是通过每一趟从待排序的数据元素中选出最小(或最大)的一个元素,然后顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。相同的元素排序后可能位置不同。排序实例初始关键字 [49 38 65 97 76 13 27 49]第一趟排序后 13 [38 65 97 76 49 27 49]第二趟排序后 13 27 [65 97原创 2014-02-24 10:16:30 · 853 阅读 · 0 评论 -
链表:链表简单介绍
整理一下硬盘里关于链表的知识,温故而知新。链表是一种物理存储单元上非连续、非顺序的存储结构。其特点是有头尾结点,除头结点外,其它结点都只有一个前驱,除尾结点外,其它结点都只有一个后继。常见的链表有单向链表,双向链表,循环链表。单向链表的结构一般这样写typedef struct listnode{ int val; struct listnode *next;}...原创 2014-02-22 21:29:18 · 1222 阅读 · 0 评论 -
树:AVL树
AVL树得名于它的发明者。AVL树是带有平衡条件的二叉查找树。这个平衡条件必须要容易保持,而且它须保证树的深度是O(logN)。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树本质上还是一棵二叉搜索树(因此读者可以看到我后面的代码是继承自二叉搜索树的),它的特点是:1. 本身首先是一棵二叉搜索树。 2.原创 2016-06-22 18:30:24 · 783 阅读 · 0 评论 -
树:Treap树
我们知道,二叉查找树相对来说比较容易形成最坏的链表情况,所以前辈们想尽了各种优化策略,包括AVL,红黑,以及今天要讲的Treap树。Treap树是什么?treap是heap和tree结合,中文名叫树堆。首先它每个节点有2个值value和weight,其中只看weight的话,满足heap二叉堆的特性(父亲比儿子都小/大),只看value的话,满足排序二叉树特性(以左儿子为根的子树元原创 2016-06-23 10:42:50 · 728 阅读 · 0 评论 -
树:伸展树
我们知道AVL树为了保持严格的平衡,所以在数据插入上会呈现过多的旋转,影响了插入和删除的性能,此时AVL的一个变种,伸展树(Splay)就应运而生了,我们知道万事万物都遵循一个“八二原则“,也就是说80%的人只会用到20%的数据,比如说我们的“xx输入法”,平常打的字也就那么多,或许还没有20%呢。在伸展树上的一般操作都基于伸展操作:假设想要对一个二叉查找树执行一系列的查找操作,为了使原创 2016-06-23 11:08:42 · 618 阅读 · 0 评论 -
树:Trie树
Trie树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。补充下,trie也可以用于做基于词典的敏感词检测。还有就是适合路由时ip地址的最长前缀匹配。原创 2016-06-23 14:34:13 · 501 阅读 · 0 评论 -
树:B树、B+树、B*树
B树B-tree树即B树,B即Balanced,平衡的意思。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是另一种树。而事实上是,B-tree就是指的B树。B树是主磁盘或其他直接存储辅助存储设备而设计的一种平衡查找树,B树与红黑树类似。但在降低磁盘I/O操作次原创 2016-06-23 17:01:35 · 995 阅读 · 0 评论 -
排序:快速排序
像合并排序一样,快速排序也是基于分治模式的。下面是对一个典型子数组A[p..r]排序的分治过程的三个步骤:分解:数组A[p..r]]被划分成两个(可能空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每个元素都小于等于A(q),而且,小于等于A[q+1..r]中的元素。下标q也在这个划分过程中进行计算。解决:通过递归调用快速排序,对子数组A[p..q-1]原创 2013-10-11 15:27:48 · 883 阅读 · 0 评论 -
生产者-消费者问题
生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。先说说同步和互斥的概念同步是一种时序关系,即A处理完事情1后,B才能处理事情2,经典的同步问题是生产者和消费者间的同步。互斥描述的是一种独占关系。如任一时刻,A和B中只能有一个写文件file。原创 2014-02-27 09:40:08 · 1387 阅读 · 0 评论 -
一些算法总结
排序内部排序和外部排序根据排序过程中涉及的存储器不同,可以讲排序方法分为两大类:一类是内部排序,指的是待排序的几率存放在内存中进行的排序过程;另一类的外部排序,指的是排序中要对外存储器进行访问的排序过程。插入排序适用于少量数据的排序,时间复杂度为O(n^2)。堆排序时间复杂度为O(N*logN)。堆排序是就地排序,辅助空间为O(1)。原创 2016-06-10 17:28:55 · 673 阅读 · 0 评论 -
链表:约瑟夫环问题
这是我遇到的第一个真正的算法,数据结构应用问题。这也是老大问了我这问题很多天后,我才恍然,原来这叫约瑟夫环问题。这是我查找链表时,发现的。长话短说,说说这上午的总结。约瑟夫环问题主要分两种, 第一种问题的描述是:N个人按顺时针围成一个圈,从1到N,然后报数,报到M的人就出去,然后剩余的人仍然围成一个圈,从出局的人下一个人开始重新报数,到M的人出局,如此循环。 第二中问题的描述唯一的不同...原创 2012-07-22 10:37:34 · 3681 阅读 · 0 评论 -
队列:循环队列
今天说说队列。认识队列这东西很久了,但一直都没有用到。就知道是基本的数据结构。在百度和google和一段时间思考后,我选用了循环队列。从百度可以得知:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。大概就像这幅图那样。声明头和尾变量,如果是入队就尾+1,出队头+1。因为循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针...原创 2012-07-12 10:56:10 · 1106 阅读 · 0 评论 -
编写一些代码,确定一个变量是有符号数还是无符号数(c专家编程摘录)
有一位同事在接受Microsoft面试时,其中一个题目就是“编写一些代码,确定一个变量是有符号数还是无符号数”。这实际上是一个相当难的问题,因为它留下了太多的空间让你去理解这个问题。有些人错误地把“有符号数”同“具有负号”等同起来,以为这个问题只需要一个小小的函数或宏,测试变量的值是否小于零就可以了。问题自然没有这么简单。要回答这个问题,你必须在特定的编译器中确定一个给定的类型是有符号数还是无原创 2013-10-08 17:19:30 · 2095 阅读 · 0 评论 -
树:二叉树
之前写了一些链表和排序的blog,其中有说到多链表,堆,其中提到了一种特殊的数据结构:树。人们发明树结构,用于储存和搜索海量的数据。树的种类无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树;有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树;二叉树:每个节点最多含有两个子树的树称为二叉树;完全二叉树:二叉树的所有子树要么没有原创 2014-02-24 11:13:19 · 1606 阅读 · 1 评论 -
递归
按我理解,递归就是不停地调用自身,到一定的临界条件后得出结果。按照百度的说法,递归一般用于解决三类问题: (1)数据的定义是按递归定义的。(Fibonacci函数) (2)问题解法按递归算法实现。(回溯) (3)数据的结构形式是按递归定义的。(树的遍历,图的搜索)递归的缺点: 递归算法解题相对常用的算法如普通循环等,运行效原创 2012-08-13 22:45:57 · 922 阅读 · 0 评论 -
树:红黑树
红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是原创 2016-06-23 17:24:10 · 567 阅读 · 0 评论