如何明智地实施96条件?

时间:2014-04-03 08:51:55

标签: c++ algorithm time

我正在尝试用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个条件的时间?

2 个答案:

答案 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