Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何明智地实施96个条件? 我试图编写一个C++程序,它生成一个报告,它提供了一个关于时间使用的报告。把时间分成一刻钟一段 00:00-00:14, 00:15-00:29, …, 23:45-23:59._C++_Algorithm_Time - Fatal编程技术网

如何明智地实施96个条件? 我试图编写一个C++程序,它生成一个报告,它提供了一个关于时间使用的报告。把时间分成一刻钟一段 00:00-00:14, 00:15-00:29, …, 23:45-23:59.

如何明智地实施96个条件? 我试图编写一个C++程序,它生成一个报告,它提供了一个关于时间使用的报告。把时间分成一刻钟一段 00:00-00:14, 00:15-00:29, …, 23:45-23:59.,c++,algorithm,time,C++,Algorithm,Time,我应该提供每次休息的事件数。这是到目前为止我的代码。如果有人能提出解决方案,我将不胜感激 string time = word; size_t found2 = word.find(":"); string tmpH,tmpM; tmpH = word.substr(0,found2); tmpM = word.substr((found2+1),word.length()); cout<<" word= "<<word<<" tmpH= "<&l

我应该提供每次休息的事件数。这是到目前为止我的代码。如果有人能提出解决方案,我将不胜感激

string time = word;
size_t found2 = word.find(":");
string tmpH,tmpM;
tmpH = word.substr(0,found2);
tmpM = word.substr((found2+1),word.length());
cout<<"  word=  "<<word<<" tmpH=  "<<tmpH<<"  tmpM=  "<<tmpM<<endl;
int h = atoi(tmpH.c_str());
int m = atoi(tmpM.c_str()); 
输出:

00:00-00:14   10 users logged in
00:15-00:29   15 users logged in
....
23:45-23:59   3 users logged in

因此,我在一小时内有4个条件,即96个时间条件?

首先,您可以将每段小时和分钟转换为分钟,例如23:45等于1095分钟。将所有这些块存储到列表中,并按开始时间对它们进行排序

对于每个事件,将每个事件时间转换为分钟数,并使用二进制搜索(或线性搜索)搜索最大开始时间小于或等于事件时间的块,该块将是此事件所属的块

排序的时间复杂度为O(1),因为只有很少的块,对于所有查询,时间复杂度为O(n),其中n是查询数。(在这种情况下,可以认为二进制搜索需要恒定的时间)


编辑:由于您添加了另一个约束,因此,您需要按日期和时间对所有事件进行排序,对于每个日期,您可以使用所描述的方法。

首先,您可以将每段小时和分钟转换为分钟,例如23:45等于1095分钟。将所有这些块存储到列表中,并按开始时间对它们进行排序

对于每个事件,将每个事件时间转换为分钟数,并使用二进制搜索(或线性搜索)搜索最大开始时间小于或等于事件时间的块,该块将是此事件所属的块

排序的时间复杂度为O(1),因为只有很少的块,对于所有查询,时间复杂度为O(n),其中n是查询数。(在这种情况下,可以认为二进制搜索需要恒定的时间)

编辑:由于您添加了另一个约束,因此,您需要按日期和时间对所有事件进行排序,对于每个日期,您可以使用所描述的方法。

给定行,如:

bkg988    sshd         Fri Mar 28 02:17 - 02:17  (00:00)   139.218.157.100
您可以这样做:

std::string to_month_number(const std::string& name)
{
    return name == "Jan" ? "01/" :
           name == "Feb" ? "02/" :
           ...;
}

typedef std::pair<std::string, int> When;
typedef std::map<When, int> Num_Logins;

Num_Logins num_logins;
std::string user, term, day, month, dom;
int hour, min;
char c;

while (std::cin >> user >> term >> dow >> month >> dom >> hour >> c >> min && c == ':')
{
    if (dom.length() == 1) dom = ' ' + dom; // standardise with for sorting...
    When when = std::make_pair(to_month_number(month) + ' ' + dom, (hour * 60 + min) / 15);
    ++num_logins[when];
}
给定行,如:

bkg988    sshd         Fri Mar 28 02:17 - 02:17  (00:00)   139.218.157.100
您可以这样做:

std::string to_month_number(const std::string& name)
{
    return name == "Jan" ? "01/" :
           name == "Feb" ? "02/" :
           ...;
}

typedef std::pair<std::string, int> When;
typedef std::map<When, int> Num_Logins;

Num_Logins num_logins;
std::string user, term, day, month, dom;
int hour, min;
char c;

while (std::cin >> user >> term >> dow >> month >> dom >> hour >> c >> min && c == ':')
{
    if (dom.length() == 1) dom = ' ' + dom; // standardise with for sorting...
    When when = std::make_pair(to_month_number(month) + ' ' + dom, (hour * 60 + min) / 15);
    ++num_logins[when];
}

你能举一个例子说明你的输入和你想要的输出吗?你到底有什么问题?你尝试了什么?你展示的代码与你的任务没有多大关系,不是吗?你试过什么?在几个小时内和每个季度进行一次循环非常简单。我添加了一个示例。loop的问题在于它不仅仅是一天。输入为用户登录年数,初始时间不是00:00。它可以是任何时候…你能举一个例子说明你的输入和你想要的输出吗?你到底有什么问题?你尝试了什么?你展示的代码与你的分配没有什么关系,不是吗?你试过什么?在几个小时内和每个季度进行一次循环非常简单。我添加了一个示例。loop的问题在于它不仅仅是一天。输入为用户登录年数,初始时间不是00:00。随时都可以……谢谢。这似乎是最好的办法,而不是转换成时间,并用96个变量检查时间框架。@Bernard,实际上,在这种情况下,你不需要二进制搜索,只要线性搜索就足够了:DThanks。这似乎是最好的办法,而不是转换为时间,并用96个变量检查时间框架。@Bernard,实际上,在这种情况下,你不需要二进制搜索,只要线性搜索就足够了:D