
算法
文章平均质量分 67
JoesonChan
这个作者很懒,什么都没留下…
展开
-
你还应该知道的哈希冲突解决策略
哈希表概述哈希表的哈希函数输入一个键,并向返回一个哈希表的索引。可能的键的集合很大,但是哈希函数值的集合只是表的大小哈希函数的其他用途包括密码系统、消息摘要系统、数字签名系统,为了使这些应用程序按预期工作,冲突的概率必须非常低,因此需要一个具有非常大的可能值集合的散列函数密码系统:给定用户密码,操作系统计算其散列,并将其与存储在文件中的该用户的散列进行比较。(不要让密码很容易被猜出散列...原创 2019-12-10 00:28:11 · 785 阅读 · 0 评论 -
Double Hashing(双重hash)
双重哈希是开放寻址哈希表中的冲突解决技术。双重哈希的思想是在发生冲突时对键做第二个哈希函数。双重哈希可以处理:(hash1(key) + i * hash2(key)) % TABLE_SIZE这里 hash1() 、 hash2() 是hash 函数,TABLE_SIZE 是hash表大小(如果发生冲突,i递增然后重复运算)通俗的二次Hash函数:hash2(key) ...转载 2019-12-09 10:59:20 · 22569 阅读 · 2 评论 -
排序汇总(Java实现)
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。那什么是稳定的排序算法呢?就是在排序的过程中,相等的两个数并不会在排列后中为位置发生次序发生颠倒(一般而言,交换相隔很远的元素的算法是不稳定的)时间效率分析汇总 排序法 平均时间 ...原创 2013-12-24 16:52:21 · 3941 阅读 · 0 评论 -
Kmp字符串匹配算法
上一篇文章,已经讲过了Horspool匹配算法,确实Horspool是一种优秀的算法,它实现了θ(n)的一般效率对文本串的查找,但也有一种算法——Kmp,它也能实现这种效率原创 2013-09-28 23:02:07 · 1033 阅读 · 0 评论 -
AC自动机——1 Trie树(字典树)介绍
之前,我们介绍了Kmp算法,其实,他就是一种单模式匹配。当要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题。当然你也可以用KMP算法求出,那么它的时间复杂度为O(c*(m+n)),c:为模式串的个数。m:为模式串的长度,n:为正文的长度,那么这个复杂度就不再是线性了,我们学算法就是希望能把要解决的问题优化到极致,这不,AC自动机就派上用场了。原创 2013-10-15 23:56:45 · 7630 阅读 · 0 评论 -
霍纳法则和二进制幂
首先说一下霍纳法则,这对于多次幂来说,减少乘法是很重要的,因为相比加法,乘法的执行效率更低我们先看一下这样一个多项式 p(x) = 2*x^4 - 1*x^3 - 3*x^2 + 1*x^1 - 5 = x ( x ( x ( 2x - 1 ) + 3 ) + 1 ) - 5原创 2014-01-07 01:16:34 · 7097 阅读 · 2 评论 -
全局id生成策略对比
目录方法一: 用数据库的 auto_increment 来生成方法二:单点批量ID生成服务方法三:uuid / guid方法四:取当前毫秒数方法五:使用 Redis 来生成 id方法六:Twitter 开源的 Snowflake 算法全局id两大核心需求:全局唯一 趋势有序方法一: 用数据库的 auto_increment 来生成优点:此方法使用数...转载 2019-04-22 03:09:41 · 2820 阅读 · 0 评论 -
三路快排
public class QuickSort3Way { public static void main(String[] args) { int[] nums = new int[]{10, 8, 9, 4, 2, 7, 6}; sort(nums, 0, nums.length - 1); System.out.println();...原创 2019-04-27 15:58:46 · 2662 阅读 · 0 评论 -
最大公约数问题
问题描述写一个程序, 求两个正整数的最大公约数。如果两个正整数都很 大 ,有什么简单的算法吗?例如,给定两个数 1 100 100 210 011,120 200 021,求出其最大的公约数解法一public int gcd(int x, int y){ return y == 0 ? x : gcd(y, x % y);}解法二public int gcd(i...原创 2019-06-01 13:23:39 · 3928 阅读 · 0 评论 -
【DFS】打印从左方向看到的二叉树
问题描述打印从左往右看到的二叉树(就是打印每层第一个节点)二叉树的左(右)视图即:以从上到下的顺序,输出一颗二叉树每一层最左(右)端的节点,结果就是其左(右)视图。如下图,左视图为 6,5,0,3public static List<String> solution(Node node){ if(null == node){ retur...原创 2019-06-02 18:11:10 · 2484 阅读 · 0 评论 -
高斯消去法
对于形如一下的方程组,联立很容易借出来,可当变量个数达到一定数目,那会导致算法变得非常笨重2x + y - z = 8 \quad (L_1)-3x - y + 2z = -11 \quad (L_2)-2x + y + 2z = -3 \quad (L_3)原创 2014-01-08 00:18:26 · 4792 阅读 · 0 评论 -
计数排序
比较计数比较计数的思想就是算出列表中小于该元素个数,并把结果记录在一张表,在根据表,指出元素在有序表的位置比较计数的思想确实很简单,接下来,看它的实现代码吧原创 2014-01-09 01:19:32 · 3758 阅读 · 0 评论 -
贪婪算法——3 Dijkstra算法
/** * Dijkstra算法(单起点最短路径) * 基于贪婪算法,每次各点到起点的距离中选出最小权重(该值u初始值为点到起点的距离, 如果点没有连接起点的边,则值为正无穷)的点n加入到树中 * ,新加入点应该有一个值记录到起点的距离d,在遍历剩下未加入树的点,如果当前点u值大于新加入点n到当前点的距离d1+d, * 则当前点将更新为d1+d,如此重复,直至全部点加入树 * *原创 2014-01-21 12:54:40 · 1221 阅读 · 0 评论 -
1的数目
这是题目:给定一个十进制正整数 N,写下从1 开始,到 N的所有整数,然后数一下其中出现的所有“1”的个数其实这个问题,我们可以暴力的去实现它,不过时间效率会是一个很大的问题public int sum1(int n) { int iNum = 0; int count = 0; for (int i = 1; i <= n; i++)原创 2013-10-17 00:45:05 · 3342 阅读 · 0 评论 -
BloomFilter 大数据处理
Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 一. 实例 为了说明Bloom Filter存在的重要意义,举一个实例: 假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。为了避免原创 2013-12-08 00:29:36 · 3659 阅读 · 0 评论 -
动态规划——3 floyd算法
/** * Floyd算法<br/> * 计算完全最短路径<br/> * k >= 0, Dij(0) = Wij, Dij(k) = min{Dij(k-1), Dik(k-1) +Dkj(k-1)} <br/> * * O(n^3) * @author chenxuegui * */原创 2014-01-21 12:46:24 · 1140 阅读 · 0 评论 -
动态规划——5 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m
这是一道中兴的面试题题目:输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.原创 2014-01-23 22:46:12 · 8268 阅读 · 0 评论 -
动态规划——2 Warshall算法
/** * Warshall算法<br/> * 计算举证传递闭包,就可以看图有没有通路<br/> * Rij(k) = Rij(k) | Rik(k-1) && Rkj(k-1) * * O(n^3) * * @author chenxuegui * */public class Warshall{ public static void main(String[] args) {原创 2014-01-21 12:43:29 · 1400 阅读 · 0 评论 -
动态规划——4 背包问题
/** * 背包问题<br/> * V[i][j]= <br/> * (1)max{V[i-1,j],vi+V[i-1,j-wi]} (j-wi >=0) <br/> * (2)V[i-1,j] (j-w1 < 0) * * <br/> * <br/> * 初始条件 : j>=0,V[0][j] = 0; i >=0,V[i][0] = 0 * * <br/> * O(nW原创 2014-01-21 12:49:10 · 946 阅读 · 0 评论 -
全排序
/** * 全排列 * * @author 陈雪桂 * */public class AllRange{ static int count = 0; public static void main(String[] args) { AllRange allRange = new AllRange(); char[] a = allRange.init(args)原创 2014-01-03 00:20:48 · 4133 阅读 · 2 评论 -
最长回文串长度——manacher算法
网上有不少对manacher算法的解释,但总会存在某些漏洞,在这里给一个整理过的版本,并用Java给予实现首先,在字符串s中,用rad[i]表示第i个字符的回文半径,即rad[i]尽可能大,且满足:s[i-rad[i],i-1] = s[i+1,i+rad[i]]很明显,求出了所有的rad,就求出了所有的长度为奇数的回文子串。至于偶数的怎么求,最后再讲。原创 2014-02-18 17:48:22 · 3471 阅读 · 0 评论 -
完全背包问题的改进实现
完全背包问题就是每个东西都不限数量的,01背包问题呢,则是限制数量为1对于改进了的01背包问题,也有改进了的背包问题,他们的想法上是一致的,只不过实现上有了一点差别也是比较简单的,亲手debug一下吧/** * 完全背包问题<br/> * * f[v]=max{f[w],f[w-w[i]]+v[i]}<br/> * 也就是f[i][...原创 2014-03-08 18:25:37 · 4084 阅读 · 0 评论 -
贪婪算法——2 Kruscal算法
/** * Kruscal算法求最小生成树 * * Kruscal算法把一个加权连通图G=最小生成树看作是一个具有V-1条边的无环子图 * * 按照权重的非递减顺序对图中的边进行排序,吐过加入的边构成回路,则把该边跳过 * * * 并查算法 * 快速查找:数组 O(n^2) * 快速查找:链表 O(nlogn) * 快速求并:树 O(n+mlogn) *原创 2014-01-21 12:53:21 · 1050 阅读 · 0 评论 -
贪婪算法——1 Prim算法
/** * Prim 算法构建最小生成树(节点必须含有权重)<br/> * * 当中每个顶点包含两个标记:(1)指出了最近的树中顶点和边的权重; (2)被选中的顶点和边加粗表示<br/> * * 加入节点u:<br/> * (1)把u*从集合V-Vt移动到树的顶点集合Vt中(V为已加入树的节点的集合,Vt为还没加入树的节点的集合)<br/> * (2)对于集合V-Vt中每一个剩下的顶点u,如果它用一条比u当前距离标记更短的变和u*相连,分别把它的标记更新为u*以及u与u*之间的权重<br/原创 2014-01-21 12:51:46 · 1644 阅读 · 0 评论 -
动态规划——1 计算二项式系数
/** * 计算二项式系数 <br/> * 动态规划 * O(nk) * * @author chenxuegui * */public class BinomialCoefficient{原创 2014-01-21 12:41:33 · 2326 阅读 · 0 评论 -
Horspool字符串匹配算法
本文要在掌握了Kmp算法的基础上阅读比较妥当Horspool和Kmp算法有点相识,都是采用空间换时间的想法,从而达到算法运算速率的提高,运算效率也都是θ(n)原创 2013-09-27 01:04:07 · 2576 阅读 · 0 评论 -
01背包的改进实现
居然没想到背包问题还可以这么实现,在空间复杂度上达到O(W)次,有点不可思议啊比较简单,不解释了,debug一下就明白了/** * 背包问题<br/> * f[w]=max{ f[v],f[w-w[i]]+v[i]}<br/> * 也就是f[w][i] = max{f[w][i],f[w-w[i]+v[i]}<br/> * 时...原创 2014-03-08 00:50:36 · 4417 阅读 · 0 评论