算法讨论
jollyjumper
一点记录
展开
-
(转)一文看懂HNSW算法理论的来龙去脉
原文链接:https://blog.csdn.net/u011233351/article/details/85116719一.背景介绍 在浩渺的数据长河中做高效率相似性查找一直以来都是让人头疼的问题。比如,我在搜狗app上阅读了一篇文章,推荐系统就应当为我推送与这篇文章最相近的文章,数据库中所有文章是用向量表示的,所以我们要解决的问题就是“找到与这篇文章的向量最相近的几个向量”,然后把这些向量对应的文章推送出去。数据库中的文章千千万,所有用户每秒的请求也是千千万,我们需要又快又准又...转载 2020-09-06 17:24:10 · 599 阅读 · 1 评论 -
TextRank: Bringing Order into Texts论文笔记
原来在搜PageRank论文时找到这篇04年发表、引用次数3066次的论文。原文链接:https://www.aclweb.org/anthology/W04-3252.pdf阅读之后,发现并不是做网页排序或者爬虫调度相关的。而是利用PageRank/Hits等随机游走的方法对文本中的单元计算出类似PageRank的值,用来做无监督的关键词抽取、关键句子抽取,取得了很好的效果。具体在...原创 2020-02-14 00:51:29 · 376 阅读 · 0 评论 -
POJ 2240 解题报告
<br />套汇差就是汇率的图中存在一条汇率乘积大于1的环。因为一开始已经明确是Bellman-Ford算法,所以把汇率c变成-log(c)付给边作权,这样就是看这个图是否存在权值和为负数的环,用该算法就非常地道了。<br />#include <cstdio>#include <cmath>#include <map>#include <string>using namespace std;struct tagTuple { // store edge info int原创 2011-05-07 18:34:00 · 742 阅读 · 0 评论 -
Zookeeper论文笔记
论文在这里:ZooKeeper: wait-free coordination for internet-scale systems (http://www.usenix.org/event/usenix10/tech/full_papers/Hunt.pdf)今天看下来(还没看完),感觉上比较理解它的设计了,当然其中最关键的zab协议(基于master的原子广播)还要看看。做一些记录:原创 2013-08-21 23:18:54 · 2901 阅读 · 0 评论 -
paxos算法
之前看wiki上paxos算法,花了一些时间却感觉讲得不是很理解。吸取教训,直接读这篇Paxos Made Simple(http://www.cs.utexas.edu/users/lorenzo/corsi/cs380d/past/03F/notes/paxos-simple.pdf),作者也是该算法发明人Lamport。proposal从发出到被最终选中分为两个阶段:Phase 1:原创 2013-08-23 23:33:34 · 1604 阅读 · 0 评论 -
对Primary-backup分布式数据库分布式一致性的猜想
昨天读了paxos算法,心里对分布式一致性有一些想法:如果是我,应该怎么实现数据库集群的一致性呢?paxos算法本身并没有提到其应用,所以实际使用情况应该较复杂。而我平时接触到使用分布式一致性算法的就是mongodb replicaset。它和zookeeper相似,只是它的data model不只包括集群配置,还有其庞大复杂的数据库。paxos为何需要两阶段?也许是在learn的时候方便原创 2013-08-24 14:20:28 · 1985 阅读 · 0 评论 -
数据分析工作的一点改进
最近老是用python要对各种csv做各种统计,工作不可谓不繁琐啊,通常在一次csv扫描中完成几种到几十种统计,因此重复代码多、可读性也差。应该对不同统计做一些原型封装,以动态语言的灵活性不需要做代码生成器,只需要写不同的函数完成不同的功能即可,这样代码大大减少,可读性维护性都很好,唯一的问题会是对不同的工作都需要单独扫描一遍文件。如果对性能有要求,要把不同的统计放在一遍扫描中,又要避免每原创 2013-08-30 07:50:42 · 1258 阅读 · 1 评论 -
GPU方法做倒排压缩和交集计算
之前一直想读这篇,今天读了一下,颇有收获:1.对文档按相似term聚类之后,delta较小,可以提高压缩率(similarity graph)1.GPU一般可以有几百个核,有shared memory和global memory,shared memory相当于寄存器的速度,global memory速度较慢2.有序数组上的搜索算法除了binary search还有interplati原创 2014-09-17 23:32:12 · 1583 阅读 · 0 评论 -
写了一个LRU Cache
公司的LRU简单,我自己也写了一个,需要自己写堆。// Author: johnhall@126.com// Description:#ifndef LRUCACHE_H_#define LRUCACHE_H_#include #include "util/hash_tables.h"namespace crawl {template >class LRUCache { protected: struct EntryType { KeyType k;原创 2011-05-05 02:35:00 · 1358 阅读 · 3 评论 -
Locked-Free Data Structures笔记
Andrei Alexandrescu 07的文章:http://erdani.com/publications/cuj-2004-10.pdf03年Maurice Herlihy因为他91年的文章"Wait-Free Synchronization"被授予Dijkstra分布式计算奖,将来可能会导致硬件架构进行升级。他证明了要构建wait-free数据结构,哪些原语(primitive)是好原创 2016-12-15 21:19:26 · 443 阅读 · 0 评论 -
Lock-Free Data Structures with Hazard Pointers笔记
Andrei Alexandrescu神文,地址在这里:http://collaboration.cmc.ec.gc.ca/science/rpn/biblio/ddj/Website/articles/CUJ/2004/0412/0412alexandrescu/0412alexandrescu.html接上一篇文章,使用引用计数实现WRRM map最后却会变成Write-Rarely-Re原创 2016-12-16 23:57:54 · 605 阅读 · 0 评论 -
LSH知识
Links:LSH Primer: https://github.com/FALCONN-LIB/FALCONN/wiki/LSH-PrimerGithub LSHash: https://github.com/kayzhu/LSHash图像检索:再叙ANN Search:https://yongyuan.name/blog/ann-search.htmlPractical and...转载 2018-11-07 10:57:38 · 713 阅读 · 0 评论 -
CentOS7上faiss环境准备
git clone https://github.com/facebookresearch/faiss.gityum install openblasyum install libopenblasyum install openblas-openmp64.x86_64yum install openblas*./configuremakeyum install pyth...原创 2018-12-17 11:31:18 · 768 阅读 · 0 评论 -
矢量量化方法
原文链接: https://yongyuan.name/blog/ann-search.html矢量量化方法矢量量化方法,即vector quantization,其具体定义为:将一个向量空间中的点用其中的一个有限子集来进行编码的过程。在矢量量化编码中,关键是码本的建立和码字搜索算法。比如常见的聚类算法,就是一种矢量量化方法。而在ANN近似最近邻搜索中,向量量化方法又以乘积量化(PQ, P...转载 2018-12-17 16:15:30 · 4379 阅读 · 1 评论 -
随机抽取数据
从url列表文件中随机抽取一万个url,怎么做 ?当然要求就是要随机,即每个url被取中的概率相同。开始我只能想到从指定记录数的列表中取,那样直接按概率取随机数确定就可以,这时也不用保存取出的url,可以直接输出。假定有n条记录,要取m条,取第一条的概率是m/n,后面都是条件概率,前面已经取中k条的情况下该条取中的概率多少。在记录未知的情况下,可能的做法是不停地校正概率。直觉上单个取中的概率越来越少,所以只需要考虑前面抽中的是否需要剔除,而不考虑漏掉的是否再补上。开始一条一条的读,因为总是假定总记录数为当前原创 2011-05-13 01:05:00 · 1075 阅读 · 0 评论 -
POJ 1077 解题报告
采用最简单的宽搜做法,用一个hash表保存已经搜索过的节点。状态值使用一个int,每三位对应序列中的一个数,最后五位存放0的位置,0和8都用000表示。在C++中会超时,在G++中9232K 782MS ,可以说效率是比较低的。 使用双向bfs,可以大大提高效率。注意我这里双向广度的循环是逐层的。我原来以为,如果不用逐层,两个搜索队列的层数可能不平衡,效率可能会降低,其实不逐节点扩展速度也原创 2010-03-01 21:06:00 · 1157 阅读 · 0 评论 -
双端队列实现分析
双端队列的主要操作是push_back(),pop_back(),push_top(),pop_top(),我们可以用双端队列来适配queue和stack。SGI stl中queue和stack的默认容器都是双端队列deque。deque是怎么实现的呢?deque由两级的数组构成,一级的数组每个元素指向一个大块,这个大块是一个要存放的数据的数组,我们可以叫它二级数组。每个大块存满之后就要申原创 2010-03-05 20:24:00 · 8243 阅读 · 1 评论 -
全排列的序号
{1,2,3}的全排列一次递增如下:123,132,213,231,312,321,对于n个数的序列我们怎么确定它在全排列中的序号呢?是这样做的,如:35214,3开头的一定可以知道其序号一定小于4开头的和5开头的,大于1,2开头的。所以序号>=2*4!(这里2是说3之后有两个小于3的数1,2),扣掉2*4!之后序号完全取决于序列5214了,5之后有三个原创 2010-03-05 20:23:00 · 1206 阅读 · 0 评论 -
双向BFS分析
双向BFS可以极大地减少扩展节点个数,不是从o(n)到o(n/2),通常是o(n)到o(sqrt(n))的(如正反搜索树都是k叉树)。单向BFS求出的一定是最短的路径,双向BFS则不一定。双向BFS求出的路径是最短的的充要条件是图中不存在长度为奇数的回路(双向BFS的两个队列都只有两层,画图简单分析可得出这个结论),对于一般的位置移动的状态变化(如限制只能上下前后左右邻近位置移动),不存在奇数原创 2010-03-14 15:43:00 · 2523 阅读 · 4 评论 -
POJ 1475 推箱子 解题报告
做完八数码问题之后对搜索问题有了一定认识,也很有兴趣,就开始做POJ1475。走了不少弯路,费了很多时间,总结一下。题目要求输出一条push次数最少情况下total最少的路径,开始我以为是要求总移动最少,就写了个双向BFS,将walk和push看做同等操作,等程序跑起来之后才发现不是题目要求的。而且反向时我只考虑了箱子被搬动的情况,这样反向搜索时可能碰不到正向,就退化为周界搜索。中间我用单向BFS原创 2010-03-14 15:41:00 · 3586 阅读 · 1 评论 -
上舍入、下舍入到下一个2的幂
这是两个"地板"和"天花板"函数,但它们舍入到最近的2的整数幂。1.下舍入无分支算法基于右传播最高位。比较有意思的做法:unsigned flp2(unsigned x){ x = x | (x >> 1);//这样最高位就最多占据了两位 x = x | (x >> 2);//最高位最多占据了四位 x = x | (x >> 4);//最高位最多占据了八位 x =原创 2010-03-26 22:33:00 · 1131 阅读 · 0 评论 -
POJ3264 RMQ问题
虽然早知道st(Sparse Table)算法,今天第一次动手写,事无巨细,姑且记录一下。朴素的离线做法是进行n*n次的预处理,生成所有(i,j)对的最小值,保存起来,查询只需O(1)。st做法则是借助二分的做法,进行n*log次预处理,生成所有(i,j)对的最小值,但这里j是对2的幂。RMQ的st算法和树状数组都在一定场合替代线段树,只是st多占些内存,多些预处理,查询快,是典型的离原创 2010-03-27 00:34:00 · 1062 阅读 · 0 评论 -
POJ 2155 二维树状数组
这道题的独特之处是修改一个区间的值,查询单点的值。其实可以转换成修改单点,查询区间的问题。考虑问题是一维的,且区间全部为[a,无穷大)形式的,现在对于一点i,它的值取决于覆盖它的区间个数,即起点在i以及i之前的区间总数,而每个区间的输入影响它后继的计数。于是很自然地,我们使用树状数组解决这个问题。加以扩展,区间[a,b]只需[a,无穷大)的累加基础上减去[b + 1,无穷大)的累加作用,然原创 2010-04-13 12:52:00 · 1452 阅读 · 0 评论 -
POJ 1743 不可重叠最长重复子串
#include using namespace std;//---------------------------------------------//功能:2倍增算法生成后缀数组,参考罗穗骞论文//sa:返回的后缀数组//str:输入的串(这里为int数组)//n:串长度//M:串中元素的最大值,最小值为0//---------------------------------------------#define MAX_N 19999void suffix_a原创 2010-06-26 18:44:00 · 2380 阅读 · 0 评论 -
POJ1160 P个邮局N个村庄求最短总距离
有意思的一道题,N个一维坐标点上的村庄中选择P个村庄建邮局,要使总距离最短。用DP方法做, 在第0个村庄(升序)到第i个村庄建立j个邮局的最少总距离,是在第0个到第i个任取第j个点,第0个到第k个之间建立j-1个邮局的最少总距离加上在第(k+1)个到第i个村庄建立一个邮局的总距离之和的最小值(用形式化语言描述更清晰)。第i个村庄到第j个村庄建立1个邮局的最小总距离是容易求的。这个邮局应建在(i+j)/2处。假定中点只有一个,即j-i为偶数,不论邮局建在何处,关于中心点对称的两个村庄到邮局的总距离最短是邮原创 2010-06-28 18:42:00 · 2810 阅读 · 0 评论 -
一个简单的自顶向下语法分析(表达式求值)
//一个简单的自顶向下语法分析#include #include using namespace std;char str[1024];long curpos;int num(){ int ret; if (str[curpos] >= '0' && str[curpos]原创 2010-07-14 10:23:00 · 1081 阅读 · 0 评论 -
多模匹配 UrlMatcher
UrlMatcher-LoadPatternFile-AddPattern(payload参数是做什么的?)-Match-MatchAll在add_pattern的时候,p_holder的para_count返回$1的1(payload=$0:$1时), 不理解是什么含义,从外部接口调用add_pattern是不包含test cases的,payload貌似是为了存放re2 match的结 果的(可是这样光存放一个para_count就够了啊,为什么需要一个表达式呢),payloa原创 2010-10-14 16:21:00 · 2847 阅读 · 0 评论 -
大量url去重问题
<br />url列表文件高达1G那么大,可是内存只有128M,怎么办?<br />其实工作很经常遇到这个问题(常常动不动一个文件就接近10G),因为需要统计站点、后缀什么的。可每次我都是直接用sort,uniq命令几行解决,大概因为前一段时间在看shell根本不会往深了想每次做次统计都要等几个小时(脑子僵化得可以了)。<br />这个问题的经典做法是,对url进行fingerprint之后取模,用这种办法将文件切分成若干个小文件,而这些小文件直接用哈希表就可以消重,然后这些文件直接合并,虽然Fin原创 2011-05-12 21:01:00 · 2418 阅读 · 0 评论 -
最少交换次数
将一个无序序列变成有序(序列中没有相等的数),可以进行任意两个位置的交换操作,求最少的交换次数如:5 2 1 4 3转成:0 1 4 5 9循环分解:(9 0 4)(1)(5),只需将(9 0 4)分解即可。而(1 2 ... n)=(1 2 ... n-1)(1 n)=(1 2)(1 3)...(1 n)因此(9 0 4)可以分解为两个置换。所以该序列只需原创 2010-02-27 14:51:00 · 2267 阅读 · 0 评论