
算法与数据结构
鸭脖
爱学习
展开
-
B树查找,磁盘查找数据
【B~树】 B~树,又叫平衡多路查找树。一棵m阶的B~树 (m叉树)的特性如下:1) 树中每个结点至多有m个孩子;2) 除根结点和叶子结点外,其它每个结点至少有[m/2]个孩子;3) 若根结点不是叶子结点,则至少有2个孩子;4) 所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息(可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为nu转载 2012-04-21 12:54:40 · 1679 阅读 · 0 评论 -
算法题24 根据上排给出十个数,在其下排填出对应的十个数
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个数如下: 【0,1,2,3,4,5,6,7,8,9】举一个例子, 数值: 0,1,2,3,4,5,6,7,8,9 分配: 6,2,1,0,0,0,1,0,0,0 0在下排出现了6次,1在下排出现了2次, 2在下排转载 2012-12-16 15:41:25 · 1022 阅读 · 0 评论 -
分割金条
你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你的工人付费? 解题思路: 本题实质问题是数字表示问题。由1、2两个数字可表示1-3三个数字。由1、2、4三个数字可表示1-7七个数字(即1,2,1+2,4,4+1,4+2,4+2+1)。由1、2、4、8四个数字可表示1-15十五个数字。依此类推。转载 2012-12-16 16:00:29 · 1801 阅读 · 0 评论 -
微软面试题--三个灯泡--三个开关
这是一道微软用来测试应聘者的试题。它主要考察受训者的逻辑思维和判断能力,同 时也给受训者一些关于问题解决方法上的启示。游戏规则和程序1.有两个房间,一间房里有三盏灯,另一间房有控制着三盏灯的三个开关,这两个房间是 分割开的,从一间里不能看到另一间的情况。2.现在要求受训者分别进这两房间一次,然后判断出这三盏灯分别是由哪个开关控制的。3.有什么办法呢?相关讨论1.请受转载 2012-12-16 15:50:07 · 14160 阅读 · 0 评论 -
判断单链表是否存在环,判断两个链表是否相交问题详解
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题:1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如何找到环的入口点?解答:一、判断链表是否存在环,办法为:设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fas转载 2012-12-16 16:22:43 · 881 阅读 · 0 评论 -
中缀表达式的计算,C++版本,Linux环境
今天在ubuntu下用c++写了中缀表达式的计算,并且用g++编译链接好。写了一个makefile命令。如果有需要可以从我的资源中下载。原创 2013-01-16 20:21:48 · 698 阅读 · 0 评论 -
最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
堆有最大堆和最小堆之分,最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树。最小堆便是每个节点的值都 设有n个元素的序列{k1,k2,...,kn},当且仅当满足下列关系时,称之为堆。 堆的三种基本操作(以下以最大堆为例): ⑴最大堆的插入 由于需要维持完全二叉树的形态,需要先将要插入的结点x放在最底层的最右边,插入后满 足完全二叉树转载 2013-05-03 15:59:22 · 1271 阅读 · 0 评论 -
排序算法——快速排序
快速排序是对冒泡排序的一种改进。为什么这么说呢?想一下冒泡排序,我们是把轻的往上面冒,参照的是某一个位置上的,这个位置是我们认为规定的从底部依次往上数。而快速排序的这个位置是我们随机选择的或者选中间,选取方法也是一种算法,算法书上有介绍。然后拿这个位置上的元素作参照,比他大就往下沉,比他小就往上升。然后再交换元素。所以它也是基于交换元素的。然后它还是递归的。说到这个算法我觉得我应该想到原创 2013-05-05 19:01:52 · 819 阅读 · 0 评论 -
排序算法——冒泡排序
冒泡排序的核心是将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。记忆的时候,你就把数组头部朝下放着,然后从底部开始往上冒泡。但是为了好编程,并不是盯着那一个泡泡不放的,而是反正最原创 2013-05-05 18:02:47 · 836 阅读 · 0 评论 -
排序算法——插入排序
插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。 注意是已经排序的数据中的适当位置。也就是说,每一步的插入都是往已经排好序的子数组中插入新的值。该算法的时间复杂度也是O(n^2),精确的说是O(n(n-1))下面是我写的一个程序:void insertSort(int* a,int n){for(int i=原创 2013-05-05 18:22:17 · 616 阅读 · 0 评论 -
排序算法——简单选择排序
简单选择排序的基本思想是:从剩下元素的集合中,不断选出最小或最大的元素,加入已排序的子序列中。算法的最差和最好情况下的时间复杂度都是O(N^2)下面看一下我们的程序:void selectSort(int* a,int n){int small;for(int i=0;ismall=i;for(int j=i+1;jif(a[j]small = j;原创 2013-05-06 11:46:42 · 627 阅读 · 0 评论 -
求子数组的最大和问题
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个活多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度是O(n).这道题目如果没有时间复杂度的限制的话,那一分钟便可以写出来。因为三层for循环,使用穷举法,便可以直接求的最大值。这样的话时间复杂度就是N^3,但是如果是O(N)的话,那么就必须要求只有一次for循环。那么应该组织原创 2012-11-09 17:11:55 · 622 阅读 · 0 评论 -
使用回溯算法解决N皇后问题以及间隔排列问题
回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。在编程中,最容易出错的地方,便是迭代和递归。那么回溯便是这两种方法的结合。按照我的理解,使用回溯法需要心中有结构。回溯这个词用的很形象,按照人的理解就是往后走,但是原创 2012-11-01 14:27:26 · 2139 阅读 · 0 评论 -
Prim算法精讲
对Prim算法有了新的理解,现在此总结一下。我们现在主要讲的是实现部分。Prim算法是基于MST性质所构造的算法。MST就是最小生成树一定包含U和V-U之间的轻边。(参见上一篇日志),所以Prim算法的核心还是设计一种程序,使得能够不断的找出最小生成树点集和未加入最小生成树点集之间的轻边。这个按照我们人的思维的话确实很好做。我们来举一个例子吧。看下面的图:我们的原点原创 2012-06-09 14:50:18 · 1294 阅读 · 0 评论 -
MST性质的证明
什么是MST?MST就是Most Small Tree,应该就是最小生成树的意思吧,具体不是很清楚,MST性质就是最小生成树性质(以下简称MST性质),我们在看最小生成树的算法的时候,很多情况下都有关于这条性质的说明,比如,历史上最经典的Prim算法和Kruskal算法就是根据这个性质演算出来的Algorithm,MST性质的声明如下:最小生成树性质:设G=(V,E)是一个连通网络,U是顶转载 2012-06-09 11:46:31 · 7609 阅读 · 3 评论 -
贪心法和动态规划法的区别
动态规划和贪心算法的区别动态规划和贪心算法都是一种递推算法 均用局部最优解来推导全局最优解 不同点: 贪心算法: 1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。 2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。 动态规划算法: 1.全局最优转载 2012-06-10 11:21:48 · 14066 阅读 · 3 评论 -
矩阵连乘算法精讲
今天看了好久的矩阵连乘算法,总算有了一点头绪,现在来细细总结一下。首先我们知道的是,矩阵连乘算法是一种动态规划法,那么和多段图和弗洛伊德算法一样,它也体现了动态规划法的特点。像弗洛伊德算法,它的动体现在每加进一个节点,那么d和path者两个二维表都会发生相应的变化,且朝着全局最优解的方向去变化。那么矩阵连乘算法其实也是一样的。这里面也用到了两个二维表,分别是m和s。弗洛伊德算法其实和dijks原创 2012-06-10 16:02:30 · 3363 阅读 · 0 评论 -
二叉树——高度
编写一个程序来计算二叉树的高度:使用递归来实现上述目的,代码如下所示:int depth(BTree *b){ int dep1, dep2; if(b==NULL) return 0; else{ dep1 = depth(b->left); dep2 = depth(b->right); ret原创 2012-06-10 16:08:30 · 706 阅读 · 0 评论 -
迪杰斯特拉算法感悟
今天又看了一便迪杰斯特拉算法,从非编程的角度上把这个算法又理解了一遍。其实这样来看的话,迪杰斯特拉算法和普利姆算法以及侧路斯卡尔算法刚开始的操作都是将点集分为U和V-U,这样的话便是在两个点集之间进行操作。迪杰斯特拉算法主要是这么做的:它不断的从d中找出边权值最小,而且尚未加入U的点,加入之后,再重新计算d和path的值,注意这里只计算那些V-U中的点,因为已经加入U的点和源点之间的距离已经是最小原创 2012-06-11 11:08:47 · 4353 阅读 · 0 评论 -
二叉树----宽度计算
#define M 10 //假设二叉树最多的层数 int Width(BinTree T) { int static n[M];//向量存放各层结点数 int static i=1; int static max=0;//最大宽度 if(T) { if(i==1) //若是访问根结点 { n[i]++; //第1层加1原创 2012-06-12 12:59:35 · 4815 阅读 · 0 评论 -
二叉树----宽度计算
#define M 10 //假设二叉树最多的层数 int Width(BinTree T) { int static n[M];//向量存放各层结点数 int static i=1; int static max=0;//最大宽度 if(T) { if(i==1) //若是访问根结点 { n[i]++; //第1层加1原创 2012-06-12 12:59:22 · 1134 阅读 · 0 评论 -
完全二叉树与满二叉树
去笔试了很多次,每次都有有关于二叉树的题目,而且其中最多的是关于完全二叉树,然而完全二叉树在哥心中的形态一直很模糊,究其原因是我把完全二叉树和满二叉树搞混了。其实满二叉树是完全二叉树的特例,因为满二叉树已经满了,而完全并不代表满。所以形态你也应该想象出来了吧,满指的是出了叶子节点外每个节点都有两个孩子,而完全的含义则是最后一层没有满,并没有满。下面贴定义:满二叉树(Full Bin原创 2012-10-06 17:19:05 · 63811 阅读 · 13 评论 -
虚函数实现原理(转)
前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我转载 2014-10-16 15:06:29 · 762 阅读 · 0 评论