Нет, ваш код имеет временную сложность O(2^|<DeltaTime>|)
,
Для правильного кодирования текущего времени.
Пожалуйста, позвольте мне сначала извиниться за мой английский.
Что такое Big O и как работает в CS
Обозначение Big O не используется для привязки ввода программы к времени ее выполнения .
Обозначение Big O - это способ выразить асимптотическое отношение двух величин без строгости. .
В случае анализа алгоритма эти две величины не являются входными данными (для которых нужно сначала иметь функцию «измерения») и временем работы.
Это длина кода экземпляра задачи 1 и интересующий показатель.
Обычно используемые метрики:
- Количество шагов, необходимых для завершения алгоритма в данной модели вычислений.
- Пространство, необходимое для модели вычислений, если такая концепция существует.
Косвенно предполагаются ТМ в качестве модели , так что первая точка переводит к числу применений перехода 2 функции , т.е. «ступеньки», а второй переводит число различных ленточных клеток , написанных по меньшей мере , один раз .
Также часто неявно предполагается, что мы можем использовать полиномиально связанную кодировку вместо исходной, например, функция, которая выполняет поиск в массиве от начала до конца, имеет O(n)
сложность, несмотря на то, что кодирование экземпляра такого массива должно иметь длину n*b+(n-1)
где b
- (постоянное) количество символов каждого элемента. Это потому, что b
считается константой вычислительной модели, поэтому выражение выше иn
асимптотически одинаковы.
Это также объясняет, почему алгоритм, подобный Trial Division, является экспоненциальным алгоритмом, несмотря на то, что он по сути for(i=2; i<=sqr(N); i++)
похож на алгоритм 3. .
Смотрите это .
Это также означает, что большая нотация O может использовать столько параметров, сколько может потребоваться для описания проблемы, разве нет ничего необычного в том, чтобы иметь k параметра для некоторых алгоритмов.
Так что это не речь о «вводе» или о том, что «ввода нет».
Изучите кейс сейчас
Обозначение Big O не ставит под сомнение ваш алгоритм, оно просто предполагает, что вы знаете, что делаете. По сути, это инструмент, применимый везде, даже для алгоритмов, которые могут быть намеренно хитрыми (например, ваш).
Чтобы решить вашу проблему, вы использовали текущую дату и дату в будущем, поэтому они каким-то образом должны быть частью проблемы; Проще говоря: они являются частью проблемы.
В частности, экземпляр:
<DeltaTime>
Где <>
означает любое, непатологическое, кодирование по выбору.
Ниже приведены очень важные пояснения.
Таким образом, ваше время большой сложности O справедливо O(2^|<DeltaTime>|)
, потому что вы выполняете количество итераций, которые зависят от значения текущего времени. Нет смысла вводить другие числовые константы, поскольку асимптотическая запись полезна, поскольку она исключает константы (поэтому, например, использование O(10^|<DeltaTime>|*any_time_unit)
бессмысленно).
Где сложная часть
Мы сделали одно важное предположение выше: что модель вычислений reificates 5 раза, а время я имею в виду физическое времени (реальный?). В стандартной вычислительной модели такой концепции нет, ТМ не знает времени, мы связываем время с количеством шагов, потому что так работает наша реальность 4 .
Однако в вашей модели время является частью вычислений, вы можете использовать терминологию функциональных людей, говоря, что Main не чист, но концепция та же.
Чтобы понять это, следует отметить, что ничто не мешает Framework использовать ложное время, которое выполняется в два, пять, десять раз быстрее физического времени. Таким образом, ваш код будет выполняться «половину», «одну пятую», «одну десятую» «времени».
Это отражение важно для выбора кодировки <DeltaTime>
, это, по сути, сокращенный способ записи <(CurrentTime, TimeInFuture)>. Поскольку время изначально не существует, кодирование CurrentTime вполне может быть словом « Сейчас» (или любым другим вариантом), за день до этого может быть закодировано как « Вчера» , нарушив предположение о том, что длина кодирования увеличивается с увеличением физического времени. идет вперед (а DeltaTime уменьшается)
Мы должны правильно моделировать время в нашей вычислительной модели, чтобы делать что-то полезное.
Единственный безопасный выбор, который мы можем сделать, - это кодировать временные метки с увеличивающейся длиной (но все же без использования унарных) по мере продвижения физического времени. Это единственное истинное свойство времени, которое нам нужно и которое нужно уловить кодировке. Только с этим типом кодирования вашему алгоритму может быть придана временная сложность.
Ваше замешательство, если таковое имеется, возникает из-за того, что слово время в фразах "Какова его временная сложность?" и "Сколько времени это займет?" означает очень разные вещи
Увы, в терминологии используются те же слова, но вы можете попробовать использовать в уме «сложность шагов» и снова задать себе свой вопрос, я надеюсь, что это поможет вам понять, что на самом деле ответ ^ _ ^
1 Это также объясняет необходимость асимптотического подхода, поскольку каждый экземпляр имеет разную, но не произвольную длину.
2 Надеюсь, я использую здесь правильный английский термин.
3 Также поэтому мы часто находим log(log(n))
термины в математике.
4 То есть шаг должен занимать некоторый конечный, но не нулевой, и не связанный интервал времени.
5 Это означает, что вычислительный режим как знание физического времени в нем, то есть может выразить его с его терминами. Аналогия заключается в том, как универсальные шаблоны работают в платформе .NET.
O(N)
сложностьO(1)