问题如下:给定每个员工E的人员姓名,身高和体重的数据流,找到更高,体重超过E的员工组。
显然,这可能是强迫O(n ^ 2)。这是你能做的最好的吗?如果可以做得更好,算法会是什么?
答案 0 :(得分:3)
如果我们在每个员工(height_i, weight_i)
的2D平面上绘制一个点i
,则员工i的查询将成为2D正交范围查询,即在此矩形height_i < height <= height_max
和{中找到点{1}}。
来自wiki [1],您可以使用时间复杂度weight_i < weight <= weight_max
的算法,其中O(n log log n + k)
是输出的大小。
修改:在最糟糕的情况下,k
可以按k
1:https://en.wikipedia.org/wiki/Range_searching#Orthogonal_range_searching
答案 1 :(得分:2)
如果您根据身高或体重对输入进行排序,则可以仅检查每个条目的后续条目,这样您就可以进行(l-1) + (l-2) + (l-3) + ... + 1
比较,而不是l * (l - 1)
。不过,显然这仍然是二次方的。正如Ruakh在他们的评论中指出的那样,输出大小告诉我们这是我们能做的最好的事情(想象一下排序列表中的每个人都比较矮,每个人的重量都比后来的人少)。