算法/数据结构
算法/数据结构
LittleMagics
Flinker @ JD.com
展开
-
计算汉明权重的SWAR(SIMD within a Register)算法
前言在很久之前,笔者在《布隆过滤器(Bloom Filter)原理及Guava中的具体实现》这篇文章的最后,说到JDK中提供了计算整形数二进制表示中1的数量[即所谓汉明权重(Hamming weight)]的方法,并且说它是Java语言中最强的骚操作之一。本文来简单探究一下骚操作背后的思路。朴素的SWARInteger.bitCount()方法的源码中有一句注释。// HD, Figure...原创 2020-08-08 22:59:20 · 1239 阅读 · 0 评论 -
图论的起源:柯尼斯堡七桥(一笔画)问题与欧拉路径/回路
柯尼斯堡七桥问题大数学家欧拉一生中的大部分时间在俄国和普鲁士度过。1735年,他提出了著名的柯尼斯堡七桥(Seven Bridges of Königsberg)问题:柯尼斯堡(今俄罗斯加里宁格勒)的市区横跨普雷格尔河两岸,河中心有两个小岛,小岛与河的两岸有七座桥连接。在所有桥都只能走一遍的前提下,如何才能把这个地方所有的桥都走遍?当时欧拉并没有找到这个问题的解。第二年,他证明了不存在符...原创 2020-07-20 22:28:10 · 7892 阅读 · 0 评论 -
求解最长回文子串的中心扩展法与Manacher算法
端午安康~好久没写算法类文章了。这个假期出行计划泡了汤,没太多事情做,随便搞一篇吧。最长回文子串所谓最长回文子串(longest palindromic substring, LPS),顾名思义就是指一个字符串中,长度最大且又满足回文性质的连续子串。例如:"bananas"的最长回文子串是"anana","麻麻说上海自来水来自海上"的最长回文子串是"上海自来水来自海上"。求解...原创 2020-06-25 23:01:35 · 815 阅读 · 0 评论 -
漫谈初等数论、素数及其它(上篇)
目录前言素数与其无限性:欧几里得定理素数分解的存在性与唯一性:算术基本定理、欧几里得引理算术基本定理的部分应用素数出现规律的估计:素数定理素数的一些有意思的特征未完待续各种素性检验算法素数的用武之地:公钥密码学尚未被证明的关于素数的猜想前言断断续续写过了一些数据结构和(竞赛)算法方面的东西,今天回头翻看的时候发现还没有数论方面的(数论当年把笔者折腾得不浅)。五一长...原创 2020-04-30 21:17:35 · 1206 阅读 · 1 评论 -
漫谈《集合啦!动物森友会》的大头菜价格趋势与马尔可夫链
前言还要买更多吗?(曹卖说话有奇怪的口音哈哈哈哈虽然笔者自己并不是炒菜党,每周只是象征性地囤上五六百棵刷成就里数(以及用来吃),但是大头菜价格背后的细节还是很有些意思的。以下是部分大佬已经做过的工作(orzNinji从游戏中反编译出了(到底是如何做到的呢?)大头菜价格的4种趋势,并形成了C++代码。Edricus将上述信息总结成了详尽的文字版:《Brea...原创 2020-04-19 22:36:56 · 2912 阅读 · 0 评论 -
聊聊指数退避思想及其在Flume、Hadoop中的应用
前言前段时间爆改Jodis(Codis的Java客户端)代码,发现它的测试类中用到了指数退避算法。这是大学计算机网络课程会讲到的知识,本文权当复习,并且看看它的思想是如何应用在大数据组件中的。计算机网络中的指数退避所谓指数退避(exponential backoff),是一种根据系统反馈来成倍地削减操作的速率(比如数据流的速率)的算法,直到系统可以稳定地进行处理为止。在计算机...原创 2020-04-10 22:57:05 · 456 阅读 · 0 评论 -
TF-IDF算法与其在Spark MLlib中的实现
前言TF-IDF是在文本挖掘和信息检索领域最常用(也是最简单)的加权统计方法,笔者曾经在大学选修过NLP和信息检索方面的课程,其中都讲到了TF-IDF,并且在工作中使用得很多,比如分析用户发帖、商品评论等。本文就来非常粗浅地介绍一下。TF-IDFTF-IDF实际上是两个统计量的乘积,即词频(term frequency, TF)和逆向文档频率(inverse document...原创 2020-03-17 21:22:42 · 636 阅读 · 0 评论 -
并查集、Kruskal算法及其应用
并查集入门并查集(union-find set)是一种不算太“低级”的数据结构,在算法竞赛中比较常见。简而言之,它专门用来高效地处理不相交集合(disjoint sets)的合并及查询问题。Bernard A. Galler和Michael J. Fischer于1964年提出了并查集的森林表示形式:用一棵(多叉)树来表示一个集合,树中的每个节点都保存着对它的父节点的引用,所...原创 2020-02-07 23:02:02 · 887 阅读 · 0 评论 -
三分查找(ternary search)及其示例
在这个博客的开头(差不多一年前的事儿了),我曾写过一篇非常潦草的文章来描述二分查找(binary search)算法。二分查找是最经典的在单调序列中查找目标值的算法,不再多费口舌了。除了二分查找之外,其实还有三分查找(ternary search)算法。它的知名度没有二分查找那么高,但是用处也不小。一句话,三分查找用来确定函数在凹/凸区间上的极值点。什么是凹凸性呢?借用同济版《高...原创 2020-01-15 23:27:59 · 2021 阅读 · 0 评论 -
Dijkstra算法与其最小堆优化
(仿佛回到了当年打比赛的时候呢POJ 3013(Big Christmas Tree)传送门:http://poj.org/problem?id=3013题目大意:由一堆顶点和边构造出一棵圣诞树,1号顶点固定为树根,顶点和边各自有权重值(均为正数)。构造圣诞树的边的开销是边权乘以子树中所有顶点的权重之和,总开销则是所有边的开销之和。求圣诞树的最小开销。稍微变换...原创 2019-12-24 23:51:28 · 1868 阅读 · 0 评论 -
高效压缩位图RoaringBitmap的原理与应用
目录位图法简述RoaringBitmap的思路Container原理ArrayContainerBitmapContainerRunContainer时空分析Container的创建与转换RBM的应用LuceneSparkGreenplumRedisThe End位图法简述对于我们大数据工作者来说,海量数据的判重和基数统计是两个...原创 2019-12-02 22:57:18 · 1989 阅读 · 0 评论 -
聊聊递归与尾递归——仍然以C语言为例
前言大约半个月前,我在《深入理解栈内存与函数调用栈——以C语言为例》这篇文章的结尾给自己挖了个坑。鉴于我挖了没管的坑已经两只手都数不过来了,所以是时候填一填了。看官可以先食用之前那篇文章,以获得关于函数调用栈的背景知识。递归(recursion)递归并不是一个程序设计领域专属的概念,有很多其他丰富的例子:德罗斯特效应(Droste effect),即与原图相同的图重复嵌...原创 2019-11-29 21:31:44 · 325 阅读 · 0 评论 -
谈谈经典限流方法——漏桶、令牌桶,与Guava RateLimiter的实现
前言昨晚对球迷来说简直是盛宴(边霍啤酒边看了4场球),当然也导致本篇没写完。那么今天就来续一发吧。高并发的业务系统经常要接受大流量的考验,为了保证系统的响应度和稳定性,往往都需要对有风险的接口实施限流(rate limiting),更高大上的说法则是“流量整形”(traffic shaping)。限流的思想最初来源于计算机网络,有两种经典的方法:漏桶和令牌桶。本...原创 2019-11-24 21:18:20 · 2358 阅读 · 0 评论 -
从B+树到LSM树,及LSM树在HBase中的应用
前言在有代表性的关系型数据库如MySQL、SQL Server、Oracle中,数据存储与索引的基本结构就是我们耳熟能详的B树和B+树。而在一些主流的NoSQL数据库如HBase、Cassandra、LevelDB、RocksDB中,则是使用日志结构合并树(Log-structured Merge Tree,LSM Tree)来组织数据。本文先由B+树来引出对LSM树的介绍,然后...原创 2019-11-17 21:41:34 · 835 阅读 · 0 评论 -
深入理解栈内存与函数调用栈——以C语言为例
目录前言作为数据结构的栈IA-32寄存器简介栈内存布局与栈帧函数调用栈分析The End前言直接借用之前写的《为什么-128的补码是1000 0000?》的开头,毕竟动机相同。这个问题并不是什么面试题,而是今晚(注:昨晚)刚上大一初学C语言的小辈问我的,一瞬间竟然有点发蒙,不知道该如何回答。好在最后还是理清了思路,顺便将这个非常基础(?)的知识点总结下吧。...原创 2019-11-12 22:47:43 · 1743 阅读 · 1 评论 -
二叉堆、优先队列与Top-N问题
前言今日份的内容很简单,看官可以放心食用。二叉堆这一部分完全是大学数据结构课程的复习。性质顾名思义,二叉堆(binary heap)就是以二叉树形式存在的堆数据结构,也是最简单的堆。它是由J. Williams在1964年与堆排序算法一同提出的。二叉堆具有以下两个基本性质:是一棵完全二叉树;每个节点存储的值要么都小于等于它们的子节点的值,要么都大于等于它们的子节点的...原创 2019-11-07 23:35:43 · 525 阅读 · 0 评论 -
再谈基数估计之HyperLogLog算法
前言在很久(好像也没多久,4个月)之前,我曾经写了一篇和主业无关的有点意思的小文章《基数估计探秘:Linear Counting与Flajolet-Martin算法》。但是这篇文章讲的两个算法都已经老掉牙了,实际应用最广泛的基数估计算法是HyperLogLog(HLL)算法。最近笔者基于Flink搞了些从超大行为数据集计算UV的工作,用到了Redis的HyperLogLog,感...原创 2019-10-16 22:58:24 · 496 阅读 · 0 评论 -
Chandy-Lamport分布式快照算法小记
Prologue前面陆陆续续写了几篇关于Flink的浅显的小文章,其中多次提到了“异步屏障快照(asychronous barrier snapshot, ABS)算法”这个词,并指出它是Flink检查点机制的基础。而ABS算法的渊源就是本文要说的Chandy-Lamport算法,它是目前在流式系统中广泛使用的分布式快照算法。这个算法在论文《Distributed Snapsh...原创 2019-10-10 22:15:26 · 2620 阅读 · 0 评论 -
详解分治法(divide-and-conquer)及其典型应用
什么是分治法在昨天的文章《漫谈数据库中的join》的最后,提到Grace hash join和Sort-merge join都是基于分治思想的。分治法(divide-and-conquer)是一种重要的求解复杂问题的算法思想,根据《算法导论》的描述,分治法按照3步执行:Divide the problem into a number of subproblems that...原创 2019-08-02 22:57:36 · 9182 阅读 · 2 评论 -
基数估计探秘:Linear Counting与Flajolet-Martin算法
前言看官可以先拿出大学《概率论与数理统计》教材翻一翻,反正我是复习过才写的(逃基数统计简介什么是基数?一个(有限)集合S里不同的元素个数就称为该集合的基数(cardinality),也叫做“势”,记为|S|。例如,S={"西红柿", "土豆", "胡萝卜", "土豆", "洋葱", "西红柿"},那么|S|=4。在我们的日常工作中,经常碰到需要统计基数的情境。最常见的就是...原创 2019-06-18 22:03:41 · 1314 阅读 · 1 评论 -
详解分布式共识(一致性)算法Raft
分布式共识及Raft简介所谓分布式共识(consensus),与CAP理论中的一致性(consistency)其实是异曲同工,就是在分布式系统中,所有节点对同一份数据的认知能够达成一致。保证集群共识的算法就叫共识算法,它与一致性协议这个词也经常互相通用。当今最著名的共识算法就是Paxos算法。它由Leslie Lamport在1990年提出,很长时间以来都是一致性的事实标准。但...原创 2019-05-27 21:36:28 · 1286 阅读 · 0 评论 -
跳跃列表(Skip List)与其在Redis中的实现详解
目录引子认识跳表跳表的提出由二叉树回归链表设计思想与查找流程插入元素的概率性复杂度分析Redis的跳表实现从zset到zskiplist创建zskiplist向zskiplist插入元素查询元素排名/获取排名对应元素Redis作者对采用跳表的解释The End引子跳跃列表(Skip List),简称跳表。在前面我写过的一篇讲解H...原创 2019-05-16 22:12:40 · 234 阅读 · 0 评论 -
设计一个属于自己的内容热度值算法
前言在产品、运营这次做社区改版的过程中,我们大数据部门结合具体的业务细节,通过研究、讨论与试错,最终设计了一个基本符合需求的内容热度值算法,本文就简述其设计方法。他山之石有为数很少的几家外国公司开源或公开说明了自家的内容热度值算法,包括Hacker News、Reddit、Stack Overflow/Stack Exchange、StumbleUpon等。我们在设计自己的算...原创 2019-04-15 21:49:51 · 6480 阅读 · 3 评论 -
“双指针法”的背后:Floyd环检测算法
LeetCode上面的题目#141:https://leetcode.com/problems/linked-list-cycle/。题目大意:给定一个单链表,判断其中是否有环。这道题还有一个变种#142:https://leetcode.com/problems/linked-list-cycle-ii/。题目大意:给定一个单链表,如果其中有环,输出环的入口节点,否则输出n...原创 2019-02-15 15:11:46 · 719 阅读 · 0 评论 -
二分查找及其变种
二分查找(binary search)是非常基础的算法,日常应用和面试中都极常见。其思想简单,不再赘述,但想要写好二分查找,也并不是那么容易的。图来自《算法(第4版)》经典算法(array是升序序列,下同) int binarySearch(int target, int[] array) { int low = 0, high = ar...原创 2019-02-06 00:13:46 · 245 阅读 · 0 评论