2025.8.4 学习

2025.8.4 学习

t-digest算法

https://zhuanlan.zhihu.com/p/366170670

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

![image-20250804170525265](/Users/haliu/Library/Application Support/typora-user-images/image-20250804170525265.png)

数据量较少时,我们可以使用数据集的所有点来计算该函数,但是当数据量较大时,我们只有通过少量数据来代替[数据集]的所有数据。

这里,我们需要将数据集进行分组,相邻的数据分为一组,用 平均数(Mean)和 个数(Weight)来代替这一组数。这两个数合称为 Centroid(质心数),然后用这个质心数来计算 PDF,这就是 TDigest 算法的核心思想。

![image-20250804170607061](/Users/haliu/Library/Application Support/typora-user-images/image-20250804170607061.png)

如上图所示,质心数的平均值作为 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题:统计连续签到天数排名

posted @ 2025-08-04 17:54  vast_joy  阅读(9)  评论(0)    收藏  举报