
算法相关
文章平均质量分 74
zhoujunbuaa
这个作者很懒,什么都没留下…
展开
-
基数排序--链式基数排序(Radix)
链式基数排序:属于”分配式排序”(distribution sort)基数排序法又称“桶子法”(bucket sort)或bin sort。 链式基数排序思想:透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数。 时间效率:设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O原创 2010-12-03 17:43:00 · 2498 阅读 · 0 评论 -
北斗无源授时接收机GEO卫星星历求解算法
这篇论文的关键是将“拉格朗日插值法”改为“切比雪夫多项式拟合算法”。 一、拉格朗日插值法 拉格朗日差值法保证了几乎所有的点都通过一条直线,通过之前的大量采样点进行比对算出当前时刻点值。 该算法的最大不足是当观测采样点需要增加或减少时,原的公式必须重新建立,计算量大。 二、切比雪夫多项式拟合算法 利用余弦函数的性质进行拟合,允许一定的波动,采样点少时波动幅度大些,表现为波形的幅值大。原创 2010-11-05 23:15:00 · 1453 阅读 · 0 评论 -
顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如:如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。 网上听说听到包括Autodesk、EMC在内的多家公司在面试或者笔试里采用过这道题。但是看有些人做的,头晕。还是自己弄了弄。 解题思路(借鉴原创 2011-01-06 22:39:00 · 3238 阅读 · 1 评论 -
选择排序(二)--树形选择排序
利用满二叉树的性质,思想:将输入的数据存放到满二叉树的叶节点,通过比较树中剩余可用节点(从底层的叶节点开始)的大小,每次选择最小的数值(比较复制到二叉树的顶端),并且把最小数值赋给排序数组的前端,把最小数值原来叶节点的位置设置为不可用;依次循环直至最后一个可用叶节点。 一、满二叉树和完全二叉树区别如图: 二、程序讲解: template class TreeNode{ public: T data; int index; int原创 2010-11-10 22:52:00 · 5146 阅读 · 0 评论 -
选择排序(三)--堆排序
一、堆排序思想 (要和shell排序区别) 堆,是一棵完全二叉树,(完全二叉树概念:只有最后两层可以是业界点,而且最底层的叶节点都在左侧,图在上一篇日志上有) 堆可以用数组来描述,在排序中强调的是 大根堆(最大值在树根),将大根堆的的根部值 和 无序数组的最后一个数交换,然后重新排序新的无序堆为 大根堆。 具体排序思想:将待排序区分为无序区和有序区,无序区在前,有序区在后。未排序前无序区为整个待排序区间,没有有序区。 排序的过程是,不断原创 2010-11-11 15:12:00 · 926 阅读 · 0 评论 -
重温 汉诺塔 问题
<br />零、汉诺塔问题<br /> 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。 <br />原创 2010-11-19 21:29:00 · 1525 阅读 · 0 评论 -
2010年11月21日微软实习生笔试题--反序对 数目求解
题目大意:输入n个正整数(rightchild!=NULL) //注意是if,不是while,因为已经递归的计算了 { return CaculateReversePairs(pTree->rightchild);//右子树,不能加1 } 不需要加1,当时可能没哟加1,但是印象中又好像加了,这一点非常重要。 #ifndef REVERSE_PAIRS_H #define REVERSE_PAIRS_H template struct原创 2010-11-22 19:24:00 · 1780 阅读 · 13 评论 -
0-1背包问题,poj 3624 Charm Bracelet动态规划-解题报告,增加最优路径构建
1)0-1背包问题和 零碎背包问题是不同的,前者只能用动态规划来做, 后者可以用贪心算法。2)动态规划的核心是 “有多个重叠子问题”,“自底向上”解决问题。3) 0-1背包问题 ,W为最大重量,n为物体个数,求最大的价值Value,可在O(nW)的时间复杂度内解算出来。原创 2011-08-16 21:14:58 · 2541 阅读 · 0 评论 -
关于常见排序算法的稳定性分析和结论
原文:http://hi.baidu.com/cuifenghui/blog/item/0587932b039557f9e7cd4051.html 这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学转载 2011-09-14 09:31:55 · 615 阅读 · 0 评论 -
动态规划-poj1088 滑雪 ---增加了最优路径构建
一、有两种思路:1)根据记忆搜索(保存了最优值表格),在纯粹的递归思路里加入记忆表格。2)先将高度排序,然后依次从点由低到高 计算 该点的最长路径长度。(因为当矮点不可能通过高点,而比当前矮的点都在之前计算好了)----------------------------原创 2011-08-17 21:45:19 · 1337 阅读 · 0 评论 -
交换排序----冒泡排序 和 快速排序
通过对比大小交换对比的元素所得到的排序为交换排序。冒牌排序时很常见的:通过对比相邻元素的大小如果前面的元素比后面的大,则交换两个元素,使得大的元素往后移。 一、冒泡排序 template void BubbleSort(SqList &L) //1)冒泡排序 { #ifdef CHANGE_FLAG bool changeFlag=false; #endif T t; for(int i=1;iL.key[原创 2010-11-03 17:11:00 · 543 阅读 · 0 评论 -
选择排序1-简单选择排序
简单选择排序为选择排序的一种。简单选择排序的原理是,每次选择最小的数放在最前面{第一次得到第一个最小数(遍历了一次),第二次得到第二个最小数(从第二个数开始遍历,依次类推} template int SelectMinKey(SqList &L,int n) { int min=n; T minkey; minkey=L.key[n]; //当前n为最小 for(int i=n+1;i vo原创 2010-11-01 22:14:00 · 752 阅读 · 0 评论 -
2010顶嵌杯第一题--24点运算
痛恨,当时这道题没有做出来,没有安下心认真分析。当时作出了第二道题,迷宫问题,因为以前见过类似的(具体缺乏锻炼,调试了老半天)。题目如下:-----------------------------------快算24Description给定4个不大于10的正整数(范围1-10),要求在不改变数据先后顺序的情况下,采用加减乘除四种运算,找到一个表达式,使得最后的结果是24。Input4个不大于10的正整数。输入数据保证存在唯一解。Output不改变位置顺序,由'+','-','*','/'4个运算符和'('原创 2010-12-04 17:07:00 · 908 阅读 · 0 评论 -
迷宫问题--非递归回溯 C语言实现
零、注意要素 1、在迷宫周围需要设置围墙(一圈的1) 2、每个点的走动,需要记录方向,(x,y,方向) 3、如果某点遇到围堵,回退,那么需要标记这个点是不通的。会退后的下一点再往该方向查找时,这一点是不通的,那么那一点需要判断其他方向,如果其他方向也不同则回溯,并且标记那一点也为不通的。 4、stack的topPointer问题,topPointer是指向最上面的数据的上一个空间, void PUSH(stackNode node,mazeStack *stack)原创 2010-12-06 17:22:00 · 1383 阅读 · 0 评论 -
《编程之美》——分离变量法,磁带访问优化方案(个人见解)
问题大概是: 已知:磁带的各个 文件F1、F2……Fn.文件的大小分别是L1、L2……Ln, 访问的频率分别是:f1、f2……fn。 求:怎么安排文件使得 磁带的平均访问长度 最短 (注:每次从头开始,而且是磁带的顺序访问) 个人感觉书上没有说清楚,就是弄的很含糊。其实总体思想就是 :分离变量法。把问题的其他因素先假设已知固定,看其他变量的影响。 1、单独从文件大小来看: 如果仅仅从文件大小看,那么访问F1的长度是L1,访问F2的长度是(L1+L2原创 2010-12-10 23:12:00 · 1060 阅读 · 0 评论 -
二叉排序树
二叉排序树,在各种面试中都要考察,算法数据结构考察的重点。今天照着教科书的程序打了一通,发现它运行达不到预想的效果(中序遍历为空),调试后发现其在Insert出错,没有能够将值插入二叉树,但保存了值到ST=new Node[maxSize];的ST中,ST用于顺序保存输入的数据。 删除时 : 12 5 54 18 64 14原创 2010-10-27 11:32:00 · 473 阅读 · 0 评论 -
双向冒泡排序 和 单向冒泡排序 算法分析比较
假设单向冒泡排序也是 在如果没有交换发生的情况下则终止(即changeFlag==false的情况下). 以下是单向冒泡排序 template void SSearch::Ascendsort() { T t; bool changeFlag=false; for(int i=0;iST[j+1].key) { t=ST[j].key; ST[j]原创 2010-10-27 17:34:00 · 1490 阅读 · 0 评论 -
Hash 表运用
今天实际code温习了下Hash,主要4个功能是:给定一个整数n创建可以存放n个值的Hash表,在表中插入元素,查找对应元素,显示Hash表。 hash.h如下: #ifndef _HASH // Specifies that the minimum required platform is Windows Vista. #define _HASH // Change this to the appropriate value to target other vers原创 2010-10-27 10:22:00 · 546 阅读 · 0 评论 -
双向冒泡排序
这是完全自主编码,哈哈。但是思想还是书上先有的,但是没有具体代码。下面是运行结果截图,输入的为23 ,45,2,15,9 冒牌排序流程如下,一次正向冒泡,从左至右。然后一次反向冒泡,从右至左。 第一次把最大的记录放到表尾,第二次将最小记录放到表头,如此反复。 pos[0]记录无序序列的第一个位置0,pos[1]记录无序表的最后一个位置len-1; 步长为d,正向冒泡为1,反响冒泡为-1.合并两方向为: for(int i=pos[(1-d)/2];i!=pos[(1+d)/2];i=i原创 2010-10-27 16:19:00 · 2397 阅读 · 0 评论 -
静态表查找
静态表,在折半查找前,一般要对其进行排序,这样才能折半。如果是顺序查找是不要求的。 1、冒泡排序:静态查找表在升序排序时,用到冒泡排序。在冒泡排序时每一循环都使得最后的数据时稳定的,也就是说第一次最大的数据在最后,第二次次大的数据在倒数第二,这样在每次循环时只从j=0到jST[j+1].key) { t=ST[j].key; ST[j].key=ST[j+1].key;原创 2010-10-27 12:32:00 · 694 阅读 · 0 评论 -
(转)单向链表的环的判断
Problem: 一个单向链表,怎么判断他是否存在环? 如果有环,求出环的大小和环的入口,如下图所示。 注意的是:不是说这个环一定是 从头开始的环(也就是说整个就是一个环),而是说这个链表内部可能存在环,包括整个环的情况,当然也包括非整个环的情况。 是否存在环: 由单指针遍历时,需要将访问的历史结点放入容量,并且需要查找开销;或者对访问数据做标记,这样将弄脏数据。 更好的方法是采用双指针,ptr_slow, ptr_fast, 前者每次走一步,后者每次走两步,如果相遇则说明有环。ps:转载 2010-12-22 15:00:00 · 631 阅读 · 0 评论 -
Bloom Filter概念和原理
Bloom Filter概念和原理焦萌 2007年1月27日 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合转载 2011-08-29 11:22:53 · 547 阅读 · 0 评论