算法与数学
文章平均质量分 87
Q-WHai
O ever youthful,O ever weeping.
展开
-
密码学:RSA加密算法详解
RSA算法一直是最广为使用的"非对称加密算法"。本文旨在说明RSA加密算法的原理及实现,而其相关的数学部分的证明则不是本文内容。原创 2016-02-29 18:03:37 · 56456 阅读 · 3 评论 -
北大OJ百练——4075:矩阵旋转(C语言)
给定一个n*n的矩阵,求出该矩阵顺时针旋转90度后的矩阵。原创 2014-04-18 14:22:10 · 4712 阅读 · 0 评论 -
北大OJ百练——3179:最长单词(C语言)
输入一个英文句子,长度不超过200个字符。其中可包含的符号只有逗号","和句号"."。输出句子中最长的一个单词。如果有多个这样的单词,输出最后出现的。原创 2014-04-20 13:53:53 · 2976 阅读 · 0 评论 -
北大OJ百练——2721:忽略大小写比较字符串大小
一般我们用strcmp可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止。如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。但在有些时候,我们比较字符串的大小时,希望忽略字母的大小,例如"Hello"和"hello"在忽略字母大小写时是相等的。请写一个程序,实现对两个字符串进行忽略字母大小写的大小比较。原创 2014-04-24 20:07:11 · 1755 阅读 · 0 评论 -
POJ-2746:约瑟夫问题(Java版)
有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。原创 2014-08-07 22:18:33 · 1558 阅读 · 0 评论 -
POJ-4004:数字组合(用位移方法解组合数问题,Java版)
看完题目大家应该就会想到这题可以用一个组合数的思路去编写代码。也就是说我们从给出的一个数组中去随机地抽取中若干个数相加,相加的和要等于给出的那个数。虽然大致思想是没错了,但是,具体的思路是怎么样的呢?原创 2014-08-15 17:31:22 · 2258 阅读 · 0 评论 -
POJ-2942:吃糖果
吃到第j颗糖果的吃巧克力的方案数目就是我在第i+1天的时候吃第j+1和吃j+2颗糖果的和。可能你会问我为什么。那我这样来问一个问题,我在第i+1天的时候只了1颗糖果,那么我剩下的假设有m颗糖果要k天吃完是不是和我在第i+1天的时候只了2颗糖果,那么我剩下的m-1颗糖果要n天吃完是两种不同的方案?正是如此,所以我们就可以依次递推。原创 2014-08-20 23:27:20 · 1349 阅读 · 0 评论 -
算法:程序设计之并查集
之前一直都是听说并查集,感觉是一个神乎其技,狂拽酷炫。却没有想过在自己学习并查集之前,自已在解决问题的时候也能够想到一个和并查集异曲同工的方法。这个还是很愉快的。原创 2015-09-27 23:58:38 · 1696 阅读 · 0 评论 -
数据结构:关于AVL树的平衡旋转详解
前言 本文是基于你已经有一定的二叉排序树知识。如果你还是小白,可以参考我之前的博客:《数据结构:二叉搜索树(BST)的基本操作》。所以,在本文中不会再出现关于BST树的基本知识。版权说明著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。作者:Q-WHai发表日期: 2015年12月28日链接:https://qwhai.blog.csdn.net/ar...原创 2015-12-28 12:49:20 · 28296 阅读 · 1 评论 -
Java版SMS4加密算法
本算法是一个分组算法。该算法的分组长度为128比特,密钥长度为128比特,也就是16个字节。加密算法与密钥扩展算法都采用32轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。所有在SMS4的基础类中,你会看到加密和解密的基础函数是同一个,只是需要一个int型的标志位来判断是加密还是解密。原创 2015-01-13 17:11:38 · 13480 阅读 · 1 评论 -
北大OJ百练——4073:最长公共字符串后缀(C语言)
给出若干个字符串,输出这些字符串的最长公共后缀。原创 2014-04-17 00:31:46 · 3221 阅读 · 0 评论 -
北大OJ百练——4074:积水量(C语言)
凹凸不平的地面每当下雨的时候总会积水。假设地面是一维的,每一块宽度都为1,高度是非负整数,那么可以用一个数组来表达一块地面。当下过雨后,地面就会积水,上图中蓝色的区域就是积水区域。现在给你一个数组表示地面,求下过雨后这块地面有多少积水量(假设不蒸发、不渗透)。原创 2014-04-16 20:27:23 · 4455 阅读 · 1 评论 -
排序算法系列:选择排序算法
选择排序算法也需要将一个完整的序列切分成两个部分,一个部分有序,一个部分无序。这一点它和插入排序是一致的。在前面我们说插入排序是将第 [i + 1] 个元素插入到第一部分的有序序列中,如果你还有印象的话。那么在选择排序中则是第 j 个元素(i < j <= n),插入到第 i 个位置。原创 2016-05-24 17:20:39 · 3588 阅读 · 0 评论 -
全排列算法的全面解析
对数组进行全排列是一个比较常见问题,如果是一个比较喜欢考算法的公司(貌似一些大公司都比较喜欢考算法),那么估计就会考察应聘者这个全排列的问题了(就算不让你编写完整代码,也会让你描述大致的思路)。这个问题也难也难,说易也易,下面我就来对这个问题进行一个比较全面的解析吧。如有遗漏,还望指正。原创 2016-03-27 00:10:50 · 42192 阅读 · 15 评论 -
Trie树进阶:Double-Array Trie原理及状态转移过程详解
Trie树本身就是一个很迷人的数据结构,何况是其改进的方案。在本博客中我会从DAT(Double-Array Tire)的原理开始,并结合其源代码对DAT的状态转移过程进行解析。如果因此你能从我的博客中有所收获或启发,It's my pleasure.原创 2015-10-22 15:54:53 · 23521 阅读 · 7 评论 -
排序算法系列:基数排序
今天要说的这个排序算法很特殊,它不需要直接对元素进行相互比较,也不需要将元素相互交换,你需要做的就是对元素进行“分类”。这也是基数排序的魅力所在,基数排序可以理解成是建立在“计数排序”的基础之上的一种排序算法。在实际项目中,如果对效率有所要求,而不太关心空间的使用时,我会选择用计数排序(当然还有一些其他的条件),或是一些计数排序的变形。原创 2016-06-16 23:14:07 · 83359 阅读 · 22 评论 -
排序算法系列:归并排序算法
上一篇我们说了一个非常简单的排序算法——选择排序。其复杂程序完全是冒泡级的,甚至比冒泡还要简单。今天要说的是一个相对比较复杂的排序算法——归并排序。复杂的原因不仅在于归并排序分成了两个部分进行解决问题,而是在于,你需要一些算法的思想支撑。原创 2016-05-27 16:32:19 · 24511 阅读 · 3 评论 -
深入理解Aho-Corasick自动机算法
0.前言 我总是对那些具有状态转移过程的算法,心怀敬意。 例如:递归、递推、动规、DAT 以及现在要说的 AC 自动机算法。 数学真是优美! —— 致那些牛逼到不行的数学家们1.版权说明商业转载请联系作者获得授权,非商业转载请注明出处。本文作者:Q-WHai发表日期: 2015年...原创 2015-10-24 13:04:39 · 23632 阅读 · 7 评论 -
排序算法系列:插入排序算法
直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。原创 2016-03-24 08:53:18 · 13242 阅读 · 5 评论 -
排序算法系列:Shell 排序算法
概述希尔排序(Shell Sort)是 D.L.Shell 于 1959 年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是 O(n2n^{2}) 的,希尔排序算法是突破这个时间复杂度的第一批算法之一。希尔排序是一种插入排序算法。原创 2016-04-12 00:54:00 · 8703 阅读 · 1 评论 -
排序算法系列:冒泡排序与双向冒泡排序
**排序算法**应该算是一个比较热门的话题,在各个技术博客平台上也都有一些博文进行了一定程度的讲解。但还是希望能从自我完善的角度出发,可以更详细、全面、形象地表达这些算法的精髓。本文就先从最简单的冒泡排序开始说起,别说你已经彻底了解了冒泡排序算法(虽然一开始我也是这样以为的)。原创 2016-01-29 15:25:32 · 36483 阅读 · 16 评论 -
LeetCode-73. Set Matrix Zeroes
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.Could you devise a constant space solution?原创 2016-04-17 22:46:42 · 4058 阅读 · 1 评论 -
Java实现MD5加密和文件校验
MD5的加密方式是一种哈希加密。一些主流的编程语言都已经实现了MD5的加密,所以如果你的程序或是系统涉及到在多种语言之间的校验,那么MD5可以是备选之一。不过因为MD5是采用哈希函数来进行的加密,所以它无关密钥,也就是说在确定了明文的情况下,MD5就可以加密。不过MD5是不可逆的,只能加密,不能解密。原创 2015-07-01 22:51:46 · 5453 阅读 · 1 评论 -
密码学:SHA1加密算法详解
对于散列/哈希的加密原创 2014-09-24 19:19:28 · 3668 阅读 · 0 评论 -
数据结构:字典树的基本使用
概述: 说来也奇怪,最近碰到的很多问题都需要用字典树来解决,索性就来研究一番。在这篇博客中,我会通过一些实例来讲解一下字典树的一些基本使用。例如:创建、添加、查找、按字典序排序、按数值大小进行排序(对于一些数值序列的排序)等等。关于字典的实际应用实例,请参见本人的另一篇博客:《算法:两种对拼音进行智能切分的方法》本文链接:http://blog.csdn.net/lemo...原创 2015-10-19 00:20:54 · 15635 阅读 · 0 评论 -
大数据算法:对5亿数据进行排序
0.前言:在大数据研究的路上,我们总要对一些很大的数据进行各种各样的操作。比如说对数据排序,比如说对数据统计,比如说对数据计算。而在大量的数据面前,我们总是束手无策,因为我们无法在限定时间的情况下,在效率上做到让人满意,也无法在限定空间的情况下,能够快速解决问题。可能我们在一些日常的开发过程中,没有遇到过这些问题。不过,现在是时候来考虑一下这样的问题了。因为,现在正值大数据的时代。在本文中...原创 2015-10-19 23:32:03 · 44628 阅读 · 8 评论 -
算法之动态规划初步(Java版)
算法的重要性是不言而喻的。可能是你会不屑于听这样的话,是因为在我们的实际开发中,用到算法的地方真是太少了。对于这一点我并不否认,因为对于一个初级的开发者而言,算法显得太过高深了。如果我们想去实现一个功能,通常的做法就是百度或是Google。这就是为什么会有那么一句调侃之辞:我们不生产代码,我们只是代码的搬运工。 当我们已经完成了初级开发者的这一过程时,我们应该想着怎么去优化自己的代码,从而让自己的代码更加优美,也更显B格。原创 2015-08-04 09:21:50 · 6982 阅读 · 0 评论 -
Java实现图的深度和广度优先遍历算法
最近要学习写网络爬虫,所以把图的深度和广度搜索都再温习一下。原创 2015-08-11 10:21:14 · 24086 阅读 · 4 评论 -
使用Python运算一个字符串表达式
如何运行一个表达式,例如:12+23*4/2这个我想大家都很了解。不过,如果这个表达式是一个字符串呢?或是这样来描述,一个表达式被写成了一个字符串,我们又应该如何去运行并求得值呢?原创 2015-04-09 21:20:05 · 10383 阅读 · 2 评论 -
模拟计算机网络中的零比特填充
学网络的时候,学到一个零比特填充法。是用来保证数据在网络中传输的时候有一个比较稳妥的方式不产生错误。用零比特填充是因为我们要让7EH(01111110)这个16进制数据表示数据的结尾,正因为如此,所以我们不能让数据本身包含这个7E数据,因为这样的话,数据就会被认为是结束。我们采用的方法是只让连续的5个‘1’在一起,当有6个‘1’的时候,在第5个‘1’和第6个‘1’之间填充一个‘0’,下面笔者就这一个方法用代码的方式来实现。由于只是想实现这个基本功能,所以就不在文件末尾添加7EH结束标志了。。。。原创 2014-04-17 11:39:40 · 12436 阅读 · 5 评论 -
模拟网络通信中存储转发的分组交换算法
分组交换很简单,就是将接收端接收到的一连串数据先存储下来,然后进行分组(分组的目的是因为原数据长度太长,在通信中,因为噪音的干扰会失真重传。那么,这样的话发送者就必须从头开始将原数据再发送一次,这样的通信在数据量比较多的情况显然就会影响到通信效率),在分组的数据上进行添加首部,把这样添加地首部的数据放网络上进行传输。在目的端,再把分组的数据除掉首部,进行组装,即是一个还原的过程。原创 2014-04-17 11:27:45 · 3539 阅读 · 0 评论 -
算法:模式匹配之KMP算法
昨天看到《算法导论》里的第32章:字符串匹配,说到一个关于字符串匹配的很好的一个算法KMP。关于什么是KMP以及KMP的来源,不是本文的范畴,请读者自行查阅相关资料。本文主要是来说明KMP算法的思路和过程,以及它相比朴素的字符串模式匹配有什么优势。原创 2015-09-16 13:47:48 · 4557 阅读 · 0 评论 -
算法:两种对拼音进行智能切分的方法
前言: 最近在做一个调研的工作。研究的对象是搜索引擎中关键词的纠错功能。就像百度中搜索某一个关键词“ABC”,它会在搜索的结果中对此关键词进行纠正,然后会显示:你要找的是不是“ABD”。这种之类的。这个是背景,不过本文中还没不是介绍这一功能,这一功能的说明会在我的调研结束之后写在我的博客中。 本文要介绍的是,对拼音的拼写进行智能切分。比如:qinshimingyuezhijunlint...原创 2015-10-13 08:48:34 · 10092 阅读 · 3 评论 -
数据结构:关于重建二叉树的三种思路
前言: 前几天在温习《编程之美》这本书的时候,看到了二叉树的重建。正好,也想复习一下数据结构的知识,就来写了一个小Demo。居然有新发现(本文中的第三种方式)。 我们在学习数据结构的时候,肯定可以很轻松地编写对二叉树的三种遍历过程。分别是前序、中序和后序遍历。 这里要说的不是对二叉树遍历,而是要通过一些遍历过程来重建一棵二叉树。比例,告诉你有一棵二叉树前序遍历的结果为:ABC;中...原创 2015-11-24 00:27:46 · 16175 阅读 · 0 评论 -
排序算法系列:奇偶排序算法
在上一篇中我们说到了**冒泡排序**的原理及实现详解。冒泡排序是一种交换排序,本文还是接着上一讲,说说另一种交换排序算法——奇偶排序。原创 2016-02-01 13:24:53 · 25936 阅读 · 4 评论 -
操作系统:基于页面置换算法的缓存原理详解(下)
作为一个学计算机的一定听过缓存(注意这里是缓存,不是缓冲)。比如我们在登录网页时,网页就可以缓存一些用户信息;比如我们在写界面代码的时候,可能就会遇到界面的绘制是基于一些缓存算法的。所以,了解一下缓存算法的原理还是有必要的。原创 2016-01-13 13:40:06 · 3638 阅读 · 0 评论 -
操作系统:基于页面置换算法的缓存原理详解(上)
作为一个学计算机的一定听过缓存(注意这里是缓存,不是缓冲)。比如我们在登录网页时,网页就可以缓存一些用户信息;比如我们在写界面代码的时候,可能就会遇到界面的绘制是基于一些缓存算法的。所以,了解一下缓存算法的原理还是有必要的。原创 2016-01-07 13:05:57 · 6559 阅读 · 1 评论 -
排序算法系列:快速排序算法
概述 在前面说到了两个关于交换排序的算法:冒泡排序与奇偶排序。 本文就来说说交换排序的最后一拍:快速排序算法。之所以说它是快速的原因,不是因为它比其他的排序算法都要快。而是从实践中证明了快速排序在平均性能上的确是比其他算法要快一些,不然快速一说岂不是在乱说? 本文就其原理、过程及实现几个方面讲解一下快速排序算法。版权声明著作权归作者所有。 商业转载请联系作者获得授权,...原创 2016-03-01 15:40:07 · 49947 阅读 · 8 评论 -
数据结构:二叉搜索树(BST)的基本操作
概述 学习过数据结构的童鞋都应该知道,对树的操作是一些最基本的技能(本文是对后面要写B树、B-树、B+树的一个前导,已经熟悉的朋友可以跳过了)。而在树结构中,二叉树又是最基础的。虽然这些知识是比较基础的,不过对于BST的操作中,删除是一个相对比较麻烦的。这对于新手来说可能不太好理解,下面就以BST中节点的删除为主,其他操作为辅的策略来编写本篇文章。希望对你能有所帮助。版权说明著...原创 2015-12-21 16:36:56 · 4100 阅读 · 0 评论 -
算法:关于生成抽样随机数的这些算法
这里你是不是会说,生成随机数有什么难的?不就是直接使用Java封装好了的random就行了么?当然对于一般情况下是OK的,而且本文要说明的这些算法也是基于这个random库函数的。本文主要是针对抽样这一行为进行的,而抽样本身有一个隐含的规则就是不要有重复数据。好了,有了这些说明。你可以先尝试着用一些自己的想法来实现不重复地生成随机数。原创 2015-12-22 13:28:51 · 9029 阅读 · 5 评论