数据结构与算法
文章平均质量分 66
Penguinbupt
会飞的企鹅
展开
-
循环队列(Ring Buffer)
循环队列,ring buffer LeetCode 622 的三种解法, C语言实现原创 2023-06-06 23:38:41 · 744 阅读 · 0 评论 -
算法那些容易忘的内容
算法设计和分析算法设计:经常采用的算法设计技术主要有 分治法,动态规划,贪心法,回溯法,分支限界法,概论算法和近似算法。算法分析求解一个问题可能会有多种算法可以选择,选择的主要标准首先是算法的正确性、可靠性、简单性和易理解性,其次是算法的时间复杂度和空间复杂度要低,这是算法分析技术的主要内容。在计算机资源中,最重要的是时间和空间(存储器)资源,因此复杂度分析主要包括时间复杂度和空间复杂度分析。分治和递归就像一对孪生兄弟,经常同时应用于算法设计之中,并由此产生许多高效的算法。分治思原创 2021-05-13 09:57:41 · 149 阅读 · 0 评论 -
二叉搜索树与双向链表
二叉搜索树与双向链表最终转换为 排序的循环双向链表,或排序的双向链表,其实都一样,只是最终的首尾是否相接。方法有4种:1. 迭代法一: 模拟系统栈Deque<Node>stack=newArrayDeque<Node>();2. 迭代法二: 模拟系统栈Deque<Node>stack=newArrayDeque<Node>();3. 递归法: 利用系统栈4.摘下重连法: 利用中序遍历,直接将节点摘下放入Li...原创 2021-01-19 18:38:30 · 226 阅读 · 0 评论 -
冒泡算法及改进(属于交换排序)
冒泡排序(Bubble Sort)是一种交换排序,快速排序也属于一种交换排序。冒泡排序的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。假设一共共有 n 个数,则会进行 (n-1)趟比较,由1,2......n-1这么多趟,第一趟进行 (n-1)次比较,.......第n-1趟进行1次比较,故有公式:第i趟 + 第i趟的比较次数 = n#define MA原创 2015-03-29 17:07:55 · 669 阅读 · 0 评论 -
算法:链表
链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,也适合考察写代码的能力。链表的操作也离不开指针,指针又很容易导致出错。综合多方面的原因,链表题目在面试中占据着很重要的地位。本文对链表相关的面试题做了较为全面的整理,希望能对找工作的同学有所帮助。链表结点声明如下:structListNode{ int m_nKey;原创 2015-10-01 22:45:30 · 654 阅读 · 2 评论 -
非对称加密算法的误解(RSA等算法)
其实公钥和私钥都可以用来加密或解密---只要能保证用A加密,就用B解密就行。至于A是公钥还是私钥,其实可以根据不同的用途而定。公钥、私钥都可以加密,也都可以解密。其中:用公钥加密需要私钥解密,称为“加密”。由于私钥是不公开的,确保了内容的保密,没有私钥无法获得内容;用私钥加密需要公钥解密,称为“签名”。由于公钥是公开的,任何人都可以解密内容,但只能用发布者的公钥解密,验证了内容是该原创 2016-04-18 16:12:16 · 496 阅读 · 0 评论 -
算法复杂性:P类、NP类和NPC类的关系
原创 2016-05-13 15:07:15 · 2466 阅读 · 1 评论 -
算法:“求质数”的题目(总结篇)
质数(prime number)又称素数,有无限个。除了1和它本身以外不再有其他的除数整除。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积,最小的质数是2,而1既不是质数也不是合数。0既不是质数也不是合数。可以先看点击打开链接在面试中,会有求质数的题目无非就两种类型 1.判断一个数是否是素数 2.判断一个范围的所有数是否是素数原创 2015-10-02 21:40:12 · 1366 阅读 · 0 评论 -
求两个自然数的最大公约数(GCD)?
在辗转相除法中,要注意对边界的检测和以大数除以小数,例如0或者1等等。int gcd (int a,int b) { int temp; /*定义整型变量*/ if(a<b) /*通过比较求出两个数中的最大值和最小值*/ { temp=a; a=b; b=temp; } wh原创 2016-05-16 16:41:24 · 1275 阅读 · 0 评论 -
算法:动态规划
1.首先来看看维基百科怎么定义的动态规划引自wiki:Dynamic programmingIn mathematics, management science, economics, computer science, and bioinformatics, dynamic programming (also known as dynamic optimization) is a m原创 2016-04-23 09:36:18 · 4264 阅读 · 2 评论 -
剑指Offer面试题34题:丑数(Ugly Number)(while循环里面的三个小问题)
语言:C/C++语言IDE: Mac/Xcode 丑数:我们把只包含因子2、3、5的数称为丑数(Ugly Number),求按照从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯我们把1当做第一个丑数。分析:所谓一个数m是另一个数n的因子,是指n%m==0。根据丑数的定义,丑数能被2,3,5整除,也就是一个数能连续的被2整除,或者连续的被3整原创 2017-03-19 20:39:21 · 1218 阅读 · 0 评论 -
模拟退火算法
1).随机产生一个初始解x0,令xbest=x0,并计算目标函数值E(x0);2).设置初始温度T(0)=TO,迭代次数i=1;3).Do while T(i)>Tmin 1.for j=1~k 2.对当前最优解xbest按照某一领域函数,产生一个新的解xnew.计算新的目标函数值E(xnew),并计算目标函数值得增量E(xnew)-E(Xbest).原创 2016-01-28 02:48:19 · 5341 阅读 · 0 评论 -
模拟退火算法例子
求解某一个方程fun(x)的极小值,很常见的以一种情况是当前的x不管增大还是减小,函数值fun(x)均是增大,这时x就是极值。这是一种完完全全的贪心算法。这样求出的极小值,并不一定整段函数的全局极小值,而极可能是局部极小值。例如下图 可以看出,有三个点,均是极小值点,在这是三个点处,不管增大变量,或是减小变量,目标函数的值都会增大。而只有最左边的那个点,才是全局最优解。转载 2016-01-26 21:43:00 · 16869 阅读 · 1 评论 -
快速排序算法
快速排序算法最早由图灵奖获得者Tony Hoare设计出来的,他在形式化方法理论以及ALGOL60编程语言的发明中都有卓越的贡献,是上世纪最伟大的计算机科学家之一。要注意很多细节问题,如:我们知道,快速排序的分治partition过程有两种方法,一种方法是两个指针从首尾位分别向中间扫描的方法(大多数的人和一般的教材采用的是这第二种首尾向中间扫描法,算法导论的思考题7-1原创 2015-03-29 22:09:03 · 647 阅读 · 0 评论 -
算法的设计方式
1.贪心算法贪心算法(又称贪婪算法)是指在对问题求解时,从问题的某一个初始解出发,总是做出在当前看来最好的选择,当达到某算法中的某一步不能再继续前进时,算法停止。这时,就得到了问题的一个解,但不能保证求得的最后解是最优的。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题能产生整体最优解或者是整体最优解原创 2015-04-05 22:58:38 · 528 阅读 · 0 评论 -
二叉树遍历(思想)
二叉树的遍历(思想)根据一棵树的先序/中序遍历,或者后序/中序遍历序列,都可以唯一地确定一棵树,算法如下: - 首先根据前序遍历或后序遍历的第一个或最后一个为根结点 - 根据根节点可以在中序遍历中分出左子树部分和右子树部分- 根据前序/后序遍历的其他节点及中序遍历的左右两部分重复上述两步骤即可遍历二叉树是以一定规则将二叉树中的结点排列成一个线性序列,得到二叉树中结点的先序序列、中序序列或后续序原创 2015-04-09 11:35:19 · 2048 阅读 · 0 评论 -
虚函数和纯虚函数及虚函数表
虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数!纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!虚函数引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。class Cman{public:virtual void Eat(){……};转载 2015-05-08 10:42:35 · 1822 阅读 · 0 评论 -
线索二叉树
二叉树遍历,这实质上是对一个非线性结构进行线性化操作,使每个结点(除第一个和最后一个外)在这些线性序列中有且仅有一个直接前驱和直接后继。遍历二叉树是以一定规则将二叉树中的结点排列成一个线性序列,得到二叉树中结点的先序序列、中序序列或后续序列。当以二叉链表作为存储结构时,只能找到结点的左右孩子信息,而不能直接得到结点在任一序列中的前驱和后继信息,这种信息只有在遍历的动态过程中才能得到。原创 2015-06-11 10:12:27 · 544 阅读 · 0 评论 -
牛顿迭代法
牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最原创 2015-07-18 10:31:49 · 3628 阅读 · 0 评论 -
判断素数的算法
所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被2~16的任一整数整除。因此判断一个整数m是否是素数,只需把m被2~m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数另外判断方法还可以简化。m不必呗2~m-1之间的每一个整数去除,只需被2~√m之间的每一个整数去除就可以了。如果m不能被2~√m间任一整数整除,m必定是素数。例如判别17是是否为素原创 2015-10-01 21:22:25 · 1311 阅读 · 0 评论 -
常用算法:(一)分治算法
分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计转载 2015-10-02 01:56:53 · 405 阅读 · 0 评论 -
算法题:两个栈实现一个队列
两年前从网上看到一道面试题:用两个栈(Stack)实现一个队列(Queue)。觉得不错,就经常拿来面试,几年下来,做此题的应该有几十人了。通过对面试者的表现和反应,有一些统计和感受,在此做个小结。 用C++描述,题目大致是这样的: 已知下面Stack类及其3个方法Push、Pop和 Count,请用2个Stack实现Queue类的入队(Enqueue)出队(Dequeue)方法。转载 2015-10-01 22:40:42 · 488 阅读 · 0 评论 -
牛顿迭代法求数的平方根
牛顿法最初由艾萨克·牛顿在《流数法》(Method of Fluxions,1671年完成,在牛顿死后的1736年公开发表)。约瑟夫·拉弗森也曾于1690年在Analysis Aequationum中提出此方法。方法说明蓝线表示方程f而红线表示切线. 可以看出xn+1比xn更靠近f所要求的根x.首先,选择一个接近函数零点的,计算相应的和切线斜率(这里表示函数的导原创 2015-10-19 11:27:41 · 1594 阅读 · 0 评论 -
二叉树
树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。本文努力对二叉树相关题目做一个较全的整理总结,希望对找工作的同学有所帮助。转载 2015-11-04 16:52:02 · 382 阅读 · 0 评论 -
搜狐2015年10月18日在线笔试题大题第一道答案
考的的是约瑟夫环,还是挺简单的,15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一个圆圈,从第一个人开始报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问教徒怎么站,才能使每次投入大海的都是非教徒。是上述算法题的翻版,只不过求的一串二进制数而已约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知原创 2015-10-19 10:49:47 · 837 阅读 · 0 评论 -
堆排序
①建堆,建堆是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性的过程,从len/2到0处一直调用调整堆的过程,相当于o(h1)+o(h2)…+o(hlen/2) 其中h表示节点的深度,len/2表示节点的个数,这是一个求和的过程,结果是线性的O(n)。②调整堆:调整堆在构建堆的过程中会用到,而且在堆排序过程中也会用到。利用的思想是比较转载 2015-09-17 15:04:31 · 411 阅读 · 0 评论 -
贪心算法
贪心算法的设计思想 贪心算法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。贪心算法对于大部分的优化问题都能产生最优解,但不能总获得整体最优解,通常可以获得近似最优解。引例 [找零钱]一个小孩买了价值少于1美元的糖,并转载 2015-01-15 17:06:38 · 1077 阅读 · 0 评论