Indexing
abant2
世界上最菜的arcem
展开
-
7.2 FM Index Matching
首先注意,在BW矩阵中,相同前缀都是连续的,这是由排序决定的。第二个观察是最后一列出现在第一列前面(这还用观察?)寻找过程:从最短匹配的后缀开始,然后匹配越来越长的后缀。这里注意,前面存的C数组好像存的是每个字母开始的索引,不是个数,个数可以通过索引相减得要匹配模式aba,先找到最后一个a,4个,匹配到右边是两个,再到左边又可以得到了。整个过程还真是O(m)的。。很强啊。现在就可以回答count问题了,很简单。一共有两个可以匹配的。...原创 2020-12-04 23:35:29 · 419 阅读 · 0 评论 -
7.1 利用Wavelet做反转
回忆下之前是怎么反转BWT的,存第一列和最后一列,然后O(N)就可以用迭代的方式找到。现在,考虑如何利用学过的知识加速这一过程。可以对BWT建一颗Wavelet Tree,由于第一列和最后一列,字母相对顺序相同,所以左边的rank等于右边的rank。如何知道一个字母的个数?存或者高阶操作?上图为具体过程,可知字母个数是预存的。其中rank由于要找到对应节点,所以是log复杂度。但预存rank其实也不复杂,甚至会降低复杂度。。现在考虑如何做索引(indexing),即找到子串位置(终于来了)FM I原创 2020-12-04 23:02:25 · 183 阅读 · 0 评论 -
6.2 Wavelet Tree 复杂度
先考虑平衡Wavelet Tree,复杂度如下,易于理解对于上图,在我们已经存储最长的字符串的情况下,如何存储这些子串呢?原创 2020-12-04 22:20:55 · 681 阅读 · 0 评论 -
6.1 Wavelet Trees RSA操作
分割树常常用来分割‘值空间’,比如二叉搜索树,堆。这节课为了让字符串更好索引,用树来分割它的字母空间。如下图,我们可以不停分割直到剩余的是单一字母(即叶子节点)可以简化两个问题:1 你弄完这个还能搞索引吗?RSA操作2 这个树有多大?在此文中,旨在解决第一个问题,RSA还能用吗?指向之前提到的压缩问题(对A有影响)可以看到,在这个树里,每个节点都是bitvector,我们可以通过求解子问题,来merge到对字符串的RSA上图是字符串的RSA操作,把0和1换成对应字符就好。access操原创 2020-12-04 21:47:50 · 266 阅读 · 0 评论 -
5 位向量bitvectors RSA操作
位向量是一个非常简单的数据结构,里面只有0和1,比如我们存一个is_prime数组,就可以用位向量表示对应索引下是否是素数。DNA序列的one-hot表示: 也可以用bitvector接下来讨论三种对位向量的查询方式: RSA(Rank, Select, Access)基本上所有的查询操作都可以通过这三个解决,先看最简单的,Access,输入:索引 (or offset),输出:索引处的值,所以这只是单纯地用就行了。但有可能会变难,如果要对bitvector进行压缩,那要返回的就是解压后的值,需要原创 2020-12-04 19:58:32 · 211 阅读 · 0 评论 -
4 Burrow-Wheeler 变换
从k阶熵和0阶熵的比较中可以看出,k阶熵能储存更多的信息,从而具有更强大的压缩能力。而相比来说,0阶熵就有点太弱了。而BW变换可以作用于0阶熵之前,让0阶熵也拥有强大的能力。BW变换两种操作:旋转(rotation):把第一个字符放到字符串后面,可进行多次旋转操作,可看作每次操作将字符串分成两部分,交换前缀和后缀。对一个长度为n的串,共有n种可能notation:首先要知道,前缀小于字符串,比如as < ash(只是字典的约定,不是法律)我们定义一个$符号作为文本的终结符,让美元符号小于所有字原创 2020-12-03 23:41:40 · 534 阅读 · 0 评论 -
3 高阶熵
0阶熵假设各个词是独立的,但是正常文本中词和词都是有关系的。类似于马氏链,下个状态只和当前状态有关。思路:相同字符,不同的上下文,产生不同的编码,类似下图这样也可用左边的上下文,在此节中用哪种都可思路:仍用之前的做法,不过把统计字符变成统计字符及上下文(作为一个整体)下图为,只考虑a右边一个字母时,不同上下文下a的编码下图为一颗建好的一阶?树下图为高阶熵定义效果:<= n(HK+1) 右边为最佳值...原创 2020-11-29 22:25:10 · 573 阅读 · 0 评论 -
2 熵与编码
先来尝试编码一副扑克牌,首先考虑花色+rank的方式编码,如下图,即第一张牌是0,最后一张是51(一共52张牌)在一个集合中,假设最大元素为M,那么我们对M编码需要的最小编码长度为log2M(用二进制表示这个数字),我们将这个数字称为最坏编码长度常见的最坏编码长度:掷硬币:log2 = 1,掷骰子:log6=3,轮盘赌:log37 = 6编码新思路:用的频繁的字符应该给更短的长度,这样会缩短总编码长度。目标:使编码的平均长度的期望最小,即:最小化因此引入香农熵的定义,先对一个随机变量的熵进行原创 2020-11-29 16:53:57 · 339 阅读 · 0 评论 -
1 介绍:索引
当你有大量id-年龄数据,代表投票者年龄列表。你想统计27岁有多少人,如果是无序数据,你需要O(N)的扫描来完成;如果是有序数据(按年龄排好),你需要两次O(logN)的二分查找找到第一个投票的27岁的人和最后一个投票的27岁的人。排好序的数据会让搜索更加高效。压缩:可以用年龄-人数 这样的数据结构来代替之前的数据,如果其中年龄只比上一个大一,可以只用一位数据来表示他比上一个大一。压缩的意义是发现数据中的潜在信息,让我们更高效的搜索或使用。两种常见策略:分组和排序分组:逛超市,每一条道告诉你这条道里有原创 2020-11-29 13:15:30 · 72 阅读 · 0 评论