Ні, ваш код має складність у часі O(2^|<DeltaTime>|)
,
Для правильного кодування поточного часу.
Будь ласка, дозвольте мені спочатку вибачитися за свою англійську.
Що таке і як працює Big O в CS
Позначення Big O не використовуються для прив'язки введення програми до часу її роботи .
Нотація великого O - це, залишаючи строгість позаду, спосіб виразити асимптотичне співвідношення двох величин .
У випадку аналізу алгоритму ці дві величини - це не вхід (для якого спочатку потрібно функціонувати "міряти"), а час роботи.
Вони - це довжина кодування екземпляра задачі 1 та метрика, що цікавить.
Поширені показники є
- Кількість етапів, необхідних для виконання алгоритму в заданій моделі обчислення.
- Простір, необхідний, якщо така концепція існує, для моделі обчислення.
Побічно передбачаються ТМ в якості моделі , так що перша точка переводить до числа застосувань переходу 2 функції , тобто «кроки», а другий переводить число різних стрічкових клітин , написаних щонайменше , один раз .
Чи часто також неявно передбачається, що ми можемо використовувати поліноміально пов'язане кодування замість оригінального, наприклад, функція, яка шукає масив від початку до кінця, має O(n)
складність, незважаючи на те, що кодування екземпляра такого масиву повинно мати довжину n*b+(n-1)
де b
(постійне) число символів кожного елемента. Це тому b
, що вважається константою обчислювальної моделі, тому вираз вище і n
є асимптотично однаковим.
Це також пояснює, чому такий алгоритм, як пробний відділ, є експоненціальним алгоритмом, незважаючи на те, що він є for(i=2; i<=sqr(N); i++)
подібним алгоритмом 3 .
Дивіться це .
Це також означає, що велика нотація O може використовувати стільки параметрів, які можуть знадобитися для опису проблеми, чи не незвично мати параметр k для деяких алгоритмів.
Тож мова не йде про "вхід" або про те, що "немає вводу".
Вивчіть справу зараз
Нотація великого O не ставить під сумнів ваш алгоритм, він просто передбачає, що ви знаєте, що робите. Це по суті інструмент, застосовний скрізь, навіть до алгоритму, який може бути навмисно хитрим (як і ваш).
Для вирішення вашої проблеми ви використовували поточну дату та майбутню дату, тому вони повинні якось бути частиною проблеми; просто кажучи: вони є частиною екземпляра проблеми.
Зокрема, це:
<DeltaTime>
Де <>
означає будь-яке, непатологічне, кодування вибору.
Дивіться нижче для дуже важливих роз'яснень.
Отже, ваш великий час складності O справедливий O(2^|<DeltaTime>|)
, тому що ви робите ряд ітерацій, які залежать від значення поточного часу. Немає сенсу ставити інші числові константи, оскільки асимптотичні позначення корисні, оскільки вони виключають константи (так, наприклад, використання O(10^|<DeltaTime>|*any_time_unit)
безглуздо).
Де хитра частина
Вище ми зробили одне важливе припущення: що модель обчислення повторно підтверджує 5 разів, а часом я маю на увазі (реальний?) Фізичний час. У стандартній обчислювальній моделі такої концепції немає, ТМ не знає часу, ми пов'язуємо час з кількістю кроків, тому що так працює наша реальність 4 .
У вашій моделі, однак час є частиною обчислень, ви можете використовувати термінологію функціональних людей, кажучи, що Main не є чистим, але концепція однаковою.
Щоб зрозуміти це, слід зазначити, що ніщо не заважає Рамкові використовувати підроблений час, який працює вдвічі, п’ять, десять разів швидше, ніж фізичний час. Таким чином ваш код буде працювати в "половині", "п'ятій п'ятірці", "одній десятій частині" часу ".
Це відображення важливе для вибору кодування <DeltaTime>
, це, по суті, стислий спосіб написання <(CurrentTime, TimeInFuture)>. Оскільки часу не існує пріорі, кодування CurrentTime цілком може бути словом Now (або будь-яким іншим вибором) напередодні можна було кодувати як Вчора , там, порушивши припущення, що тривалість кодування збільшується як фізичний час йде вперед (а цей у DeltaTime зменшується)
Ми повинні правильно моделювати час у нашій обчислювальній моделі, щоб зробити щось корисне.
Єдиний безпечний вибір, який ми можемо зробити, - це кодувати часові позначки із збільшенням довжини (але все ще не використовуючи одинарних) як фізичний час вперед. Це єдине справжнє властивість часу, яке нам потрібно, і те, яке потрібно кодувати. Чи тільки при такому типі кодування ваш алгоритм, можливо, має складність у часі.
Ваша плутанина, якщо така є, випливає з того, що слово час у фразах "Яка її часова складність?" і "Скільки часу це займе?" означає дуже різні речі
На жаль, термінологія використовує одні і ті ж слова, але ви можете спробувати використати "складність кроків" в голові і перепросити собі своє питання, сподіваюся, що допоможе зрозуміти відповідь насправді ^ _ ^
1 Це також пояснює необхідність асимптотичного підходу, оскільки кожен екземпляр має різну, але не довільну довжину.
2 Я сподіваюся, що тут я вживаю правильний англійський термін.
3 І саме тому ми часто знаходимо log(log(n))
в математиці терміни.
4 Точно крок повинен займати деякий кінцевий, але не нульовий і не пов'язаний інтервал часу.
5 Це означає, що обчислювальний режим як знання фізичного часу в ньому, тобто може виражати його своїми умовами. Аналогія - як дженерики працюють у рамках .NET.
O(N)
складність неO(1)