2025.8.4 学习
2025.8.4 学习
t-digest算法
https://zhuanlan.zhihu.com/p/366170670
比如有 500 个 -30 ~ 30 间的数字,可以使用概率密度函数来表示这一数据集。该函数上的某一点的 y 值就是其 x 值在整体数据集中的出现概率,整个函数的面积相加就正好为 1 ,可以说它刻画了数据在数据集中的分布态势(大家较为熟悉的[正太分布]示意图展示的就是该函数)。

数据量较少时,我们可以使用数据集的所有点来计算该函数,但是当数据量较大时,我们只有通过少量数据来代替[数据集]的所有数据。
这里,我们需要将数据集进行分组,相邻的数据分为一组,用 平均数(Mean)和 个数(Weight)来代替这一组数。这两个数合称为 Centroid(质心数),然后用这个质心数来计算 PDF,这就是 TDigest 算法的核心思想。

如上图所示,质心数的平均值作为 x 值,个数作为 y 值,可以通过这组质心数大致绘制出这个数据集的 PDF 函数。
对应的,计算百分位数也只需要从这些质心数中找到对应的位置的质心数,它的平均值就是百分位数值。
Java八股
Colletion接口:
List:
-
ArrayList:底层是动态数组,查询O(1),修改O(n)。
-
LinkedList:底层是双向链表,查询O(n),修改O(1),可以用来实现栈,队列。
-
CopyOnWriteArrayList:写时会将原先的列表复制一份在复制的列表上修改,读的话还是读原来的列表。读写分离,适用于读多写少的场景,比如时间监听列表。
-
Vector:底层是动态数组,大部分方法是同步的,可以在多线程环境下保证数据的一致性
map:
- HashMap:链表+数组/红黑树。初始容量16,系数0.75,当链表元素个数超过8时会转为红黑树(红黑树相比链表将查询复杂度由n优化到1)。当元素个数小于6会重新转回链表。
- HashTable:线程安全的哈希表,add等方法用syncronized修饰,锁全表
- ConcurrentHashMap:线程安全,锁的粒度优化到节点,不会锁整个哈希表
set:
-
HashSet:
-
LinkedHashSet
-
TreeSet
锁
Syncronized:基于对象头和监视器锁
锁升级:偏向锁,轻量级锁,重量级锁
Reentrantlock:AQS的实现,维护一个INT的state以及一个同步队列和一个等待队列。支持公平和非公平两种。
sql
可以看一下row_number() over (partition by ... order by ... desc)这个函数
sql题:统计连续签到天数排名

浙公网安备 33010602011771号