【发布时间】:2015-08-21 15:15:26
【问题描述】:
我在 C# 中有一个数组,其中包含数字(例如 int、float 或 double);我有另一个范围数组(每个都定义为下限和上限)。我目前的实现是这样的。
foreach (var v in data)
{
foreach (var row in ranges)
{
if (v >= row.lower && v <= row.high)
{
statistics[row]++;
break;
}
}
}
所以算法是 O(mn),其中 m 是范围的数量,n 是数字的大小。
这可以改进吗?因为实际上,n 很大,我希望它尽可能快。
【问题讨论】:
-
范围是否重叠?
-
理想情况下,是的,它们可能会重叠。但是,如果我们可以基于它们不能重叠的事实来非常快速地获得一些东西,那么我很乐意接受。
-
如果您有重叠范围,您可以调整为非重叠范围提供的算法以使其仍然有效。获取您开始使用的范围列表并导出非重叠“子范围”列表,其中子范围具有下限、上限以及与该子范围重叠的原始范围列表。将此子范围列表提供给以下算法之一以获得子范围的直方图,然后对于 S 列出的每个原始范围 R 的每个子范围 S,将 S 的总数添加到 R;这给了我们原始范围内的直方图。
标签: c# algorithm performance