Как правильно выполнить 96 условий?

0

Я пытаюсь написать программу в 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 условий времени?

  • 1
    Можете ли вы привести пример ввода, который вы имеете, и результата, который вы ищете?
  • 1
    В чем именно твоя проблема и что ты пробовал?
Показать ещё 2 комментария
Теги:
algorithm
time

2 ответа

3
Лучший ответ

Во-первых, вы можете конвертировать каждый блок часа и минуты в минуты, например, 23:45 равно 1095 минут. Хранение всех этих блоков в списке и сортировка их по времени начала.

Для каждого события преобразуйте каждое время события в число минут и используйте двоичный поиск (или линейный поиск) для поиска блока, у которого наибольшее время запуска меньше или равно времени события, и этот блок будет блокировать это событие к.

Сложность по времени для сортировки - это O (1), так как есть только несколько блоков, и для всех запросов будет O (n), причем n - это число запросов (двоичный поиск в этом случае можно считать постоянным).

Изменить. Поскольку вы добавили другое ограничение, поэтому вам нужно отсортировать все события по дате и времени, а для каждой даты вы можете использовать описанный подход.

  • 0
    Благодарю. Кажется, это лучшая идея вместо преобразования во время и проверки его с помощью 96 переменных.
  • 0
    @ Бернард, добро пожаловать :)
Показать ещё 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню