lifehack
玩过大数据,做过搜广推,搞过密码学,如今在大模型搬砖
展开
-
【数据压缩】LZ77算法原理及实现
LZ77算法是采用字典做数据压缩的算法,由以色列的两位大神Jacob Ziv与Abraham Lempel在1977年发表的论文《A Universal Algorithm for Sequential Data Compression》中提出。基于统计的数据压缩编码,比如Huffman编码,需要得到先验知识——信源的字符频率,然后进行压缩。但是在大多数情况下,这种先验知识是很难预先获得。因此,设计一种更为通用的数据压缩编码显得尤为重要。LZ77数据压缩算法应运而生,其核心思想:利用数据的来进行数据压缩。原创 2023-06-28 16:01:52 · 704 阅读 · 0 评论 -
【图论】深入理解Dijsktra算法
Dijsktra算法是大牛Dijsktra于1956年提出,用来解决有向图单源最短路径问题;但是不能解决负权的有向图,若要解决负权图则需要用到Bellman-Ford算法。Dijsktra算法思想:在DFS遍历图的过程中,每一次取出离源点的最近距离的点,将该点标记为已访问,松弛与该点相邻的结点。有向图记为Gnm,其中,n为顶点数,m为边数;且eab表示从结点a到结点b的边。di记录源点到结点i的距离,U为未访问的结点集合,V为已访问的结点集合。原创 2023-06-28 14:39:38 · 646 阅读 · 0 评论 -
Java中的逆变与协变
逆变与协变用来描述类型转换(type transformation)后的继承关系,其定义:如果AAABBB表示类型,f⋅f(\cdot)f⋅表示类型转换,≤\leq≤表示继承关系(比如,A≤BA \leq BA≤B表示AAA是由BBB派生出来的子类);f⋅f(\cdot)f⋅是逆变(contravariant)的,当A≤BA \leq BA≤B时有fB≤fAfB≤fA成立;原创 2023-06-12 17:05:31 · 646 阅读 · 0 评论 -
【图论】求无向连通图的割点
1. 割点与连通度在无向连通图中,删除一个顶点v及其相连的边后,原图从一个连通分量变成了两个或多个连通分量,则称顶点v为割点,同时也称关节点(Articulation Point)。一个没有关节点的连通图称为重连通图(biconnected graph)。若在连通图上至少删去k 个顶点才能破坏图的连通性,则称此图的连通度为k。关节点和重连通图在实际中较多应用。显然,一个表示通信网络的图的连...原创 2014-09-30 20:43:00 · 300 阅读 · 0 评论 -
【图论】有向无环图的拓扑排序
1. 引言有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环。常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度。拓扑排序是对DAG的顶点进行排序,使得对每一条有向边(u, v),均有u(在排序记录中)比v先出现。亦可理解为对某点v而言,只有当v的所有源点均出现了,v才能出现。下图给出有向无环图的拓扑排序:下图给出的顶点...原创 2015-12-29 14:44:00 · 321 阅读 · 0 评论 -
【模式匹配】KMP算法的来龙去脉
1. 引言字符串匹配是极为常见的一种模式匹配。简单地说,就是判断主串\(T\)中是否出现该模式串\(P\),即\(P\)为\(T\)的子串。特别地,定义主串为\(T[0 \dots n-1]\),模式串为\(P[0 \dots p-1]\),则主串与模式串的长度各为\(n\)与\(p\)。暴力匹配暴力匹配方法的思想非常朴素:依次从主串的首字符开始,与模式串逐一进行匹配;遇到失配时,则...原创 2015-12-31 12:53:00 · 92 阅读 · 0 评论 -
【模式匹配】更快的Boyer-Moore算法
1. 引言前一篇中介绍了字符串KMP算法,其利用失配时已匹配的字符信息,以确定下一次匹配时模式串的起始位置。本文所要介绍的Boyer-Moore算法是一种比KMP更快的字符串匹配算法,它到底是怎么快的呢?且听下面分解。不同于KMP在匹配过程中从左至右与主串字符做比较,Boyer-Moore算法是从模式串的尾字符开始从右至左做比较。下面讨论的一些递推式都与BM算法的这个特性有关。思想首先,...原创 2016-01-02 23:30:00 · 118 阅读 · 0 评论 -
【模式匹配】Aho-Corasick自动机
1. 多模匹配AC自动机(Aho-Corasick Automaton)是多模匹配算法的一种。所谓多模匹配,是指在字符串匹配中,模式串有多个。前面所介绍的KMP、BM为单模匹配,即模式串只有一个。假设主串\(T[1 \cdots m]\),模式串有k个\(\mathbb{P} = \{ P_1, \cdots, P_k\}\),且模式串集合的总长度为\(n\)。如果采用KMP来匹配多模式串,则...原创 2016-03-06 17:00:00 · 216 阅读 · 0 评论 -
【数据压缩】Huffman编码
1. 压缩编码概述数据压缩在日常生活极为常见,平常所用到jpg、mp3均采用数据压缩(采用Huffman编码)以减少占用空间。编码\(C\)是指从字符空间\(A\)到码字表\(X\)的映射。数据压缩编码指编码后信息的长度较于原始信息要短。本文试图探讨Huffman编码是如何保证唯一可译性、如何压缩、以及压缩效率如何?前缀码前缀码的任意一码字均不为其他码字的前缀,此保证了编码的唯一可译性。比...原创 2015-11-20 11:26:00 · 165 阅读 · 0 评论 -
【数据压缩】LZ78算法原理及实现
在提出基于滑动窗口的LZ77算法后,两位大神Jacob Ziv与Abraham Lempel于1978年在发表的论文 [1]中提出了LZ78算法;与LZ77算法不同的是LZ78算法使用动态树状词典维护历史字符串。【数据压缩】LZ77算法原理及实现【数据压缩】LZ78算法原理及实现1. 原理压缩LZ78算法的压缩过程非常简单。在压缩时维护一个动态词典Dictionary,其包括了历史字...原创 2017-01-13 16:37:00 · 1372 阅读 · 0 评论 -
【数据结构】栈的应用 I :表达式求值
1. 介绍表达式分为前缀、中缀、后缀。前缀表达式,也称为波兰表达式,其特点是将操作符置于操作数的前面。后缀表达式,也成为逆波兰表达式,所有操作符置于操作数的后面。波兰表达式、逆波兰表达式均是由波兰数学家Jan Łukasiewicz所提出的。中缀表达式将操作符放在操作数中间。前缀表达式和后缀表达式相对于中缀表达式最大的不同是,去掉了表示运算优先级的括号。1.1 前缀表达原创 2013-09-24 18:51:50 · 2109 阅读 · 1 评论 -
整数压缩编码 ZigZag
在分析Avro源码时,发现Avro为了对int、long类型数据压缩,采用Protocol Buffers的ZigZag编码(Thrift也采用了ZigZag来压缩整数)。1. 补码编码为了便于后面的分析,我们先回顾下几个概念:原码:最高位为符号位,剩余位表示绝对值;反码:除符号位外,对原码剩余位依次取反;补码:对于正数,补码为其自身;对于负数,除符号位外对原码剩余位依次取反然后+1...原创 2016-06-08 16:50:00 · 252 阅读 · 0 评论 -
双数组Trie树 (Double-array Trie) 及其应用
双数组Trie树(Double-array Trie, DAT)是由三个日本人提出的一种Trie树的高效实现 [1],兼顾了查询效率与空间存储。Ansj便是用DAT(虽然作者宣称是三数组Trie树,但本质上还是DAT)构造词典用作初次分词,极大地节省了内存占用。本文将简要地介绍DAT,并实现了基于DAT的前向最大匹配的中文分词算法。1. Trie树两种实现Trie树(也称为字典树、前缀树)...原创 2017-01-09 14:49:00 · 342 阅读 · 0 评论 -
【JDK源码分析】浅谈HashMap的原理
这篇文章给出了这样的一道面试题:在 HashMap 中存放的一系列键值对,其中键为某个我们自定义的类型。放入 HashMap 后,我们在外部把某一个 key 的属性进行更改,然后我们再用这个 key 从 HashMap 里取出元素,这时候 HashMap 会返回什么?文中已给出示例代码与答案,key 更新后 hashCode 确实更新了,而且 HashMap 里面的对象就是我们原来的...原创 2016-03-17 21:49:00 · 85 阅读 · 0 评论 -
【JDK源码分析】String的存储区与不可变性
// ... literals are interned by the compiler // and thus refer to the same objectString s1 = "abcd";String s2 = "abcd";s1 == s2; // --> true // ... These two have the same value// but they ...原创 2016-01-11 17:10:00 · 64 阅读 · 0 评论 -
Scala比较器:Ordered与Ordering
在项目中,我们常常会遇到排序(或比较)需求,比如:对一个Person类按name值、age值升序做排序;在Scala中应如何实现呢?原创 2016-07-07 18:58:00 · 175 阅读 · 0 评论 -
连续子数组最大和
1. 问题描述输入一个整形数组,求数组中连续的子数组使其和最大。比如,数组x应该返回 x[2..6]的和187.2. 问题解决我们很自然地能想到穷举的办法,穷举所有的子数组的之和,找出最大值。穷举法i, j的for循环表示x[i..j],k的for循环用来计算x[i..j]之和。maxsofar = 0for i = [0, n) for j = [i, n) ...原创 2014-09-14 08:59:00 · 101 阅读 · 0 评论 -
最长回文子串
1. 问题描述回文串(palindromic string)是指这个字符串无论从左读还是从右读,所读的顺序是一样的;简而言之,回文串是左右对称的。所谓最长回文子串问题,是指对于一个给定的母串abcdedcb从所有的为回文串的子串a, ded, cdedc, bcdecdb中;找出最长的那一个bcdecdb。但是该如何判断子串是否回文然后找出最长者呢?正好Leetcode也有一个5. l...原创 2014-09-21 09:34:00 · 108 阅读 · 0 评论 -
多叉树实现类目体系
1. 引言电商类的网站(比如:京东)为了便于用户浏览商品,建立了一套类目体系,对商品进行各种粗细粒度的划分。类似地,用户画像的标签体系也划分多层级的结构。在做标签洞察时,需要将这种带有层级的体系序列化json,提供给前端。但是,标签体系是存储在MySQL数据库中,为平铺化的表结构,如何将其表达为具有层次的数据结构呢?多叉树(Multiway Tree)正好能完美地诠释类目体系,比如,一篇论文的...原创 2016-08-30 20:15:00 · 88 阅读 · 0 评论 -
【LeetCode题解】二叉树的遍历
我准备开始一个新系列【LeetCode题解】,用来记录刷题,顺便复习一下数据结构与算法。1. 二叉树二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有两个节点——左孩子结点与右孩子结点。C实现的二叉树:struct TreeNode { int val; struct TreeNode *left; // left child struct TreeNo...原创 2017-01-25 13:33:00 · 78 阅读 · 0 评论 -
【LeetCode题解】数组Array
1. 数组直观地看,数组(Array)为一个二元组<index, value>的集合——对于每一个index,都有一个value与之对应。C语言中,以“连续的存储单元”实现数组:int arr[5], *p_arr[5];数组提供以\(O(1)\)的复杂度访问元素,下标从0开始。但是,数组的插入、删除操作却非常耗时,因为这涉及到了元素间的移动。常见的矩阵,可用二维数组表示。二...原创 2017-02-08 14:51:00 · 118 阅读 · 0 评论 -
【LeetCode题解】链表Linked List
1. 链表数组是一种顺序表,index与value之间是一种顺序映射,以\(O(1)\)的复杂度访问数据元素。但是,若要在表的中间部分插入(或删除)某一个元素时,需要将后续的数据元素进行移动,复杂度大概为\(O(n)\)。链表(Linked List)是一种链式表,克服了上述的缺点,插入和删除操作均不会引起元素的移动;数据结构定义如下:public class ListNode { St...原创 2017-02-10 13:05:00 · 131 阅读 · 0 评论 -
【LeetCode题解】排序
1. 排序排序(sort)是一种常见的算法,把数据根据特定的顺序进行排列。经典的排序算法如下:冒泡排序(bubble sort)插入排序(insertion sort)选择排序(selection sort)快速排序(quick sort)堆排序(heap sort)归并排序(merge sort)冒泡排序依次比较相邻的两个元素,若逆序则交换;如此走访数列重复n次,即不再发生...原创 2017-04-10 10:59:00 · 86 阅读 · 0 评论 -
【LeetCode题解】动态规划:从新手到专家(一)
文章标题借用了Hawstein的译文《动态规划:从新手到专家》。1. 概述动态规划( Dynamic Programming, DP)是最优化问题的一种解决方法,本质上状态空间的状态转移。所谓状态转移是指每个阶段的最优状态(对应于子问题的解)可以从之前的某一个或几个阶段的状态中得到,这个性质叫做最优子结构。而不管之前这个状态是如何得到的,这被称之为无后效性。DP问题中最经典的莫过于01背包...原创 2017-07-29 20:11:00 · 124 阅读 · 0 评论 -
DFS实现排列组合
所谓排列,是指从给定的元素序列中依次取出元素,需要考虑取出顺序。比如,取出元素3, 5,因取出顺序的不同,则形成的序列{3, 5}与{5, 3}是不同的排列序列。对于长度为n的元素序列取出k个元素,则共有A(n, k)种取法。所谓组合,也是从元素序列中依次取出元素,与排列不同的是不需要考虑取出顺序;因此其取法数为C(n, k)。LeetCode有两个问题分属于组合、排列:77. Combina...原创 2017-09-12 20:29:00 · 184 阅读 · 0 评论 -
Top K问题的两种解决思路
Top K问题在数据分析中非常普遍的一个问题(在面试中也经常被问到),比如:从20亿个数字的文本中,找出最大的前100个。解决Top K问题有两种思路,最直观:小顶堆(大顶堆 -> 最小100个数);较高效:Quick Select算法。LeetCode上有一个问题215. Kth Largest Element in an Array,类似于Top K问题。1. 堆...原创 2017-01-21 10:54:00 · 78 阅读 · 0 评论 -
【算法】归并排序
1.算法简述归并排序是分治法的一种典型算法。一开始将有n个元素的待排序表看作n个子表,子表的表长为1。接下来,将n个子表依次两两归并为n/2个子表,此时这n/2个子表的表长变为2。再将n/2个子表归并为n/4个……如此归并,直至只有一个表。对待排序表(26,5,77,1,61,11,59,15,48,19),归并排序过程如下:/*the two sort原创 2014-03-31 10:07:38 · 1229 阅读 · 0 评论 -
【算法】深度优先搜索(DFS)IV
1. DFS遍历2.问题2.1 POJ 2488题目大意:有一个矩形棋盘,骑士的移动遵循一个规则——向一个方向走两格、再垂直于这个方向走一格,(有点像中国象棋的马走“日”字),问骑士可不可能不重复地走遍棋盘的每一个方块。这是一个“骑士游历”的问题。骑士最多有8种方向移动,遍历所有的移动可能。源代码:2488原创 2013-10-11 18:22:44 · 1104 阅读 · 0 评论 -
【算法】最短路径之Dijkstra(II)
1.问题1.1 POJ 1062 建立有向图:比如,物品1能被替代品2所替代,且所需金币为200;则存在一条从点2到点1的边,且边长为200。等级处理采用的是枚举。用rank[ ]表示每一节点的等级,节点0表示探险家,节点1表示国王。用M表示等级的限制,那么探险家可以交易的区间为[rank(1)-M, rank(1)] ,… ,[rank(1), rank(1)+M]。原创 2013-08-09 21:29:44 · 1004 阅读 · 0 评论 -
【算法】大整数加法
1.算法描述为了表示大整数,一般采用字符数组,这样可以表示更多位的整数。在实现大整数加法时,可模拟小学生列竖式。首先,位对齐,两个大整数的个位对个位、十位对十位、百位对百位……然后,按位相加,如果满十,则置进位为1。两个大数的高位相加时,要加上进位。长度为n的字符数组在表示大整数时,[0]表示大整数的最高位,[n-1]表示大整数的最低位(即个位)。所以,在位原创 2012-07-29 19:42:30 · 2195 阅读 · 0 评论 -
【数据结构】二叉树
1.介绍二叉树与树的差别是,二叉树中任意节点的度不超过2。二叉树是一种有序树,即左右子树之间有顺序关系,规定为左前右后。二叉树的表示:顺序表示,链式表示。顺序表示有致命的缺点:对二叉树的中间节点进行插入、删除操作时,必须相对应地调整数组中数据的位置。链式表示克服了这些缺点,所以一般采用链式表示存储二叉树。二叉树的遍历分为前序(preorder)、中序(inord原创 2013-09-22 16:07:08 · 1067 阅读 · 0 评论 -
【算法】Dancing Links (DLX) I
1.概述Dacing Links (DLX) 算法是Donald Knuth [2]提出,用以解决精确覆盖(extract cover)问题。1.1 精确覆盖问题所谓精确覆盖,是指两两不相交的子集的集合,这些子集的并集可以得到全集。完整的定义 [1]如下:在一个全集X中若干子集的集合为S,精确覆盖是指,S的子集S*,满足X中的每一个元素在S*中恰好出现一次。原创 2013-10-25 10:45:46 · 4369 阅读 · 0 评论 -
【算法】最短路径之SPFA
1.算法描述SPFA(Shortest Path Faster Algorithm)算法是由西南交通大学的段凡丁于1994提出来的,是队列优化版的Bellman-Ford。将源点加入队列;每次从队列出来一个点,对相邻的点,进行松弛操作;被松弛过且不在队列的点依次进入队列;重复操作,直至队列为空算法结束。dis[u]表示源点到点u的最短距离;queue[ ]表示队列,head原创 2013-08-16 16:40:51 · 1611 阅读 · 0 评论 -
【数据结构】Trie树
1.Trie树简介Trie树,又称字典树、前缀树,被用于信息检索(information retrieval)的数据结构。Trie一词便来自于单词retrieval。基本思想:用字符串的公共前缀降低查询时间。比如,在最优的查询二叉树中查询关键字的时间复杂度为M * log N,M是字符串最大长度,N为字符串数量;而用Trie树时,只需O(M)时间。[1] 中给出一个简单原创 2014-05-15 20:15:59 · 2406 阅读 · 0 评论 -
【算法】深度优先搜索(DFS)VI
1.数独问题对一个1~9的数,在每行、每列,每一个宫只能出现一次。因此,每一行、每一列、每一个宫均是这9个数的一个排列。2. 问题2.1 POJ 2676rvisit[ ][i]记录数i在每行(row)的访问情况,cvisit[ ][i]记录的则是每列(coloumn),svisit[ ][i]记录的则是每一个宫(subsquare)。依次扫原创 2013-10-23 20:59:05 · 1355 阅读 · 0 评论 -
【动态规划】最长公共子序列与最长公共子串
1. 问题描述子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串cnblogsbelong比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与母串保持一致,我们将其称为公共子序列。最长公共子序列(Longest Common Subsequence, LCS),顾名思义,是指在所有的子序列中最长的那一个。子串是要求更严格的一种子序列,...原创 2014-09-10 09:43:00 · 108 阅读 · 0 评论 -
【算法】深度优先搜索(DFS)II
2.问题2.1 POJ 1011题目大意:有n个数(表示小木棒的长度),分成若干个组,且每组内的数相加之和为x(即每组小木棒拼接可拼接成长度为x的木棒),求最小的x。如果在DFS中不剪枝,很容易TLE。关于本题更详细的剪枝,请参看这里。剪枝1:x肯定是n个数之和sum的约数。将n个数stick[ ]从大往小排原创 2013-10-06 19:44:44 · 1188 阅读 · 0 评论 -
【算法】深度优先搜索(DFS)III
1. DFS生成排列众所周知,1,2…n的排列一共有n!个,因此生成全排列至少需要n!的时间复杂度。如果用循环来生成排列,当n稍大时,内外循环会非常之多。可以用DFS模拟解决,代码如下:2. 问题2.1 POJ 2907题目大意:从start点出发,经过n个beeper点后,回到start点;求最短路径。思路:由于n源代码:原创 2013-10-10 21:28:45 · 1261 阅读 · 0 评论 -
【算法】汉诺塔
问题描述:有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。/*hanoi.h*/#include #include #include extern int cnt;void move(int n,char a,char b,char c);原创 2012-09-18 10:41:17 · 2840 阅读 · 0 评论 -
【算法】矩阵快速求幂
1.算法描述由于矩阵乘法具有结合律,因此A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。我们可以得到这样的结论:当n为偶数时,A^n = A^(n/2) * A^(n/2);当n为奇数时,A^n = A^(n/2) * A^(n/2) * A (其中n/2取整)。这就告诉我们,计算A^n也可以使用二分快速求幂的方法。例如,为了算出A^25原创 2013-08-26 08:43:31 · 7540 阅读 · 0 评论