Algorithm
文章平均质量分 68
丑旦
北京邮电大学
展开
-
[转]稳定排序和不稳定排序
这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前转载 2016-04-22 11:11:40 · 495 阅读 · 0 评论 -
算法--排序--堆排
这一篇再画下重点,看一下堆排。在将堆排之前,有必要先澄清两个概念:堆和堆排序。堆是一种数据结构,属于完全二叉树的一种。根据数据排列的特点,可以分为大顶堆(最大堆)和小顶堆(最小堆)。所谓的大顶堆,就是满足父节点大小于左、右子节点的树;小顶堆,则是父节点不大于左、右子节点的树。由此,我们也可以得出一个结论:大顶堆(小顶堆)是整个堆最大(小)的元素。堆排序则是利用堆的性质来进行排序的一种算法。什么性质呢原创 2016-12-17 10:15:18 · 781 阅读 · 0 评论 -
算法--排序--快排
前面的几个算法都比较基础,面试笔试99%不会考。这一篇画下重点,看一下快排。快排的核心是”分治”,所谓的分治,就是”大而化小,小而化了”。说白了,就是将一个数组分成两个子数组,分别执行快排。排完后,再分成4个子数组,再排…直到不能再拆分为止。可以说,整个快排就是一个不断拆分的过程。因此,拆分就很关键(废话…)。究竟该如何拆分呢?按什么策略拆呢?这就是它的核心了。单轴快排一般会选择一个数组元素作为fl原创 2016-12-16 00:44:10 · 940 阅读 · 0 评论 -
面试--算法--Top K
Top K问题是面试时手写代码的常考题,某些场景下的解法与堆排和快排的关系紧密,所以把它放在堆排后面讲。下面先来还原一下Top K考试常见的套路。你正紧张地坐在小隔间里,听着越来越近的脚步声,内心忐忑,犹如兔脱。推门声呷然而起,你扭头一看,身体已不由自主起立,打量着眼前来人,心里一阵窃喜:还好,面善。面试官点头致意,你配合坐下,满心满眼一片赤诚,恨不得把公司的茶水阿姨都夸一遍来表明你面试的诚意。面试原创 2016-12-19 11:12:27 · 14559 阅读 · 4 评论 -
算法--排序--面试总结
这一篇作为排序算法的总结。常见的排序算法有冒泡、选择、插入、希尔、快排、堆排、基数、归并、计数以及桶排等。前六种算法在前面文章里已经有过较详细的介绍,并提供了相关的Java代码作为参考。其中,最重要的必然是快排和堆排这两种,准备面试的同学务必要熟练掌握。至于后四种算法,则考得相对很少,而且大多数考点也集中在它们的复杂度和稳定性上。同时,这四种算法还有一个共同的特点,它们的效率不低,但都是以申请额外的原创 2016-12-18 09:58:16 · 482 阅读 · 0 评论 -
算法--查找--二分查找
昨天面试,突然被问到二分查找。原理都懂,实现其实也不算难,偏就没写出来,说起来真是一个大写的尴尬…想来还是算法底子太弱,痛定思痛,不如好好复习一下,那就从此处上路吧。条件:(1)数据必须采用顺序存储结构;(2)数据必须有序。原理:二分查找,也叫作拆半查找,属于静态查找的一种。一般的实现思路,就是先拿中间位置的数middleData与待查找的数searchData比较,如果middleData时间复杂原创 2016-06-10 11:06:53 · 642 阅读 · 0 评论 -
算法--查找--差值查找
老实说,差值查找与二分查找在实现上基本没什么区别。相对于二分查找来说,查值查找更在乎数据的分布规律,换句话说,查值查找会根据数据的分布情况,来决定要选择的拆分点middle,从而实现优化。比如现在一个长度为100,分别存放着1到100的整数,我们要查找2,就不会从50这个点来拆分,而是会选择较小的数值。条件:(1)数据必须采用顺序存储结构;(2)数据必须有序。原理:与二分查找类似,区别在于拆分点的选原创 2016-06-10 17:46:09 · 2255 阅读 · 0 评论 -
算法--查找--斐波那契查找
相对于二分查找和差值查找,斐波那契查找的实现略显复杂。但是在明白它的主体思想之后,掌握起来也并不太难。既然叫斐波那契查找,首先得弄明白什么是斐波那契数列。相信大家对这个著名的数列也并不陌生,无论是C语言的循环、递归,还是高数的数列,斐波那契数列都是一个重要的存在。而此处主要是用到了它的一条性质:前一个数除以相邻的后一个数,比值无限接近黄金分割。就笔者而言,这种查找的精髓在于采用最接近查找长度的斐波那原创 2016-06-11 00:03:24 · 19309 阅读 · 12 评论 -
算法--查找--二叉排序树创建、查找
二叉排序树(BST)具有如下性质: (1)若有左子树,左子树所有值均小于根节点的值; (2)若有右子树,右子树所有值均大于根节点的值; (3)左右子树,分别是一棵二叉排序树。左子树中最右边节点必然是左子树中最大的,右子树最左边节点必然是右子树中最小的。BST的创建和搜索还是比较简单的,思路基本一样,有树便有递归。比较棘手的是它的删除,相比于C语言的指针操作来说,java原创 2016-06-12 17:41:33 · 879 阅读 · 0 评论 -
算法--查找--散列表查找
查找除了线性表的查找(顺序、二分、分块),树上查找(BST、B-树),还有一种散列查找。相比于前两种查找,散列表的查找效率惊人的高O(1),它采用的直接寻址技术,基本上就是实现了精准打击,达到一击而中的效果。所谓的直接寻址技术,说白了,就是存储记录时,通过散列函数计算出一个散列地址;读取记录时,通过同样的散列函数计算出地址,然后按照地址访问记录。整个过程有点类似于数学中的映射,一个或者多个key通过原创 2016-06-14 11:09:51 · 3020 阅读 · 0 评论 -
算法--查找--总结篇
紧张的校招终于接近尾声了。长达四个月的时间,在实习和面试之间频繁切换,起早贪黑熬夜点灯都是家常便饭,仿佛一夜之间又回到了高考前(目瞪狗呆脸…)。好在准备还算到位,加上平时的项目积累、总结,最终的结果还算满意。回过头来想想,真真切切也就一个感受:找工作真特娘的是一项体力活。以前,总是听师兄师姐谈经验,觉得工作该如何如何,算法该如何如何,重点知识该如何如何。于是一股脑的刷算法,看面经,啃基础。你能说它没原创 2016-11-28 23:39:07 · 526 阅读 · 0 评论 -
算法--排序--冒泡
冒泡排序,可能是大多数人接触的第一个排序算法。C语言教程里对此有详细描述。冒泡算法本身不难,但写不好的话,很容易写成效率最差的选择排序,介绍选择排序的时候会分析一下原因。条件: 数据量较小原理: 吹泡泡。内外两层,一趟确定一个元素的位置。这里总结了一个速记法则”外后内浅(前)”,解释一下就是最外层的循环从最后面开始,内层的循环从前面开始。记下这个法则,以后就不容易写蹩脚了。时间复杂度:没什么好说原创 2016-11-29 00:25:27 · 346 阅读 · 0 评论 -
算法--排序--选择
选择排序的思想也比较简单,就是从所有数据中选出最小的一个,排好第一位;然后再选一个次小的,排好第二位;依次类推下去…形象一点说像极了平时大家钟爱的打牌运动,笔者斗地主时喜欢装逼,总是要先把牌取完,然后再一把揭开慢慢整理,大眼一扫,MD竟然有个3!!!没办法,拿出来放到最左边。再扫一眼3后面的牌,我擦,竟然还有个4,抽出来,放到3后面吧…直到排好王炸,哈哈,又赢了5000金豆(得意脸)条件: 数据量原创 2016-11-30 00:52:59 · 365 阅读 · 0 评论 -
算法--排序--希尔
希尔是插入排序的姊妹,她在插入的基础上引入了分组的概念,在分组内做插入,然后不断地缩小分组的个数,分组为0即可完成排序。换句话,插入排序是分组为1的希尔排序。 举个例子:现有长度为10的数组[1, 5, 8, 4, 7, 3, 0, 2, 9, 6]; 注:希尔排序的整个过程,图中颜色相同的表示处于同一个分组内,元素所处的位置对应着数组的下标。 (1)既然引入了分组gap,不妨就让gap =原创 2016-12-15 00:14:36 · 501 阅读 · 0 评论 -
算法--排序--插入
插入排序的思想跟选择排序类似,都是从后面选择元素往前面“放”,导致这两种算法经常”傻傻分不清楚”。笔者认为它们两个最大的区别已经体现在“放”的策略上。假设现有无序数组A0到A5处在,它们分别对应着数组中的0到5号位。要求实现从小到大排列。所谓的选择排序,它侧重从A0到A5中选出最小的一个元素,放到0号位上;然后在剩余元素中选出次小元素,放在1号位上,依次类推…而插入排序,它里面引入了分组的概念,核心原创 2016-12-02 11:18:47 · 436 阅读 · 0 评论 -
关于RSA非对称加密相关概念整理
提起非堆成加密,不管承认不承认,大多数人的第一反应肯定是RSA,它独特的质数分解思想让其破解的难度大大增加原创 2017-04-23 22:12:40 · 1491 阅读 · 0 评论