有没有一种有效的方法可以在常量 space 的排序范围数组中找到最频繁的数字
Is there an efficient way to find the most frequent number in a sorted array of ranges in constant space
我必须从已排序的范围数组中找到最频繁出现的数字(或众数)。该范围仅由包含在内的开始和结束数字组成。
例如 arr[0] 可以包含数字 {0, 3},这意味着数字 {0, 1, 2, 3}。范围按起始编号排序,当起始编号相等时,它们按结束编号排序。均按升序排列。
数组中填充了 n 个这样的范围。我需要找到一种方法来找到出现在最多范围内的数字。
我想到了一个将所有数字遍历一次的解决方案,但这是在 O(n * m) 中,其中 m 是范围的平均长度。对于我正在处理的大小,这是一个非常慢的算法。
我也看过一些更快的解决方案,例如 this,但是当您无法轻易找到第 k 个数字时,我想不出一种有效的实现方法,因为范围可能大不相同尺码。
我目前正尝试在 C 中实现此功能,但非常感谢任何想法或处理此问题的资源链接。
- 将每个范围
{a, b}
转换为两个事件“在 a
处加 1”和“在 b+1
处减 1”。
- 按添加或减去位置的升序对事件进行排序。对于相同的位置,减去事件应该比添加事件来得早。
- 执行事件并查看计算结果在哪个点最高。
例如,如果我们有 3 个范围 {0, 5}, {2, 9}, {4, 7}
,每个范围将是这样的:
0123456789
------
--------
----
排序的事件是:
- 0加1
- 1 加 2
- 加 1 到 4
- 1减6
- 1减8
- 1 减 10
执行这些事件,在执行第3个事件之后,执行第4个事件之前,该值变为最高的3。因此我们可以说最合适的数字是4和5。
时间复杂度为 O(N log N) 因为:
- O(N) 从范围到事件的转换
- O(N log N) 事件排序
- O(N) 次事件执行
存储事件的 space 复杂度为 O(N)。
我必须从已排序的范围数组中找到最频繁出现的数字(或众数)。该范围仅由包含在内的开始和结束数字组成。 例如 arr[0] 可以包含数字 {0, 3},这意味着数字 {0, 1, 2, 3}。范围按起始编号排序,当起始编号相等时,它们按结束编号排序。均按升序排列。
数组中填充了 n 个这样的范围。我需要找到一种方法来找到出现在最多范围内的数字。
我想到了一个将所有数字遍历一次的解决方案,但这是在 O(n * m) 中,其中 m 是范围的平均长度。对于我正在处理的大小,这是一个非常慢的算法。
我也看过一些更快的解决方案,例如 this,但是当您无法轻易找到第 k 个数字时,我想不出一种有效的实现方法,因为范围可能大不相同尺码。
我目前正尝试在 C 中实现此功能,但非常感谢任何想法或处理此问题的资源链接。
- 将每个范围
{a, b}
转换为两个事件“在a
处加 1”和“在b+1
处减 1”。 - 按添加或减去位置的升序对事件进行排序。对于相同的位置,减去事件应该比添加事件来得早。
- 执行事件并查看计算结果在哪个点最高。
例如,如果我们有 3 个范围 {0, 5}, {2, 9}, {4, 7}
,每个范围将是这样的:
0123456789
------
--------
----
排序的事件是:
- 0加1
- 1 加 2
- 加 1 到 4
- 1减6
- 1减8
- 1 减 10
执行这些事件,在执行第3个事件之后,执行第4个事件之前,该值变为最高的3。因此我们可以说最合适的数字是4和5。
时间复杂度为 O(N log N) 因为:
- O(N) 从范围到事件的转换
- O(N log N) 事件排序
- O(N) 次事件执行
存储事件的 space 复杂度为 O(N)。