算法学习
文章平均质量分 67
kindlucy
这个作者很懒,什么都没留下…
展开
-
寻找主元素
之前问的一个问题http://topic.csdn.net/u/20100430/16/3a815617-9d6f-4945-b15c-14dfecfe4b23.html?seed=1361273005&r=65129463#r_65129463 一开始觉得寻找中位数的方法已经很不错了,后来又发现了一个更加简单的方法,果然大家都很厉害呢,集思广益,可以从大家这里学到很多考虑问题的方法。原创 2010-05-02 10:56:00 · 1222 阅读 · 0 评论 -
算法导论学习笔记-第十八章-B树
<br />第十八章B树<br /> <br />总结:本章介绍了B树,并介绍了B树中搜索,插入,删除,分裂的算法。<br /> <br />1. B树的定义<br />B树是与红黑树类似的一颗平衡查找树,但在降低磁盘I/O操作次数方面要更好一些。<br />B树的性质:<br />1) 每个节点x的域:<br />a) n[x],x中的关键字数,若x是B树中的内节点,则x有n[x]+1个子女。<br />b) n[x]个关键字本身,以非降序排列,key1[x]<=ke原创 2010-07-17 22:00:00 · 2311 阅读 · 0 评论 -
算法导论学习笔记-第五章-概率分析和随机算法
总结:这章由雇佣问题引出了概率分析和随机算法。概率分析一般用于确定一些算法的运行时间。而随机化算法用来强行使算法的输入符合某种概率分布,随机化算法的行为不仅由输入决定,还要由一个随机数生成器所生成的值来决定。 1. 概率分析可以利用指示器随机变量来进行概率分析,获得事件发生的期望值。 引理:给定样本空间S和S中的事件A,令XA=I{A},则E[XA]=Pr{A}原创 2010-05-22 00:25:00 · 1401 阅读 · 0 评论 -
算法导论学习笔记-第七章-快速排序
第七章 快速排序 总结:这章讲了快速排序的算法,分析了算法复杂性,又讲了快速排序的随机版 1. 快速排序PARTITION(A, p, r)将A[p…r]进行就地重排,返回q,其中A[p…q-1]中的元素都小于A[q],A[q+1,…r]中的元素都大于A[q]。QUICKSORT(A, p, r)递归排序分析:最坏情况O(n^2) 最好情况O(原创 2010-05-23 02:13:00 · 1112 阅读 · 1 评论 -
算法导论学习笔记-第六章-堆排序
第六章 堆排序 总结:这章主要讲了堆、建堆、堆排序、优先级队列等。 1. 堆堆可以被视为一颗完全二叉树,底层用数组实现。length[A]: 数组中的元素个数heap-size[A]: 存放在A中的堆的元素个数树的根A[1]给定某个结点的下标i:父节点PARENT(i)=[i/2]左节点LEFT(i)=2i右节点RIGHT(i)=2i+1最原创 2010-05-23 01:00:00 · 1995 阅读 · 1 评论 -
算法导论学习笔记-第八章-线性时间排序
总结:这章主要讲了非比较排序的几种算法,计数排序、基数排序、桶排序。 1. 排序算法时间的下届比较排序:排序结果中,各元素的次序基于输入元素间的比较。比较排序可以被抽象为决策树 定理:任意一个比较排序算法在最坏情况下,都需要做Ω(nlgn)次的比较。 2. 计数排序假设:n个输入元素中的每一个都是介于0到k之间的整数基本思想:对每一个输入元素x,原创 2010-05-23 19:31:00 · 979 阅读 · 0 评论 -
算法导论学习笔记-第九章-中位数和顺序统计学
<br />总结:这一章讲了找最大值、最小值的方法,介绍了以期望线性时间找第i小的数的方法,以及以最坏情况线性时间找第i小的数的方法。<br /> <br />1. 最大值和最小值<br />找最小值,遍历一遍即可<br />伪代码<br />MINIMUM(A)<br />min <- A[1]<br />for i <- 2 to length[A]<br /> do if min > A[i]<br /> then min <- A[i]<br />return m原创 2010-06-01 13:53:00 · 1179 阅读 · 0 评论 -
算法导论学习笔记-第十九章-二项堆
<br />第十九章二项堆<br /> <br />总结:这一章介绍了二项树、二项堆,并介绍了二项堆的搜索、删除、插入等操作,二项堆比二叉堆的优势就是二项堆的合并的复杂度只有O(lgn),而二叉堆合并的复杂度在最坏情况下有O(n),因此若进行合并操作,二项堆的性能就比二叉堆要好了。<br /> <br />1. 二项树<br />一个二项堆由一组二项树构成。<br />二项树是一种递归定义的有序树,二项树B0只包含一个结点,二项树Bk由两颗二项树Bk-1链接而成:其中一颗树的根是另一棵树的根的最左孩子原创 2010-08-07 18:57:00 · 2244 阅读 · 0 评论 -
算法导论学习笔记-第二十一章-用于不相交集合的数据结构
第二十一章用于不相交集合的数据结构总结:这一章讲了并查集的相关概念,以及主要的MAKE-SET, UNION, FIND-SET操作,并给出了并查集的链表表示和森林表示方式。1. 不相交集合上的操作不相交集合数据结构保持一组不相交的动态集合,每个集合通过一个代表来标识,代表即集合中的某个成员。一些操作:MAKE-SET(x): 建立一个新的集合,其唯一成员为x。UNION(x,y): 将包含x和y的动态集合合并为一个新的集合。FIND-SET(x): 返回一个指针,指向包含x的集合的代表。应用:例如,原创 2010-08-10 16:39:00 · 2211 阅读 · 0 评论 -
算法导论学习笔记-第二十章-斐波那契堆
<br />第二十章斐波那契堆<br /> <br />总结:这一章讲了斐波那契堆,它是一种比二项堆更松散的堆,它由一组无序的二项树组成,对不涉及删除元素的操作,它仅需O(1)的平摊运行时间。本章介绍斐波那契堆的插入、合并、删除等操作。<br /> <br />1. 斐波那契堆的结构<br />每个结点x的域:<br />1) 父节点p[x]<br />2) 指向任一子女的指针child[x]<br />3) 左兄弟left[x]<br />4) 右兄弟right[x]<br />5) 子女原创 2010-08-09 14:29:00 · 2378 阅读 · 0 评论 -
算法导论学习笔记-第二十三章-最小生成树
<br />第二十三章最小生成树<br /> <br />总结:这一章介绍了最小生成树,并介绍了找出最小生成树的两个算法,Prim算法和Kruskal算法,它们都用到了贪心策略。<br /> <br />1. 最小生成树<br />对无向连通图G=(V,E),对图中的每一条边(u,v)єE,都有一个权值w(u,v)。我们希望找出一个无回路的子集T包含于E,它连接了所有的顶点,且其权值之和w(T)=Σw(u,v)为最小。把确定T的问题称为最小生成树问题。<br /> <br />2. Kruska原创 2010-08-25 00:14:00 · 1467 阅读 · 0 评论 -
算法导论学习笔记-第四章-递归式
第四章 递归式 总结:这一章讲了三种解递归式的方法,代换法、递归树方法、主方法。 1. 代换法两个步骤:1) 猜测解的形式2) 用数学归纳法找出解真正有效的常数 2. 递归树画出一颗递归树来得到好猜测。在递归树中,每一个结点都代表递归函数调用集合中一个子问题的代价。我们将树中每一层内的代价相加得到一个每层代价的集合,再将每层的原创 2010-05-19 12:43:00 · 1825 阅读 · 2 评论 -
算法导论学习笔记-第十七章-平摊分析
<br />第十七章平摊分析<br /> <br />总结:平摊分析是一种用来分析执行一系列类似操作的算法的工具,它对整个操作序列的真实代价限界。本章介绍了平摊分析的三种方法,分别是聚集分析、记账方法、势能方法。每种方法都通过分析栈操作和二进制计数器增1来举例分析。最后,本章用平摊分析的方法分析了表动态扩张和收缩的代价限界。<br /> <br />1. 聚集分析<br />证明对所有的n,有n个操作所构成的序列的总时间在最坏情况下为T(n)。因此,每个操作的平均代价为T(n)/n<br /> <br原创 2010-07-14 23:29:00 · 3665 阅读 · 1 评论 -
寻找第i小的数
看了一下算法导论,上面介绍了一种从数组中找第i小的数的方法, 对应书上的RANDOMIZED_SELECT,这种算法在最坏情况下,复杂度为O(n^2),平均情况下,可以达到O(n)主要就是 对数组进行重新排列(类似于快排将数组按与一个数相比与之大还是小分开排),然后用递归找到第i小的数。 #include using namespace std;const int原创 2010-04-30 20:49:00 · 985 阅读 · 0 评论 -
算法导论学习笔记-第十一章-散列表
<br />第十一章散列表<br /> <br />总结:这一章讲了直接寻址表和散列表,并介绍了一些散列函数等。<br /> <br />1. 直接寻址表<br />直接将关键字作为数组下标。复杂度O(1)<br /> <br />2. 散列表<br />k->h(k)<br />降低了空间开销,会产生碰撞,解决碰撞的简单方法是链接法。<br />对链接法散列,平均情况下,复杂度也是O(1)<br /> <br />3. 散列函数<br />1) 除法散列法<br />h(k)=k mo原创 2010-07-01 10:08:00 · 1042 阅读 · 0 评论 -
算法导论学习笔记-第十二章-二叉查找树
第十二章二叉查找树总结:这章介绍了二叉查找树,介绍了获得某个节点的前驱、后继的方法,介绍了搜索、插入、删除等操作。1. 二叉查找树对一颗二叉查找树的任何节点,该节点的左子树中的任何一个节点的值都小于等于该节点的值,该节点的右子树中的任何一个节点的值都大于等于该节点的值。中序遍历二叉查找树,输出的序列是按序的。遍历操作的复杂度O(n)伪代码INORDER-TREE-WALK(x)if x!=NIL then INORDER-TREE-WALK(left[x]) pri原创 2010-07-01 22:02:00 · 1344 阅读 · 1 评论 -
算法导论学习笔记-第十三章-红黑树
第十三章红黑树总结:这章介绍了红黑树的性质、旋转,并详细介绍了红黑树的插入和删除。1. 红黑树的性质1) 每个节点或是红的,或是黑的2) 根节点是黑的3) 每个叶节点(NIL)是黑的4) 如果一个节点是红的,则它的两个儿子都是黑的5) 对每个节点,从该节点到其子孙节点的所有路径上包含相同数目的黑节点。黑高度:从某个节点x出发到大一个叶节点的任意一条路径上,黑色节点的个数称为该节点的黑高度,用bh(x)表示。红黑树是一种好的二叉查找树,对一棵有n个内节点的红黑树的高度至多为2lg(n+1),S原创 2010-07-03 19:44:00 · 1341 阅读 · 1 评论 -
一道关于字符串匹配的思考题
题外话:很多年前碰到的一道题了,那时候不会做,今天看《编程之美》的时候看到那篇算字符串相似度的题的时候,想到也应该来做一下那时没做出来的题了,而且计算字符串相似度的算法也正好可以用在那道题上。原题是什么我已经不记得了,反正就当我做的一道思考题吧: 题目:读取字符串s1和s2,其中s1是正常的单词,而s2中可能包含?和*s2中的?代表任意一个字符,*代表任意n个字符(原创 2010-05-10 23:27:00 · 886 阅读 · 0 评论 -
算法导论学习笔记-第十四章-数据结构的扩张
<br />第十四章数据结构的扩张<br /> <br />总结:这一章对红黑树进行扩张,介绍了顺序统计树和区间树。<br /> <br />1. 动态顺序统计<br /><br />顺序统计树:对红黑树中的每个节点都添加了一个域size[x],代表以节点x为根的子树的节点数(包含x)<br />size[x]=size[left[x]]+size[right[x]]+1<br /> <br />检索具有给定排序的元素:找出T中的第i个小的元素,调用OS-SELECT(T,i)<br />伪代码<br原创 2010-07-05 16:57:00 · 966 阅读 · 0 评论 -
算法导论学习笔记-第十五章-动态规划
<br />第十五章动态规划<br /> <br />总结:这一章通过装配线调度问题和矩阵链乘法问题引出了动态规划问题,并讨论了最长公共子序列以及最优二叉查找树问题。<br /> <br />1. 动态规划基础<br />动态规划主要用于解决最优化问题,它的步骤:<br />1) 描述最优解结构<br />2) 递归定义最优解的值<br />3) 按自底向上的方式计算最优解的值<br />4) 由计算出的结果构造一个最优解<br /> <br />动态规划的思想就是把问题分成若干个子问题,通过原创 2010-07-08 19:47:00 · 1046 阅读 · 0 评论 -
分层遍历二叉树
给定一颗二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一行要求访问的顺序是从左到右。《编程之美》中有递归和非递归的解法。递归解法的思路是,假设要求访问二叉树中第K层的节点,那么可以把它转换成访问以该二叉树根节点的左右节点为根的两颗左右子树的第K-1层的节点。依次递归下面程序是输出第K层的节点 int PrintNodeAtLevel(nod原创 2010-05-13 15:24:00 · 3544 阅读 · 0 评论 -
算法导论学习笔记-第十六章-贪心算法
第十六章 贪心算法总结:这一章通过活动选择问题引出贪心算法,讲了贪心策略的基本思想,并介绍了用了贪心策略的赫夫曼编码。1. 贪心策略的基本思想对有些最优化问题可以使用贪心算法来解决,贪心算法期望通过所做的局部最优选择来产生出一个全局最优解。但并不是所有最优化问题都可通过贪心算法来解决的。贪心算法的步骤:1) 将优化问题转化成这样的一个问题,即先做出选择,再解决剩下的一个子问题。2) 证明原问题总是有有一个最优解是做贪心选择得到的,从而说明贪心选择的安全。3) 说明在做出贪原创 2010-07-12 15:00:00 · 1782 阅读 · 0 评论 -
算法导论学习笔记-第二章-算法入门
第二章-算法入门 总结:这一章讲了插入排序及其算法分析,循环不变式的证明,合并排序(分治法)及其算法分析。 1. 插入排序类似于扑克牌的插入过程,设A[1...j-1]是排好序的一个数组,将A[j]插入A[1...j-1]中使A[j]称为排好序的一个数组,j 算法分析:最好情况,整个数组已经是顺序的了,O(n) 最坏情况,整个数组是逆序原创 2010-05-18 10:51:00 · 1517 阅读 · 2 评论 -
算法导论学习笔记-第二十二章-图的基本算法
第二十二章图的基本算法 总结:这一章讲了图的一些基本算法,例如广度优先搜索、深度优先搜索等,还介绍了拓扑排序、强连通分支等。 1. 图的表示G=(V,E)表示方法:邻接表、邻接矩阵邻接表:存储空间O(V+E)邻接矩阵:适合稠密图,存储空间O(V2)。还有一个优点,对邻接矩阵中的元素,可用二进位表示。 2. 广度优先搜索BFS对图中的顶原创 2010-08-20 00:10:00 · 1499 阅读 · 0 评论