【发布时间】:2023-03-29 16:13:02
【问题描述】:
输入参数是表示区间的元组列表和整数列表。目标是编写一个函数来计算每个整数存在的间隔数,并将此结果作为关联数组返回。比如:
Input intervals: [(1, 3), (5, 6), (6, 9)]
Input integers: [2, 4, 6, 8]
Output: {2: 1, 4: 0, 6: 2, 8: 1}
其他例子:
Input intervals: [(3, 3), (22, 30), (17, 29), (7, 12), (12, 34), (18, 38), (30, 40), (5, 27), (19, 26), (27, 27), (1, 31), (17, 17), (22, 25), (6, 14), (5, 7), (9, 19), (24, 28), (19, 40), (9, 36), (2, 32)]
Input numbers: [16, 18, 39, 40, 27, 28, 4, 23, 15, 24, 2, 6, 32, 17, 21, 29, 31, 7, 20, 10]
Output: {2: 2, 4: 2, 6: 5, 7: 6, 10: 7, 15: 6, 16: 6, 17: 8, 18: 8, 20: 9, 21: 9, 23: 11, 24: 12, 27: 11, 28: 9, 29: 8, 31: 7, 32: 6, 39: 2, 40: 2}
我将如何编写一个有效地执行此操作的函数?我已经有了 O(nm) 实现,其中 n 为间隔数,m 为整数数,但我正在寻找更有效的方法。
我现在拥有的:
def intervals_per_number(numbers, intervals):
result_map = {i: 0 for i in numbers}
for i in result_map.keys():
for k in intervals:
if k[0] <= i <= k[1]:
result_map[i] += 1
return result_map
希望我解释得足够好。如果还有什么不清楚的,请告诉我。
提前致谢。
【问题讨论】:
-
仅当列表已排序时:调整二分查找。它在如此小的样本上不会有太大的好处,但它应该在长度为 8 和更大(8,因为这需要最多 3 次查找;对于更大的长度,直到百万,它只会呈指数级增长)。
-
@usr2564301 如何获得比二次解更好的指数?这听起来不对。
-
@HeapOverflow:(哎呀)是的,二次优于线性。 (“指数”仅乘以 2 的幂,而不是 n。但仍然要好得多。)
-
@usr2564301 嗯,听起来还是不对。不是 O(n log n) 而不是 O(n^2),所以 O(n / log(n)) 更好吗?也就是说,小于线性更好?
-
@HeapOverflow 不,区间和整数并不总是已经排序。