排序算法
文章平均质量分 84
排序算法
HelloWorld搬运工
HelloWorld是学习程序的第一个程序,搬运工是将一件东西从一个地方运到另一个地方。HelloWorld搬运工,分享技术知识,有原创也有转发,彼此交流,一起学习,共同进步。
展开
-
bitmap计数,求TopK最快的方法
上篇介绍了TopK的四种解法,其中随机选择(randomized select)最为经典,用减治法(Reduce & Conquer)的思想,将数据规模急速降低,总体复杂度为O(n)。结尾挖了一个坑:求TopK,有没有比随机选择更快的方法呢?空间换时间,是算法优化中最常见的手段,如果有相对充裕的内存,可以有更快的算法。画外音:即使内存不够,也可以水平切分,使...原创 2018-10-04 20:53:06 · 2333 阅读 · 0 评论 -
Top K算法分析
TopK,是问得比较多的几个问题之一,到底有几种方法,这些方案里蕴含的优化思路究竟是怎么样的,今天和大家聊一聊。问题描述:从arr[1, n]这n个数中,找出最大的k个数,这就是经典的TopK问题。栗子:从arr[1, 12]={5,3,7,1,8,2,9,4,7,2,6,6}这n=12个数中,找出最大的k=5个。一、排序排序是最容易想到的方法,将n个数排序之后...原创 2018-10-04 20:35:33 · 27625 阅读 · 6 评论 -
Base64编码换行符问题解决
概述Base64是一种字符串编码格式,Base64采用A-Z a-z 0-9 “+“ “/“这一共64个字符来编码原始字符(还有垫字符“=“)。一个字符本身是1个字节,也就是8位,而Base64编码后的一个字符只能表示能表示6位的信息。也就是原始字符串中3字节的信息编码会变成4字节的信息。Base64的主要作用是满足MIME传输需求,在传输过程中都是用ASCII支持的可见字符。Base64是基...原创 2020-03-18 17:17:16 · 15731 阅读 · 0 评论 -
程序开发常用加密策略解析
系统开发中,为了系统数据安全,数据加密不可缺少,开发人员需要掌握常见的加密策略。一、数字摘要数字摘要也称为消息摘要,它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash函数对消息进行计算而产生。如果消息在传递的途中改变了,接收者通过对收到消息采用相同的Hash重新计算,新产生的摘要与原摘要进行比较,就可知道消息是否被篡改了,因此消息摘要能够验证消息的完整性。消息摘要采用单向H...原创 2018-04-18 21:54:17 · 5277 阅读 · 1 评论 -
Java实现斐波那契数高效算法
前段时间去面试,被问到了斐波那契数算法,在此回顾总结一下。1、什么是斐波那契数算法斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列、费波那西数列、费波拿契数、费氏数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n&...原创 2018-09-20 21:10:52 · 7917 阅读 · 0 评论 -
排序算法:冒泡排序
冒泡排序是一种交换排序。什么是交换排序呢?交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。算法思想它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名。假...原创 2018-08-27 21:07:36 · 5140 阅读 · 2 评论 -
Java常用十类快速排序算法总结
1、概述:选择排序(直接选择排序,堆排序)交换排序(冒泡排序,快速排序)插入排序(直接插入排序,折半插入排序,Shell排序)归并排序桶式排序基数排序其中冒泡,插入,归并,基数属于稳定排序。2、选择排序2.1直接选择排序/**** 选择排序实例代码,其核心思想:* 直接选择排序的基本操作就是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在...原创 2017-02-16 15:40:33 · 471 阅读 · 0 评论 -
Java广度优先搜索与深度优先搜索
有两种常用的方法可用来搜索图:即深度优先搜索和广度优先搜索。它们最终都会到达所有连通的顶点。深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现。1.广度优先搜索:import java.util.Arrays;import java.util.Scanner;/**** 深度优先遍历:顾名思义,就是一条路走到黑,走到最深的地方。当无路可走时,就返回上一步向其他路走,若没有其...原创 2017-02-16 15:56:58 · 615 阅读 · 0 评论 -
Java常用图形算法
本文介绍常用算法戴克斯特拉算法(Dijkstra’salgorithm),动态规划(Dynamic programming),朴素贝叶斯分类算法。1、戴克斯特拉算法(Dijkstra’salgorithm)/**** Dijkstra算法* 算法步骤:* 1、第一轮,可以计算出,2、3、4、5、6到原点1的距离分别为:[7, 9, -1, -1, 14]。-1表示无穷...原创 2017-02-16 16:03:12 · 3075 阅读 · 0 评论 -
Java常用查找算法
本文总结Java常用查找算法顺序查找算法,线性查找算法,二分查找算法,分块查找算法和哈希查找算法。1、顺序查找算法/**** 顺序查找算法按数组的顺序从前往后一直比较,直到找到目标值返回。* 参考链接:http://developer.51cto.com/art/201406/443115.htm* http://blog.csdn.net/qq284565035/artic...原创 2017-02-16 16:11:20 · 1192 阅读 · 0 评论 -
Java常用数据结构总结
数据元素相互之间的关系称为结构。有四类基本结构:集合、线性结构、树形结构、图状结构;集合结构:除了同属于一种类型外,别无其它关系线性结构:元素之间存在一对一关系常见类型有: 数组,链表,队列,栈,它们之间在操作上有所区别.例如:链表可在任意位置插入或删除元素,而队列在队尾插入元素,队头删除元素,栈只能在栈顶进行插入,删除操作.树形结构:元素之间存在一对多关系,常见类型有:树(有许多特例:二...原创 2017-02-16 17:04:25 · 11093 阅读 · 2 评论 -
什么是Base64算法
A:为什么在进行Http传输的时候,需要把Byte数组进行Base64编码呢?B:这很简单呀,因为Http协议是文本协议,不同于二进制协议(如Thrift)那样直接进行二进制传输。A:那么,直接把Byte数组转换成String不就行了吗?类似newString(bytes)这样。为什么非要用Base64呢?B:首先,Base64是一种编码算法。为什么叫左Base64呢?因为这种算法只支...原创 2020-03-18 17:16:52 · 26947 阅读 · 5 评论 -
什么是一致性Hash算法?
一、Redis集群的使用我们在使用Redis的时候,为了保证Redis的高可用,提高Redis的读写性能,最简单的方式我们会做主从复制,组成Master-Master或者Master-Slave的形式,或者搭建Redis集群,进行数据的读写分离,类似于数据库的主从复制和读写分离。如下所示:同样类似于数据库,当单表数据大于500W的时候需要对其进行分库分表,当数据量很大的时候(标准可...原创 2020-03-18 17:16:25 · 417 阅读 · 0 评论 -
什么是AES对称加密算法
小明:老师,请问了解AES算法吗?老师:了解一些,AES算法是典型的【对称加密算法】小明:我不太明白,这个对称加密是什么鬼?它跟MD5,SHA这样的哈希摘要算法有什么不同?老师:对称加密不同于信息摘要,是真正意义上的加密算法。我们来看看下面这个例子:假设有一个发送方在向接收方发送消息。如果没有任何加密算法,接收方接收的是一个明文消息“我是小明”如果消息被中间人截获到,即使中...原创 2020-03-18 17:15:56 · 19831 阅读 · 1 评论 -
AES底层原理实现
上一次为大家介绍了AES算法的基本概念,我们是有追求的程序员,不能知其然不知其所以然。这一次,我来了解一下AES算法的底层原理。小明:老师,上一次你介绍了AES算法的基本概念,这一次可不可以讲讲AES的底层加密解密原理?老师:没问题,让我们先来回顾一下AES算法整体的关系图。上一篇我们已经对AES的总体加密流程进行了介绍,在这里我们重新梳理一下:1.把明文按照128bit拆分成...原创 2018-03-19 22:50:25 · 3175 阅读 · 0 评论 -
SHA算法系列介绍
我们先来回顾一下MD5算法的核心过程,简而言之,MD5把128bit的信息摘要分成A,B,C,D四段(Words),每段32bit,在循环过程中交替运算A,B,C,D,最终组成128bit的摘要结果。老师:SHA-2的子版本包括SHA-224,SHA-256,SHA-384,SHA-512。再看一下SHA-1算法,核心过程大同小异,主要的不同点是把160bit的信息摘要分成了A,B,C,D,E五段。再看一下SHA-2系列算法,核心过程更复杂一些,把信息摘要分成了A,B,C,D,E,F,G,H八段。原创 2018-04-01 21:44:18 · 19269 阅读 · 0 评论 -
MD5信息摘要算法解析
小明:老师,最近老板让我研究微信支付的接口文档,可是有个地方我总是弄不明白。老师:什么地方不明白,说来听听。小明:微信支付的接口有许多业务参数,还有一个参数Sign。微信方给了我一个Key,让我把业务参数和Key按一定规则拼接起来,生成Sign参数。着到底是什么鬼?老师:你连这个都不知道呀?这是为了网络传输安全所做的【信息摘要】签名,签名通常使用【MD5算法】来生成的。小明:MD5...原创 2018-04-01 21:48:08 · 5403 阅读 · 1 评论 -
MD5算法如何被破解
小明:老师,上次您讲了MD5算法。用它生成的信息摘要,真的可以被破解吗?老师:有很多种方法可以破解,不过需要明确一点,这里所谓的破解,并非把摘要还原成原文。为什么呢?因为固定128位的摘要是有穷的,而原文数量是无穷的,每一个摘要都可以由若干个原文通过Hash得到。小明:如果是这样的话,网上所说的MD5破解到底是怎么回事呢?老师:对于MD5的破解,实际上都属于【碰撞】。比如原文A通过MD...原创 2018-04-02 20:55:29 · 80033 阅读 · 4 评论 -
排序算法:快速排序
快速排序是一种交换排序。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。详细的图解往往比大堆的文字更有说明力,所以直接上图:上图中,演示了快速排序的处理过程:...原创 2018-08-27 21:12:56 · 306 阅读 · 0 评论 -
排序算法:直接插入排序
直接插入排序是一种最简单的插入排序。插入排序:每一趟将一个待排序的记录,按照其关键字的大小插入到有序队列的合适位置里,知道全部插入完成。在讲解直接插入排序之前,先让我们脑补一下我们打牌的过程。先拿一张5在手里,再摸到一张4,比5小,插到5前面,摸到一张6,嗯,比5大,插到5后面,摸到一张8,比6大,插到6后面,。。。最后一看,我靠,凑到全是同花顺,这下牛逼大了。...原创 2018-08-27 21:16:05 · 1253 阅读 · 1 评论 -
排序算法:希尔排序
希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。该方法因DL.Shell于1959年提出而得名。希尔排序的基本思想是:把记录按步长 gap分组,对每组记录采用直接插入排序方法进行排序。随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到1时,整个数据合成为一组,构成一组有序记录,则完成排序。我们来通过演示图,更...原创 2018-08-27 21:19:30 · 565 阅读 · 1 评论 -
排序算法:简单选择排序
简单选择排序是一种选择排序。选择排序:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止。简单排序处理流程(1)从待排序序列中,找到关键字最小的元素;(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。如图所示,每趟...原创 2018-08-27 21:21:47 · 725 阅读 · 1 评论 -
排序算法:堆排序
在介绍堆排序之前,首先需要说明一下,堆是个什么玩意儿。堆是一棵顺序存储的完全二叉树。其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。其中每个结点的关键字都不小于其孩子结点的关键字,这样的堆称为大根堆。举例来说,对于n个元素的序列{R0, R1, … , Rn}当且仅当满足下列关系之一时,称之为堆:(1) Ri <= R2i+1 且 Ri <= R...原创 2018-08-27 21:25:48 · 236 阅读 · 1 评论 -
排序算法:归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序的基本思想将待排序序列R[0…n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表...原创 2018-08-27 21:30:28 · 401 阅读 · 1 评论 -
深入理解树(二叉、二叉搜索树)
1树什么是树?树是一种类似于链表的数据结构,不过链表的结点是以线性方式简单地指向其后继结点,而树的一个结点可以指向许多个结点;数是一种典型的非线性结构;树结构是以表达具有层次特性的图结构的一种方法;相关术语 根节点:根节点是一个没有双亲结点的结点,一棵树中最多有一个根节点(如上图的结点A就是根节点); 边:边表示从双亲结点到孩子结点的链接(如上图中所有的链接);...原创 2018-08-20 22:11:36 · 1490 阅读 · 0 评论