Я пытаюсь написать программу в 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 условий времени?
Во-первых, вы можете конвертировать каждый блок часа и минуты в минуты, например, 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];
}
Я подозреваю, что фактический ввод будет немного более сложным, причем дата форматируется по-разному, когда процесс начался в прошлом году или внутри дня, так что вам нужно будет настроить поля, обработанные. Чтобы воссоздать время, когда итерация по num_logins
для распечатки результатов, просто:
int hour = key->second / 4;
int min = (key->second % 4) * 15; // 00, 15, 30 or 45