我正在尝试用c ++编写一个生成报告的程序,该报告按时间提供使用情况的报告。把时间分成四分之一小时
00:00-00:14, 00:15-00:29, …, 23:45-23:59.
我应该在每个休息时间提供一些事件。到目前为止这是我的代码。如果有人想出一个解决方案我很感激。
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());
//// 输入:
aa784 pts/30 Fri Mar 28 03:25 still logged in 101.175.22.198
aa784 sshd Fri Mar 28 03:25 still logged in 101.175.22.198
aa784 pts/30 Fri Mar 28 03:25 - 03:25 (00:00) 101.175.22.198
aa784 sshd Fri Mar 28 03:25 - 03:25 (00:00) 101.175.22.198
hmb183 sshd Fri Mar 28 03:24 still logged in c110-20-244-248.mirnd4.nsw.optusnet.com.au
bkg988 sshd Fri Mar 28 03:24 - 03:24 (00:00) 139.218.157.100
hmb183 sshd Fri Mar 28 03:21 - 03:22 (00:01) c110-20-244-248.mirnd4.nsw.optusnet.com.au
fmm290 pts/43 Fri Mar 28 03:11 still logged in 1002-wan-001.rhw.com.au
fmm290 sshd Fri Mar 28 03:11 still logged in 1002-wan-001.rhw.com.au
bkg988 sshd Fri Mar 28 03:09 - 03:09 (00:00) 139.218.157.100
pm554 pts/14 Fri Mar 28 02:22 still logged in ppp239-204.static.internode.on.net
pm554 sshd Fri Mar 28 02:22 still logged in ppp239-204.static.internode.on.net
bkg988 sshd Fri Mar 28 02:17 - 02:17 (00:00) 139.218.157.100
bkg988 sshd Fri Mar 28 02:12 - 02:12 (00:00) 139.218.157.100
bkg988 sshd Fri Mar 28 02:10 - 02:10 (00:00) 139.218.157.100
bx972 pts/12 Fri Mar 28 02:09 still logged in cpe-121-218-195-236.lnse4.cht.bigpond.net.au
bkg988 sshd Fri Mar 28 02:07 - 02:07 (00:00) 139.218.157.100
hmb183 sshd Fri Mar 28 02:05 - 02:06 (00:01) c110-20-244-248.mirnd4.nsw.optusnet.com.au
bkg988 sshd Fri Mar 28 02:04 - 02:04 (00:00) 139.218.157.100
输出:
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个条件的时间?
答案 0 :(得分:3)
首先,您可以将每小时和分钟的块转换为分钟,例如23:45等于1095分钟。将所有这些块存储到列表中并按其开始时间排序。
对于每个事件,将每个事件时间转换为分钟数并使用二进制搜索(或线性搜索)来搜索最大起始时间小于或等于到事件时间,该块将是此事件所属的块。
排序的时间复杂度是O(1),因为只有很少的块,并且,对于所有查询将是O(n),其中n是查询的数量。(在这种情况下的二进制搜索可以被认为是常量时间)。
编辑:当您添加了另一个约束时,您需要按日期和时间对所有事件进行排序,并且对于每个日期,您可以使用所描述的方法。
答案 1 :(得分:1)
给出如下行:
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];
}
我怀疑实际输入会更复杂一些,当进程从去年或当天开始时,日期格式不同,因此您需要调整解析出的字段。要重复迭代num_logins
以打印结果的时间,只需:
int hour = key->second / 4;
int min = (key->second % 4) * 15; // 00, 15, 30 or 45