数据结构与算法
cangchen
这个作者很懒,什么都没留下…
展开
-
【数据结构之二叉树】(三)B-树和B+树的应用:数据搜索和数据库索引
B-树 1 .B-树定义B-树是一种平衡的多路查找树,它在文件系统中很有用。定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树;⑵若根结点不是叶子结点,则至少有两棵子树;⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树;⑷所有的非终端结点中包含以下信息数据: (n,A0,K1,转载 2015-04-02 00:03:12 · 2588 阅读 · 0 评论 -
【算法之动态规划(二)】动态规划:从新手到专家
前言_我们遇到的问题中,有很大一部分可以用动态规划(简称DP)来解。解决这类问题可以很大地提升你的能力与技巧,我会试着帮助你理解如何使用DP来解题。这篇文章是基于实例展开来讲的,因为干巴巴的理论实在不好理解。注意:如果你对于其中某一节已经了解并且不想阅读它,没关系,直接跳过它即可。简介(入门)什么是动态规划,我们要如何描述它?动态规划算法通常基于一个递推公式及一个或多个初始状态转载 2015-04-14 17:31:17 · 2121 阅读 · 0 评论 -
【算法之动态规划(三)】动态规划算法之:最长公共子序列 & 最长公共子串(LCS),字符串相似度算法
1、先科普下最长公共子序列 & 最长公共子串的区别:找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。而最长公共子序列则并不要求连续。2、最长公共子串其实这是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"b转载 2015-04-14 17:40:24 · 1733 阅读 · 0 评论 -
【算法之链表(四)】在不使用额外节点存储空间的情况下,实现单链表逆序
下面来看一下很经典的“单链表逆序”问题。很多公司的面试题库中都有这道题,有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了额外的节点存储空间做中转,会得到一个比较低的分数。如何在不使用额外存储节点的情况下使一个单链表的所有节点逆序?我们先用迭代循环的思想来分析这个问题,链表的初始状态如图(1)所示:图(1)初始状态 初始状态,prev是N转载 2015-04-14 12:24:49 · 4218 阅读 · 0 评论 -
【算法之链表(三)】单链表中,在仅允许使用一个指针的情况下,在指定的节点前面插入以及删除一个节点
题目:在给定头结点的单链表中插入以及删除指定节点这个题目我们遇到这个问题的时候可能会想这个该怎么解,我们知道如果在一个已知的节点之后添加和删除一个节点的话很容易的,那么如何在给定的节点之前插入一个节点以及删除指定节点?因为如果想删除和插入一个节点的话,肯定是需要获取前面的一个节点的,但是根据题目所给的条件中,我们可以看到我们是不可能获取到前面的一个节点的,所以得另外去想转载 2015-04-14 12:10:03 · 1639 阅读 · 0 评论 -
【算法之动态规划(四)】动态规划笔试例题详解
转自:http://www.cnblogs.com/kkgreen/archive/2011/06/26/2090702.html终于来到了算法设计思想中最有趣的这部分,在去年的google笔试中,7道算法设计题有2道动态规划(Dynamic Programming)。看了这么久的算法,这部分也是唯一感觉到了比较难的地方,从这篇文章开始,将花连续的篇幅来讨论一些转载 2015-04-14 17:32:54 · 8169 阅读 · 0 评论 -
【算法之高效求素数】浅析求素数算法
注意: 如果没有特殊说明, 以下讨论的都是针对n为素数时的时间复杂度1. 根据概念判断:如果一个正整数只有两个因子, 1和p,则称p为素数.代码:bool isPrime(int n){ if(n < 2) return false; for(int i = 2; i < n; ++i) if(n%i == 0) return转载 2015-04-14 11:08:05 · 1008 阅读 · 0 评论 -
【算法之字符串(一)】KMP算法详解之下
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。也可参考KMP讲解视频: 十分钟详解KMP转载 2015-04-14 15:46:29 · 587 阅读 · 0 评论 -
【算法之链表(一)】判断单链表中是否有环、环的长度、环的入口节点,单链表的倒数第K个节点等
题目:给定一个单链表,只给出头指针head:1、如何判断是否存在环?2、如何知道环的长度?3、如何找出环的连接点在哪里?4、带环链表的长度是多少? 解法:1、对于问题1,使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。解析:如果以其它转载 2015-04-14 11:30:31 · 1639 阅读 · 0 评论 -
【算法之字符串(一)】KMP算法详解之上:适合初学KMP算法的朋友
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。也可参考KMP讲解视频: 十分钟详解KMP转载 2015-04-14 15:53:44 · 618 阅读 · 0 评论 -
【算法之数组(一)】求子数组最大和的解决方法详解
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。第一种方法:很容易想到的,就是使用双重循环:转载 2015-04-14 17:48:01 · 2453 阅读 · 0 评论 -
【算法之动态规划(五)】DP规划思想学习:从《算法导论》到《算法设计》
像所有的新手一样,对一种算法思想的理解需要经历从肤浅(流于表面形式)到逐渐触摸到本质的过程。为什么说逐渐触摸到本质,是因为很多时候你并不确定一个解释是不是最本质的,有时候会有好几个等价的解释,各自在不同的场景下具有。 动态规划经典题集转]动态规划与排列组合,比如对动态规划(DP)的理解,一开始我理解为递推,但实际上这是最肤浅的理解,对于如何在特定的问题中找到递推关系毫无帮助和。换言之,这转载 2015-04-14 17:46:35 · 1060 阅读 · 0 评论 -
【算法之常用排序算法(一)】八大常用内部排序算法(快排、冒泡、希尔、堆排序等)
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,转载 2015-04-01 23:09:32 · 4996 阅读 · 0 评论 -
【算法之链表(二)】判断两个链表是否相交并找出交点
题目:一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。首先来看一下如何判断两个链表是否存在相交的节点:思路:1、碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的。2、当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同。3转载 2015-04-14 12:04:50 · 3145 阅读 · 1 评论 -
【算法之动态规划(一)】动态规划(DP)详解
一、基本概念动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程原创 2015-04-14 17:09:20 · 38053 阅读 · 2 评论 -
【数据结构之二叉树】(二)B+树比B树更适合做文件索引的原因
原因:相对于B树,(1)B+树空间利用率更高,可减少I/O次数, 因为B+树的内部节点只是作为索引使用,而不像B-树那样每个节点都需要存储硬盘指针。 也就是说:B+树中每个非叶节点没有指向某个关键字具体信息的指针,所以每一个节点可以存放更多的关键字数量,即一次性读入内存所需要查找的关键字也就越多,减少了I/O操作。 e.g.假设磁盘中的一个盘块容原创 2015-04-01 23:54:58 · 4565 阅读 · 0 评论 -
【数据结构之二叉树】(一)B树、B-树、B+树、B*树介绍,和B+树更适合做文件索引的原因
今天看数据库,书中提到:由于索引是采用 B 树结构存储的,所以对应的索引项并不会被删除,经过一段时间的增删改操作后,数据库中就会出现大量的存储碎片,这和磁盘碎片、内存碎片产生原理是类似的,这些存储碎片不仅占用了存储空间,而且降低了数据库运行的速度。如果发现索引中存在过多的存储碎片的话就要进行“碎片整理”了,最方便的“碎片整理” 手段就是重建索引, 重建索引会将先前创建的索引删除然后重新创建索引转载 2015-04-01 23:29:10 · 7827 阅读 · 3 评论 -
【算法之常用排序算法(二)】常用排序算法性能比较,及常见面试题
各种排序方法的性能比较:排序法平均时间最坏情况最好情况稳定度额外空间备注1.直接插入O(n2)O(n2)O(n)稳定O(1)大部分已排序时较好(简单)1.希尔O(nlogn)转载 2015-04-09 17:29:43 · 1291 阅读 · 0 评论