
算法
大神,快来碗里
专注于Java相关技术
展开
-
深度解析某头条的一道TopN面试题
首先,某头条的文章量、用户量都是很大的,点击量那就更恐怖了!请问,如果实时展现热门文章,比如近8小时点击量最大的文章前100名。如果是你来开发这个功能,你怎么做?这个好办啊,Redis一个SortedSet搞定啊,Score计数,Key是文章ID,不就OK了么?回答的不错,你可以走了!要听清题目,说好的8小时动态时间窗口,计数是会过期的。还有,头条的量有这么小么,一个Redis就搞定了?同...原创 2019-05-02 08:21:12 · 10759 阅读 · 0 评论 -
网络笔记(16)流媒体协议:如何在直播里看到美女帅哥?
最近直播比较火,很多人都喜欢看直播,那一个直播系统里面都有哪些组成部分,都使用了什么协议呢?无论是直播还是点播,其实都是对于视频数据的传输。一提到视频,大家都爱看,但是一提到视频技术,大家都头疼,因为名词实在是太多了。三个名词系列我这里列三个名词系列,你先大致有个印象。名词系列一:AVI、MPEG、RMVB、MP4、MOV、FLV、WebM、WMV、ASF、MKV。例如 RMVB 和 M...原创 2019-05-08 21:53:04 · 10904 阅读 · 0 评论 -
排序算法(0)十大经典排序算法
算法概述0.1 算法分类十种常见排序算法可以分为两大类:非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。0.2 算法复杂度0.3 相关概念稳定:如果a原本在b前面...原创 2019-05-01 15:30:53 · 15846 阅读 · 0 评论 -
排序算法(1)冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。1.1 算法描述比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最...原创 2019-05-01 15:32:00 · 15874 阅读 · 0 评论 -
排序算法(2)选择排序(Selection Sort)
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。2.1 算法描述n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:初始状态:无序区为R[1…n],有序区为空...原创 2019-05-01 15:33:12 · 16002 阅读 · 0 评论 -
排序算法(3)插入排序(Insertion Sort)
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。3.1 算法描述一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:从第一个元素开始,该元素可以认为已经被排序;取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素,...原创 2019-05-01 15:33:46 · 16590 阅读 · 0 评论 -
排序算法(4)希尔排序(Shell Sort)
插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。4、希尔排序(Shell Sort)1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。4.1 算法描述先将整...原创 2019-05-01 15:34:19 · 16248 阅读 · 0 评论 -
排序算法(5)归并排序(Merge Sort)
5、归并排序(Merge Sort)归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。5.1 算法描述把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分别采用归并排...原创 2019-05-01 15:34:55 · 15930 阅读 · 0 评论 -
排序算法(6)快速排序(Quick Sort)
6、快速排序(Quick Sort)快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。6.1 算法描述快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:从数列中挑出一个元素,称为 “基准”(pivot);重新排序数列,所有元素比基...原创 2019-05-01 15:35:29 · 15906 阅读 · 0 评论 -
排序算法(7)堆排序(Heap Sort)
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。7.1 算法描述将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R...原创 2019-05-01 15:36:11 · 15850 阅读 · 0 评论 -
排序算法(8)计数排序(Counting Sort)
计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。8.1 算法描述找出待排序的数组中最大和最小的元素;统计数组中每个值为i的元素出现的次数,存入数组C的第i项;对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);反向填充目标数组:将每个元素i放在新数组的第...原创 2019-05-01 15:36:48 · 16526 阅读 · 0 评论 -
排序算法(9)桶排序(Bucket Sort)
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。9.1 算法描述设置一个定量的数组当作空桶;遍历输入数据,并且把数据一个一个放到对应的桶里去;对每个不是空的桶进行排序;...原创 2019-05-01 15:37:29 · 16147 阅读 · 0 评论 -
排序算法(10)基数排序(Radix Sort)
10、基数排序(Radix Sort)基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。10.1 算法描述取得数组中的最大数,并取得位数;arr为原始数组,从最低位开始取每个位组成radix数组;对radix进行计数排序...原创 2019-05-01 15:38:18 · 16029 阅读 · 0 评论 -
看动画轻松理解「 堆 」
https://juejin.im/post/5c1ae6545188256a272a9cee堆(heap)又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。因为队列中允许的操作是先进先出(FIFO),在队尾插入元素,在队头取出元素。而堆虽然在堆底插入元素,在堆顶取出元素,但是堆中元素的排列不是按照到来的先后顺序,而是按照一定的优先顺序排列的。...原创 2019-05-04 15:03:48 · 12999 阅读 · 0 评论 -
看动画轻松理解「递归」与「动态规划」
https://juejin.im/post/5c2308abf265da615304ce41在学习「数据结构和算法」的过程中,因为人习惯了平铺直叙的思维方式,所以「递归」与「动态规划」这种带循环概念(绕来绕去)的往往是相对比较难以理解的两个抽象知识点。程序员小吴打算使用动画的形式来帮助理解「递归」,然后通过「递归」的概念延伸至理解「动态规划」算法思想。什么是递归先下定义:递归算法是一...原创 2019-05-04 15:01:21 · 12965 阅读 · 0 评论 -
什么是散列表?
https://juejin.im/user/5b2cc5fee51d4553156be12f/posts散列表散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。散列函数散列函数,顾名...原创 2019-05-04 14:57:30 · 17281 阅读 · 2 评论 -
贪心算法及几个经典例子
贪心算法一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。...原创 2019-05-03 08:16:01 · 12602 阅读 · 0 评论 -
KMP算法-很详细的讲解
原文地址:http://www.cnblogs.com/SYCstudio/p/7194315.htmlKMP算法(研究总结,字符串)前段时间学习KMP算法,感觉有些复杂,不过好歹是弄懂啦,简单地记录一下,方便以后自己回忆。引入首先我们来看一个例子,现在有两个字符串A和B,问你在A中是否有B,有几个?为了方便叙述,我们先给定两个字符串的值A=”abcaabababaa”B=”abab...原创 2019-05-03 08:39:40 · 11209 阅读 · 0 评论 -
动态规划算法学习笔记
**动态规划(dynamic programming)**是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。在面试笔试中动态规划也是经常作为考题出现,其中较为简单的DP题目我们应该有百分之百的把握顺利解决才可以。动态规划定义动态规划实际上是一类题目的总称,并不是指某个固定的算法。动态规划的意义就是通过采用递推(或者分而治之)的策略,通过解决大问题的子问题从...原创 2019-05-03 08:45:14 · 11218 阅读 · 0 评论 -
常用算法策略总结
常用算法策略总结策略是面向问题的,算法是面向实现的。一、不同算法策略特点小结1、贪心策略 贪心策略一方面是求解过程比较简单的算法,另一方面它又是对能适用问题的条件要求最严格(即适用范围很小)的算法。 贪心策略解决问题是按一定顺序,在只考虑当前局部信息的情况下,就做出一定的决策,最终得出问题的解。 即:通过局部最优决策能得到全局最优决策2、递推策略递推也是由当...原创 2019-05-03 08:49:34 · 13241 阅读 · 0 评论 -
BloomFilter(布隆过滤器)
前言映射是个非常有意思的东西。hash函数是把任意类型的数据映射成等长的字节码,用于快速查询,加密等;bitmap 类似桶排序,最大的数是多少,就有多少位,一个数存不存在就看对应的位里是0还是1。布隆过滤器是对bitmap的改进,提升了空间利用率。导图布隆过滤器主要是用于大数据的查询。布隆过滤器是通过k个hash函数散列出k个位矩阵上的点,如果这些点都是1则说明该数据存在,否则只要有...原创 2019-05-03 08:56:15 · 11422 阅读 · 0 评论 -
分治法(Java代码实现)
文章目录二分搜索(二分查找、折半查找)汉诺塔合并排序(归并排序)二分搜索(二分查找、折半查找)【要求】线性表为有序表(排好序的)【基本思想】先确定待查找记录所在的范围,然后逐步缩小范围直至找到或找不到该记录位置。【步骤】1、先确定中间位置:middle = (left+right)/2;2、将待查找得key值与data[middle].key值相比较。若相等,则查找成功并返回该位置,否...原创 2019-05-03 09:00:01 · 13161 阅读 · 0 评论 -
图的遍历之深度优先搜索和广度优先搜索
深度优先搜索的图文介绍1. 深度优先搜索介绍图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直...原创 2019-05-03 09:09:41 · 12637 阅读 · 0 评论 -
从“数学归纳法”到理解“递归算法”
前言相信大家在面试或者工作中偶尔会遇到递归算法的提问或者编程,我们今天来聊一聊从数学归纳法到理解递归算法。如有错误还请大家及时指出~本文已同步至 GitHub/Gitee/公众号,感兴趣的同学帮忙点波关注~1. 数学归纳法1.1 简介来源百度百科数学归纳法(Mathematical Induction, MI)是一种数学证明方法,通常被用于证明某个给定命题在整个(或者局部)自然...原创 2019-05-03 10:16:05 · 11178 阅读 · 0 评论 -
谈谈大O表示法
阅读本文你将收获:时间复杂度的概念。空间复杂度的概念。大O表示法。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面来衡量。所对应的两个指标分别是“时间复杂度”与“空间复杂度”。故在正式介绍大O表示法之前,我们先来看看算法优劣的两个指标:“时间复杂度”与“空间复杂度”。一、时间复杂度时间复杂度是指一个算法被执行所需要的计算工作量。它用来度量算法执行的时间长短。...原创 2019-05-03 10:20:42 · 11663 阅读 · 1 评论 -
滑动窗口有关的算法面试题
前言科普:什么是滑动窗口算法滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合。假设有数组 [a b c d e f g h ],一个大小为 3 的 滑动窗口 在其上滑动,则有:[a b c] [b c d] [c d e] [d e f] [e f g] [f g h]一般情况下就是使用这...原创 2019-05-03 10:29:48 · 10861 阅读 · 0 评论 -
链表算法面试?看我就够了!(超全面)
来源: https://juejin.im/post/5c7c71c6f265da2dcb679e851 引言单链表的操作算法是笔试面试中较为常见的题目。本文将着重介绍平时面试中常见的关于链表的应用题目,希望对你们有帮助 _2 输出单链表倒数第 K 个节点2.1 问题描述题目:输入一个单链表,输出此链表中的倒数第 K 个节点。(去除头结点,节点计数从 1 开始)2.2 两次遍历法...原创 2019-05-04 14:51:24 · 13003 阅读 · 0 评论 -
详解什么是平衡二叉树(AVL)
https://juejin.im/post/5c550b41f265da2d8e70bc35前言Wiki:在计算机科学中,AVL树是最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是 O(logn)。增加和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡。AVL...原创 2019-05-04 14:54:36 · 13218 阅读 · 1 评论 -
漫画算法(1):什么是ConcurrentHashMap?
————————————————————————前两期我们讲解了HashMap的基本原理,以及高并发场景下存在的问题。没看过的小伙伴可以点击下面链接:漫画:什么是HashMap?漫画:高并发下的HashMap如果实在懒得看也没有关系,我们来简单回顾一下HashMap的结构:简单来说,HashMap是一个Entry对象的数组。数组中的每一个Entry...转载 2019-05-01 15:59:40 · 15890 阅读 · 0 评论