面试题:如何 O(n) 的复杂度内筛选 60 亿人的身高

333 天前
 Daredevil0086

完整的题目差不多是这样的:

现在有一个文件 a.txt ,其中放的内容就是 60 亿人的身高,每个身高数据都保证是以.0 或者.5 结尾的(比如说 180.0 ,175.5 );现在请筛选出其中前 1000 高的数据;

要求时间复杂度是 o(n);

面试官说这玩意不是一个单纯的算法,身高数据可以做点文章……但到最后还是没想出来………………有没有高智商 V 友可以解答一下

9604 次点击
所在节点    程序员
87 条回复
fengjianxinghun
333 天前
人类的身高是有上下限的,正确点说就是 0.5-3 米之间,而且他保证了是.0/.5 结尾,就减少到一个更小的数值集合,这样想你是不是就懂了?
lolizeppelin
333 天前
遍历的时候超过 2 米的.....或者低一点 1.95
iamzuoxinyu
333 天前
桶排序
Nugine0
333 天前
基数排序
Daredevil0086
333 天前
@iamzuoxinyu 桶排序最差能到 O(n^2)吧,不在 O(n)内
leogm9408leo
333 天前
数据是以.0 或者.5 结尾,意味着这是个有范围的离散数据而不是连续数据。假设人类的身高区间是 10 厘米-250 厘米,间距 0.5 厘米,其实也就( 250-10 )*2=480 个。作 480 个数据桶,遍历一遍就可以把 60 亿数据都放到这 480 个数据桶里,然后取不为空的最大身高值的桶里的数据即可
devfeng
333 天前
https://leetcode.cn/problems/kth-largest-element-in-an-array/ 第 k 个最大元素,思路是一样的
edward1987
333 天前
前 1000 高的,又不是所有都排序,用一个数组存当前最高的 1000 个,遍历一遍,遇到更高的就替换数组内容就好了啊。复杂度就是 0(n)
Daredevil0086
333 天前
@fengjianxinghun 额,即使是不看结尾小数,好像稳定在 O(n)内的排序算法也没有吧
githmb
333 天前
一个容量为 1000 的向量,60 亿数据依次往里面塞,每塞一次做个排序
Daredevil0086
333 天前
@devfeng 哦哦哦哦,那我算答对了?我用的是快排那个…………………………但是还是没太理解怎么用身高这点来做优化
insanny
333 天前
同意 6 楼的思路
raycool
333 天前
堆排序
sun1991
333 天前
开一个 HashMap, 把可能的身高数据以 key 的形式预先插入. 然后遍历集合, 插入 HashMap. 最后以身高为 key, 从高到底, 从 HashMap 拿数据, 凑满 1000 即可.
FACEB00K
333 天前
不考虑身高数据,构建 size 为 1000 的最小堆;
如果考虑升高数据,用一个数组统计身高就能解决吧,数组下标和身高有映射关系,而且身高范围是固定的;最后逆序遍历数组
Daredevil0086
333 天前
@edward1987 那是平均复杂度吧,面试官这么说的……
coyoteer
333 天前
计数排序?
picone
333 天前
@FACEB00K 用了堆就不是 O(n) 了
codingbody
333 天前
@edward1987 #8
@raycool #13 这是 O(nlogk) 吧
Daredevil0086
333 天前
兄弟们,面试官好像想考察的是怎么用身高做文章,我最终交上去的答案是 7 楼贴的 leetcode 题目的快排版本答案;

感觉这题,好像跟算法没关系~~~~属于动脑子的那种

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

https://www.v2ex.com/t/943925

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

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

© 2021 V2EX