Точный счетчик исполнения Big O

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

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. Но это трудно сказать, не зная немного больше о вашей среде.

1
задан Common Man 16 January 2019 в 09:06
поделиться

3 ответа

Как отметил Стивен, фактическая алгоритмическая сложность упрощена до 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.

1140 Ну, или я, или ваш профессор что-то упустили, но, надеюсь, это немного поможет, поскольку может дать вам представление о том, как считать количество казней. Я не знаю, почему это полезно, хотя

0
ответ дан Nikos Tzianas 16 January 2019 в 09:06
поделиться

Вы говорите, что ответ 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)

0
ответ дан Common Man 16 January 2019 в 09:06
поделиться

Большой O для сложности этого кода O(N^2). Любой другой ответ основан на неправильном понимании математического определения обозначения Big O и / или соглашений для его записи 1 .

Вы говорите, что «ответ выше - O(4N^2 + 5N + 2)». Это неверно Может случиться так, что количество команд (согласно определенным предположениям о командах и компиляторах) будет 4N^2 + 5N + 2. Однако это НЕ обычный способ написать класс сложности Big O для функции.

Класс сложности не является функцией. Это бесконечный набор функций, которые удовлетворяют определенному математическому свойству. Соглашение состоит в том, чтобы использовать простейшую из всех функций в наборе для характеристики класса сложности.

1 - Некоторые люди утверждают, что не является неправильным использование нестандартных / нестандартных обозначений Big O. Однако это противоречит цели использования математической нотации ... которая представляет собой четкую передачу математических идей от одного человека к другому. Аналогия: если бы я написал 1 + 1 is 11, я мог бы быть технически правильным (используя унарную запись), но это эпический провал как средство передачи идеи 1 + 1 = 2.


Мой учитель спрашивает «точное» количество казней.

Ну:

  1. Это НЕ БОЛЬШОЙ О.

  2. Это не особенно полезная мера, поскольку фактическая инструкция рассчитывается на реальном оборудовании после действительного компиляции с действительным [ 119] компиляция будет другой.


Вы говорите:

Я считаю, что каждая строка кода имеет определенное количество выполнений

Проблема в том, что число «Выполнения» зависят от того, как вы определяете, что такое примитивные операции, и как вы компилируете код Java в примитивные операции.

Например, есть разные способы скомпилировать вложенные циклы в вашем примере в инструкции, которые дадут различное количество примитивных переходов, которые нужно выполнить. (Подумайте о развертывании цикла и / или массивном переключении.)

Это иллюстрируется ответом Никоса. Он тщательно учел инструкции (в соответствии со своей интерпретацией примитивных операций) и придумал другую формулу для вашего учителя. Кто прав? Вероятно, оба ... в зависимости от предположений.

0
ответ дан Stephen C 16 January 2019 в 09:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: