Полный ответ на этот вопрос не указан выше, насколько я могу судить. Предположим, что наше расписание выглядит следующим образом:
protected function schedule(Schedule $schedule)
{
$schedule
-> command('cbh:dummyCommand')
-> everyFiveMinutes()
-> appendOutputTo ('/my/logs/laravel_output.log');
}
Я обнаружил, что этот код не запускает вашу работу каждые 5 минут. Это также предотвращает повторную команду, если она была запущена менее 5 минут назад.
Лучший способ подумать о том, что этот код задает именованную команду ", которая будет выполняться каждый раз минутная цифра текущего времени - 0
или 5
". Другими словами, если я запустил аргумент командной строки: php artisan schedule:run
в 11:04
, тогда ответ будет:
# No scheduled commands are ready to run.
Но если я запустил ту же команду в 11:00
или 11:05
, тогда мы получаем:
# Running scheduled command: php artisan cbh:dummyCommand >> /my/logs/laravel_output.log 2>&1
И я получаю вывод в своем лог-файле.
Я обнаружил выше, когда мой график everyFiveMinutes()
создавал журнал мой файл каждые 10 минут на основании того, что мой планировщик задач выполнялся каждые 2 минуты.
Однако это не совсем касается вашей проблемы, учитывая, что расписание daily()
(0 0 * * *
) выравнивается с вашим расписанием cron-job. Единственное, что я могу себе представить, это то, что есть некоторая несогласованность с вашими часовыми поясами, как это предлагает @Octavio Herrera. Но это трудно сказать, не зная немного больше о вашей среде.
Как отметил Стивен, фактическая алгоритмическая сложность упрощена до O(N^2)
, но, поскольку ваш вопрос касался измерения количества выполнений, я постараюсь подсчитать их для вас.
for (int i = 0; i < n; i++){
for (int j = i; j < n; j++){
sum += i;
}
}
Во-первых, внешний цикл
int i=0
будет выполнен только один раз.
i < n
будет выполнено n+1
раз
i++
будет выполнено n
раз
Поэтому у нас есть 2n+2
выполнений для внешнего цикла.
Давайте сначала кое-что проясним. Внешний цикл будет выполняться n
раз, а внутренний цикл - n/2
раз (в среднем). Поэтому каждая инструкция во внутреннем цикле будет выполнена n * n/2 = (n^2)/2
раз.
Внутренний цикл
int j = i
будет выполнен n
раз (помните, что он в цикле)
j< n
будет выполнен n+1 * n/2 = (n^2)/2 + n/2
times
j++
будет выполнено n*(n/2) = n^2/2
times
Теперь запомните, что каждая инструкция во внутреннем цикле будет выполняться (n^2)/2
раз.
sum += i
- это в основном 2 выполнения, которые будут выполняться n^2/2
раз каждое. Таким образом, это добавляет еще n^2
выполнений
. Всего их добавляем: (2n + 2) + n + (n^2)/2 + n/2 + (n^2)/2 + n^2 = 2n^2 + (7/2)n + 2
. Добавляя инструкции перехода, которые n
для внешнего цикла и n^2/2
для внутреннего цикла, мы получить общее количество (5/2)n^2 + (9/2)n + 2
.
Вы говорите, что ответ O (4N ^ 2 + 5N + 2) , но на самом деле ответ, если его уменьшить до BIG O, будет O (N ^ 2).
O (4N ^ 2 + 5N + 2 + что угодно, чем N ^ 2 ) сводится к O (N ^ 2).
Я постараюсь дать вам подсказку, если в будущем вы будете поражены в поиске сложностей в цикле.
1. Временная сложность функции рассматривается как O (1) , если она не содержит цикл, рекурсию и вызов любой другой не постоянной функции времени, в вашем случае sum += i;
2. Сложность времени цикла рассматривается как O (n) , если переменные цикла увеличиваются / уменьшаются на постоянную величину, в вашем случае внутренний цикл будет иметь сложность O (N), если он взят по отдельности.
3. Временная сложность вложенных циклов равна числу выполнений самого внутреннего оператора. В вашем случае O (N ^ k) -> O (N ^ 2)
Объединение 1 + 2 + 3 даст вам верхнюю границу как O (N ^ 2)
BLOCKQUOTE>
Большой O для сложности этого кода O(N^2)
. Любой другой ответ основан на неправильном понимании математического определения обозначения Big O и / или соглашений для его записи 1 sup>.
Вы говорите, что «ответ выше - O(4N^2 + 5N + 2)
». Это неверно Может случиться так, что количество команд (согласно определенным предположениям о командах и компиляторах) будет 4N^2 + 5N + 2
. Однако это НЕ обычный способ написать класс сложности Big O для функции.
Класс сложности не является функцией. Это бесконечный набор функций, которые удовлетворяют определенному математическому свойству. Соглашение состоит в том, чтобы использовать простейшую из всех функций в наборе для характеристики класса сложности.
1 - Некоторые люди утверждают, что не является неправильным использование нестандартных / нестандартных обозначений Big O. Однако это противоречит цели использования математической нотации ... которая представляет собой четкую передачу математических идей от одного человека к другому. Аналогия: если бы я написал 1 + 1 is 11
, я мог бы быть технически правильным (используя унарную запись), но это эпический провал как средство передачи идеи 1 + 1 = 2
. Sup>
Мой учитель спрашивает «точное» количество казней.
blockquote>Ну:
Это НЕ БОЛЬШОЙ О.
Это не особенно полезная мера, поскольку фактическая инструкция рассчитывается на реальном оборудовании после действительного компиляции с действительным [ 119] компиляция будет другой.
Вы говорите:
Я считаю, что каждая строка кода имеет определенное количество выполнений
blockquote>Проблема в том, что число «Выполнения» зависят от того, как вы определяете, что такое примитивные операции, и как вы компилируете код Java в примитивные операции.
Например, есть разные способы скомпилировать вложенные циклы в вашем примере в инструкции, которые дадут различное количество примитивных переходов, которые нужно выполнить. (Подумайте о развертывании цикла и / или массивном переключении.)
Это иллюстрируется ответом Никоса. Он тщательно учел инструкции (в соответствии со своей интерпретацией примитивных операций) и придумал другую формулу для вашего учителя. Кто прав? Вероятно, оба ... в зависимости от предположений.