如何查找从文件中拨打最多次数的时段

时间:2019-01-27 12:42:00

标签: java

我需要使用以下内容创建一个Java项目: 我有一个输入文件,其中包含全年的通话范围(以毫秒为单位)–该文件按开始时间排序。 例如 0-100(通话从0开始到100结束) 1至100 5-50岁 60-150, 65-180 我需要返回一年中网络最繁忙的时期。 在此示例中,结果为65-100,因为在此期间空中有4个电话 我的堆内存有限(8GB),并且只能在文件上运行一次 在这里使用最佳逻辑是什么(在Java中)

1 个答案:

答案 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];
  }
}