Nie, Twój kod ma złożoność czasową O(2^|<DeltaTime>|)
,
Do prawidłowego zakodowania aktualnego czasu.
Proszę, pozwól mi najpierw przeprosić za mój angielski.
Co to jest i jak działa Big O w CS
Notacja Big O nie jest używana do powiązania wejścia programu z jego czasem wykonywania .
Notacja Big O jest sposobem na wyrażenie asymptotycznego stosunku dwóch wielkości , pozostawiając za sobą rygor .
W przypadku analizy algorytmu te dwie wielkości nie są danymi wejściowymi (dla których trzeba najpierw mieć funkcję „miary”) i czasem działania.
Są to długość kodowania wystąpienia problemu 1 i miara będąca przedmiotem zainteresowania.
Powszechnie używane metryki to
- Liczba kroków potrzebnych do wykonania algorytmu w danym modelu obliczeń.
- Przestrzeń wymagana przez model obliczeń, jeśli taka koncepcja istnieje.
Domyślnie zakłada się TM jako modelu, tak, że pierwszy punkt przekłada się na szeregu zastosowań przejście 2 funkcję , czyli „działania”, a drugi przekłada liczby różnych komórek Taśma zapisana co najmniej raz .
Czy często zakłada się niejawnie, że zamiast oryginalnego możemy użyć kodowania wielomianowego, na przykład funkcja przeszukująca tablicę od początku do końca ma O(n)
złożoność, mimo że kodowanie instancji takiej tablicy powinno mieć długość n*b+(n-1)
gdzie b
jest (stałą) liczbą symboli każdego elementu. Dzieje się tak, ponieważ b
jest uważana za stałą modelu obliczeniowego, a więc wyrażenie powyżej i n
jest asymptotycznie takie same.
Wyjaśnia to również, dlaczego algorytm taki jak podział prób jest algorytmem wykładniczym , mimo że zasadniczo jest for(i=2; i<=sqr(N); i++)
podobnym algorytmem 3 .
Zobacz to .
Oznacza to również, że notacja dużego O może używać tylu parametrów, które mogą być potrzebne do opisania problemu, czy nie jest niczym niezwykłym posiadanie parametru k dla niektórych algorytmów.
Więc to nie jest o „wejściu” lub, że „nie ma sygnału”.
Studium przypadku teraz
Notacja Big O nie kwestionuje twojego algorytmu, po prostu zakłada, że wiesz, co robisz. Zasadniczo jest to narzędzie stosowane wszędzie, nawet w przypadku algorytmu, który może być celowo podstępny (jak twój).
Aby rozwiązać problem, użyłeś daty bieżącej i przyszłej, więc muszą one w jakiś sposób być częścią problemu; po prostu: są częścią przypadku problemu.
Konkretnie chodzi o:
<DeltaTime>
Gdzie <>
oznacza jakiekolwiek, niepatologiczne, kodowanie z wyboru.
Poniżej znajdują się bardzo ważne wyjaśnienia.
Więc twój wielki czas złożoności O jest po prostu O(2^|<DeltaTime>|)
, ponieważ wykonujesz pewną liczbę iteracji, która zależy od wartości bieżącego czasu. Nie ma sensu wprowadzać innych stałych numerycznych, ponieważ notacja asymptotyczna jest przydatna, ponieważ eliminuje stałe (więc na przykład użycie O(10^|<DeltaTime>|*any_time_unit)
jest bezcelowe).
Gdzie jest trudna część
Zrobiliśmy jedno ważne założenie powyżej: model obliczeń reifikuje 5 razy, a przez czas mam na myśli (rzeczywisty?) Czas fizyczny. W standardowym modelu obliczeniowym nie ma takiej koncepcji, TM nie zna czasu, łączymy czas z liczbą kroków, ponieważ tak działa nasza rzeczywistość 4 .
Jednak w twoim modelu czas jest częścią obliczeń, możesz użyć terminologii ludzi funkcjonalnych, mówiąc, że Main nie jest czysty, ale koncepcja jest taka sama.
Aby to zrozumieć, należy zauważyć, że nic nie stoi na przeszkodzie, aby Framework używał fałszywego czasu, który działa dwa, pięć, dziesięć razy szybciej niż czas fizyczny. W ten sposób Twój kod będzie działał w „połowie”, „jednej piątej”, „jednej dziesiątej” „czasu”.
Ta refleksja jest ważna przy wyborze kodowania <DeltaTime>
, jest to zasadniczo skondensowany sposób pisania <(CurrentTime, TimeInFuture)>. Ponieważ czas nie istnieje w klasztorze, kodowanie CurrentTime mogłoby bardzo dobrze oznaczać słowo Teraz (lub jakikolwiek inny wybór), które dzień wcześniej można zakodować jako Wczoraj , łamiąc założenie, że długość kodowania rośnie wraz z czasem fizycznym idzie do przodu (a DeltaTime maleje)
Musimy odpowiednio modelować czas w naszym modelu obliczeniowym, aby zrobić coś pożytecznego.
Jedynym bezpiecznym wyborem, jaki możemy zrobić, jest kodowanie znaczników czasu o rosnących długościach (ale nadal bez użycia jednoargumentowego), gdy czas fizyczny posuwa się naprzód. To jedyna prawdziwa właściwość czasu, którego potrzebujemy, i ta, którą musi wychwycić kodowanie. Czy tylko przy takim typie kodowania algorytm może mieć złożoność czasową.
Twój błąd, jeśli w ogóle, wynikają z faktu, że słowo czas w oznaczeniach "Jaka jest jego czas złożoność? i „Ile czasu to zajmie?” oznacza bardzo różne rzeczy
Niestety terminologia używa tych samych słów, ale możesz spróbować użyć w swojej głowie „złożoności kroków” i ponownie zadać sobie pytanie, mam nadzieję, że pomoże Ci to zrozumieć, że odpowiedź naprawdę brzmi ^ _ ^
1 Wyjaśnia to również potrzebę podejścia asymptotycznego, ponieważ każdy przypadek ma inną, ale nie arbitralną długość.
2 Mam nadzieję, że używam tutaj prawidłowego angielskiego terminu.
3 Również dlatego często log(log(n))
w matematyce znajdujemy terminy.
4 To znaczy, krok musi zajmować jakiś ograniczony, ale nie zerowy, ani niepołączony, przedział czasu.
5 Oznacza to, że tryb obliczeniowy jako znajomość czasu fizycznego w nim jest, to znaczy można go wyrazić swoimi terminami. Analogią jest sposób działania typów ogólnych w środowisku .NET.
O(N)
złożonośćO(1)