我需要使用以下内容创建一个Java项目: 我有一个输入文件,其中包含全年的通话范围(以毫秒为单位)–该文件按开始时间排序。 例如 0-100(通话从0开始到100结束) 1至100 5-50岁 60-150, 65-180 我需要返回一年中网络最繁忙的时期。 在此示例中,结果为65-100,因为在此期间空中有4个电话 我的堆内存有限(8GB),并且只能在文件上运行一次 在这里使用最佳逻辑是什么(在Java中)
答案 0 :(得分:0)
我认为解决此问题的最佳方法是定义最小的通话单位。例如,在给定的情况下,您可以说1毫秒是最小的通话单位。现在,您将从数据结构的数组类型开始,其中每个时间单位包含一个单元格。在给定的示例中,您具有从0到180的值,因此我们将有一个长度为181的数组,从0到180开始。 现在,当您遇到呼叫时,您可以开始增加相关单元格。例如,当您看到一个呼叫0-100时,您将使单元格0到100递增。类似地,您将经历每个呼叫。为了提高效率,您还可以将索引缓存到最大数量,以便可以快速访问它们。 在您的示例中,数组如下所示。
12222333333333333333333333333333333333333333333333333 32222222223333344444444444444444444444444444444444 42222222222222222222222222222222222222222222222222 2111111111111111111111111111111
这里是可以在数组上方进行计算的c ++代码示例。
#include <iostream>
#include <array>
#include <climits>
struct Call {
Call(int start, int end) {
this->start = start;
this->end = end;
}
int start;
int end;
};
int main(int argc, char* argv[]) {
const Call calls[] = { Call(0, 100),
Call(1, 100),
Call(5, 50),
Call(60, 150),
Call(65, 180)};
int minimum = INT_MAX;
int maximum = INT_MIN;
for (int i = 0; i < sizeof(calls)/sizeof(calls[0]); ++i) {
minimum = std::min(minimum, calls[i].start);
maximum = std::max(maximum, calls[i].end);
}
int *ongoingCalls = new int[maximum + 1];
for (int i = 0; i < sizeof(calls)/sizeof(calls[0]); ++i) {
for (int j = calls[i].start; j <= calls[i].end; ++j) {
++(ongoingCalls[j]);
}
}
for (int i = 0; i < maximum + 1; ++i) {
if (i % 50 == 0) {
std::cout << std::endl;
}
std::cout << ongoingCalls[i];
}
}