随笔分类 - 数据结构与算法
摘要:bubblesort insrtionsort selectionsort mergesort bucketsort countingsort radixsort heapsort tournametsort A 快速排序: mergesort的计算量和难点在于合,而quicksort在于分 B轴点
阅读全文
摘要:Boyer-Moore 只做这些失败的匹配,就可以排除掉相应的对齐位置。在BM算法中,模式串P与文本串T的对准位置依然自左向右移动,而在对准位置确是自右向左的逐一比对各个字符串,具体的,在每一轮自右向左的比对过程中,一旦发现失配。 在后面位置获得的教训,可以帮助我们排除更多的匹配。
阅读全文
摘要:示例: 1.夜间门诊 2.多任务操作系统 3.Huffman编码 A 问题模式: 循优先级访问(call by priority), 按照这种优先级通过调度器将最高优先级的元素输入给服务端。 B 操作接口: template <typename T>struct PQ { virtual void
阅读全文
摘要:一、词典的引入 循value(数值)访问,其代表为hashing(散列) 当使用数组来存储电话号码时,可以按秩访问,对应的时间效率为O(1),但是问题在于要存储的电话号码的数量是极大的,可达到100M(北京市),但是我们经常用到的只是其中一个非常小的子集(清华大学),所以其空间效率极低。 N <<
阅读全文
摘要:问题: 能否进一步提高,比如总体O(n+h)、单版本O(1)? 答案是可以!! 相邻的版本之间的差异不能超过O(1),显然AVL树的删除操作不能满足这一点,因为当每次删除一个节点后,有可能自底而上,逐层引发多大logN次的旋转。 所以要用到红黑树: 红黑树所具有的规则: 对红色节点做一次提升变换:
阅读全文
摘要:一、B-树:有趣且有用 1.1 设计和实现B-树的动机: 弥合不同存储不同存储级别之间在访问速度上的巨大差异,实现高效的I/O。 学完B-树之后会发现比尔盖茨这句短视且武断的话是千真万确的真理?稍后揭晓。 1.2 存储容量增长太慢了 分级存储是解决需要较多存储器的方法,在由内存与外村组成的二级存储系
阅读全文
摘要:AVL树 如何判断平衡? 在AVL的意义下的适度平衡,凭借什么判断一颗树是在AVL意义下的平衡。 平衡因子 AVL的节点个数与树的高度满足以下两种关系: 进一步变形: AVL树的接口: AVL树新插入一个节点,只可能导致新插入节点的若干个祖先失衡,而不会导致非祖先的其它节点失衡。其原因在于,对于非插
阅读全文
摘要:Search Tree 如果比喻作人,AVL树就如同那种时时刻刻小心翼翼且谨慎的类型。这一节,我们寻找一种更为宽松的准则,让我们变成潇洒的人。下面介绍这节的猪脚伸展树。 逐层伸展: 使得v的高度逐层上升: 实例:节点上升的过程是一个不断伸展,左右摇摆的过程。 一步一步往上爬这种策略,显然比较低效。哎
阅读全文
摘要:二叉搜索树 若既要求对象集合的组成可以高效率的动态调整,同时也要求能够高效率的查找。 通过对二分查找策略的抽象与推广,定义并实现二叉搜索树结构,基于半线性的树形结构,正是后续内容的立足点和出发点。 二叉搜索树为我们同时实现高效的静态操作以及动态操作提供了基础。 将Binary Search Tree
阅读全文
摘要:一、非线性结构:图 图由顶点集V,集合规模为n,在n个顶点之间可能存在对应关系,我们用连边来描述这种,即边E,规模为e。 邻接关系:顶点与顶点之间的关系;关联关系:顶点与它相连的边的关系。序列结构(vector和list)是图的一种特例,只有相邻点之间才可以定义临接关系,而树结构只有父节点和子节点之
阅读全文
摘要:善于利用之前的轮子:将半线性的二叉树转换成线性结构 一、先序遍历 递归格式: 递归栈中的每一帧都是具有通用格式的,但显然当递归到深处时,帧的格式应该足够小。 将递归格式转换为栈格式: 迭代的思路如下所示: 沿着左侧链(总是沿着左侧孩子分支不断下行的一条链)不断展开 先序遍历:顶而下的依次访问左侧链上
阅读全文
摘要:一、vector和list的不足:无法兼顾静态操作和动态操作的性能 二、半线性结构:树 层次关系的表示 RPN表达式: 1 2 + 3 + 域名系统 、大学系统 rooted tree (有根树),子树(subtree) ri称为r的孩子(child),ri之间互称为兄弟(sibling)。r为其父
阅读全文
摘要:一、队列的性质 FIFO(First in first out)先进先出。 入队和出对操作:
阅读全文
摘要:一、strtol()函数 参数介绍: str -- 要转换为长整数的字符串。 endptr -- 对类型为 char* 的对象的引用,其值由函数设置为 str 中数值后的下一个字符。 base -- 基数,必须介于 2 和 36(包含)之间,或者是特殊值 0。 根据指定的进制(2~36进制或者0),
阅读全文
摘要:L 二、栈的动作: 结合函数调用栈的机制介绍一般函数调用的实现方式与过程,并将其推广到递归调用。 以降低空间复杂度的目标为线索,介绍通过显式的维护栈的结构解决应用问题的典型方法和技巧。 利用栈结构,实现基于试探回溯策略的高效搜索算法。 基于轮值策略的通用循环分配器,并以银行窗口服务为例实现基本的调度
阅读全文
摘要:选择排序 一篮子苹果,从小到大,排序:先从中选出最大的一个苹果,接着选出次大。。。。’ bubbleSort其实也是一个不折不扣的selectsort,只不过它每次移动时采用小步慢跑方式构成,其效率太低。 二、举例: 可看出只需要交换一次: 三、实现:
阅读全文
摘要:Don't lost link! list与vector不同之处在于元素的物理地址可以任意。 为保证对列表元素访问的可行性,逻辑上互为前驱和后继的元素之间,应维护某种索引关系。这种索引关系,可抽象地理解为被索引元素的位置(position),故列表元素是“循位置访问”(call-by-positio
阅读全文
摘要:一、算法思路: 分治策略:向量与列表通用 序列一分为二 // O(1) 子序列递归排序 // 2 x T(n/2) 合并有序子序列 // O(n) 二、举例如下: T(n) = 2*T(n/2) + O(n) T(n) = O(nlog(n)) 利用替换法即可求解;其中O(n)是归并两个已排序子序列
阅读全文
摘要:冒泡排序: 一、标准冒泡排序 二、改进一 每一趟扫描交换,都记录是否存在逆序元素。 举例如下: 一旦经过某趟扫描之后,未发现任何逆序的相邻元素,即意味着排序任务已经完成,则通过返回标志“sorted”,以便算法即使终止。 改进的过程如下: 跳过红色的部分,直接跳转到尾部。 二、改进二: 绿色代表无序
阅读全文
摘要:在C++语言中,递归调用(recursive call)就是某一方法调用自身。这种自我调用通常是直接的,即在函数体中包含一条或多条调用自身的语句。递归也可能以间接的形式出现,即某个方法首先调用其它方法,再辗转通过其它方法的相互调用,最终调用起始的方法自身。 递归的价值在于,许多应用问题都可简洁而准确
阅读全文

浙公网安备 33010602011771号