如何在 1s 内统计出 13 亿人口数据找出使用人数最多的十个姓名

2021-01-25 10:32:21 +08:00
 cage111

请教下各位大佬这种需求可以实现吗

13728 次点击
所在节点    数据库
104 条回复
yuankui
2021-01-25 17:02:02 +08:00
1. 面向列的
2. 姓氏映射成一个 bit
3. bitmap

ClickHouse 应该很简单
yuankui
2021-01-25 17:03:23 +08:00
这是哪个公司的面试题吗?
lovecy
2021-01-25 17:05:14 +08:00
这个是静态数据,维护一份统计数据,每次更新静态数据时同时更新统计数据。
1s 内找出十个最多的人名,就是一条查询而已
skies457
2021-01-25 17:08:53 +08:00
查询模式固定的话可以考虑自己用 C++写索引和查询,13 亿短字符串对于单机而言也不是很大的量级
786375312123
2021-01-25 17:24:00 +08:00
@Mohanson 使用最多,看清楚了兄弟。你还是要把整个树过一遍才能知道那些频率最高
yuyueMJ
2021-01-25 17:32:46 +08:00
@tiancaixiaoshuai 哈哈哈 牛逼
fs418082760
2021-01-25 19:03:24 +08:00
百家姓拿来干吗的,老祖宗都统计好了。。。
Mohanson
2021-01-25 19:46:50 +08:00
@786375312123 设计成父节点的 count 是其所有子节点的 count 和,即使不做任何优化,最多循环一个 3500*3 长度的数组就能找到最大值;找到最大值后排除该根节点继续找最大值,往复 10 次就是 3500*3*10 次循环。

这是我想到的没任何优化的算法,仔细设计的话提个数量级也不是不可能
ltoddy
2021-01-25 19:54:33 +08:00
使用字典树,循环一次就出来了。
Mohanson
2021-01-25 19:54:52 +08:00
如果在插入和移出数据时保证所有子树的顺序的话,那么查找一次最大值的时间复杂度就是 O(1),代价是插入和删除的时候计算量会变大很多,不过不是大问题,毕竟是读优先的
xcstream
2021-01-25 20:00:06 +08:00
插入的时候就排好了, 只需 0.0001 秒
786375312123
2021-01-25 21:39:26 +08:00
@Mohanson 可是你依然需要遍历所有的名字以后才能知道某个子节点上对应的数字是多少。建立树的成本依然是 o(n)
moult
2021-01-25 22:12:12 +08:00
结合实际情况,如果可行的话,预处理的时候,把那些独一无二的名字先全部踢掉,数据少一大半。
lululau
2021-01-25 22:18:41 +08:00
select * from top_names;
iluckypig
2021-01-25 23:58:10 +08:00
@cage111 建表的索引错了吧,应该是 order by name
tedzhou1221
2021-01-26 00:03:01 +08:00
感觉你是想做用户画像,精准推送
alazysun
2021-01-26 00:44:46 +08:00
数据录入的时候不就统计好了吗?
v2sir
2021-01-26 01:09:32 +08:00
@mapoor 你这个算法是错的
ericls
2021-01-26 01:22:04 +08:00
用 columnar 数据库
lxfxf
2021-01-26 06:23:05 +08:00
统计学方法,直接随机落点一百万次,再统计不就好
这题应该改一下,找出最少的十个姓

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/748059

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX