아니요, 코드의 시간 복잡성은 O(2^|<DeltaTime>|)
,
현재 시간의 적절한 코딩을 위해.
제 영어에 대해 먼저 사과하겠습니다.
CS에서 Big O의 정의 및 작동 방식
Big O 표기법 은 프로그램의 입력을 실행 시간과 연결하는 데 사용되지 않습니다 .
Big O 표기법은 엄격함을 남기고 두 양 의 점근 비율 을 표현하는 방법 입니다.
알고리즘 분석의 경우이 두 수량은 입력 (먼저 "측정"기능이 있어야 함) 및 실행 시간 이 아닙니다 .
이는 문제 1 의 인스턴스 코딩 길이 와 관심 메트릭입니다.
일반적으로 사용되는 측정 항목은 다음과 같습니다.
- 주어진 계산 모델에서 알고리즘을 완료하는 데 필요한 단계 수입니다.
- 그러한 개념이있는 경우 계산 모델에 필요한 공간입니다.
암시 적으로 TM을 모델로 가정하여 첫 번째 지점 은 전환 2 기능 , 즉 "단계" 의 응용 프로그램 수로 변환되고 두 번째 지점 은 적어도 한 번 기록 된 서로 다른 테이프 셀 의 수를 변환합니다 .
또한 원래의 인코딩 대신 다 항적으로 관련된 인코딩을 사용할 수 있다고 암시 적으로 가정하는 경우가 있습니까? 예를 들어 배열을 처음부터 끝까지 검색하는 함수 O(n)
는 이러한 배열의 인스턴스 코딩이 다음 길이를 가져야한다는 사실에도 불구하고 복잡합니다. 각 요소의 (상수) 기호 수는 n*b+(n-1)
어디에 있습니까 b
? 이는 b
계산 모델의 상수로 간주되므로 위의 표현식과 n
점근 적으로 동일하기 때문입니다.
등의 알고리즘 이유도 설명 평가판 부문 입니다 지수 기본적으로 인에도 불구하고 알고리즘 for(i=2; i<=sqr(N); i++)
알고리즘과 같은 3 .
참조 이 .
이것은 또한 big O 표기법이 문제를 설명하는 데 필요한만큼의 매개 변수를 사용할 수 있음을 의미합니다 . 일부 알고리즘에 대해 k 매개 변수 를 갖는 것은 드문 일이 아닙니다 .
따라서 이것은 "입력"또는 "입력이 없음"에 관한 것이 아닙니다 .
지금 연구 사례
Big O 표기법은 알고리즘에 의문을 제기하는 것이 아니라 수행중인 작업을 알고 있다고 가정합니다. 그것은 본질적으로 모든 곳에서 적용 가능한 도구이며, 심지어 당신과 같이 의도적으로 까다로울 수있는 알고리즘에도 적용됩니다.
문제를 해결하기 위해 현재 날짜와 미래 날짜를 사용 했으므로 어떻게 든 문제의 일부가되어야합니다. 간단히 말해서, 그것들은 문제의 일부입니다.
특히 인스턴스는 다음과 같습니다.
<DeltaTime>
여기서는 <>
선택의 비 병리 적 코딩을 의미합니다.
매우 중요한 설명 은 아래를 참조하십시오 .
따라서 O(2^|<DeltaTime>|)
현재 시간의 값에 따라 많은 반복을 수행하기 때문에 큰 O 복잡도 시간은 단지 입니다. 점근 표기법이 상수를 제거하므로 유용하므로 다른 숫자 상수를 넣는 것은 의미가 없습니다 (예를 들어의 사용 O(10^|<DeltaTime>|*any_time_unit)
은 무의미합니다).
까다로운 부분은
우리는 위에서 한 가지 중요한 가정을했습니다 : 계산 모델이 5 번 반복되고 시간이란 (실제?) 물리적 시간을 의미합니다. 표준 계산 모델에는 그러한 개념이 없습니다. TM은 시간을 알지 못합니다 . 이것이 우리의 현실이 작동하는 방식이기 때문에 시간을 단계 수와 연결합니다 4 .
모델에서 시간은 계산의 일부이지만 Main은 순수하지 않지만 개념은 동일하다고 말하여 기능적 사람들의 용어를 사용할 수 있습니다.
이것을 이해하려면 프레임 워크가 실제 시간보다 두 배, 다섯 배, 열 배 빠른 가짜 시간을 사용하는 것을 막을 수있는 것은 없습니다. 이렇게하면 코드가 "시간"의 "절반", "1/5", "1/10"에 실행됩니다.
이 반영은의 인코딩을 선택하는 데 중요합니다. 이것은 <DeltaTime>
본질적으로 <(CurrentTime, TimeInFuture)>를 작성하는 압축 된 방법입니다. 시간이 수도회에 존재하지 않는 때문에, currentTime을의 코딩 아주 잘 단어 수 이제 (또는 다른 선택) 전날으로 코딩 할 수 어제 ,이 가정을 파괴함으로써 그 코딩의 길이를 증가 물리적 시간과 앞으로 이동 (그리고 DeltaTime 중 하나가 감소 함)
유용한 작업을 수행하려면 계산 모델에서 시간을 적절하게 모델링해야합니다.
우리가 할 수있는 유일한 안전한 선택은 물리적 시간이 진행됨에 따라 증가하는 길이 (하지만 여전히 단항을 사용하지 않음)로 타임 스탬프를 인코딩하는 것입니다. 이것은 우리가 필요로하는 유일한 진정한 시간 속성이며 인코딩이 포착해야하는 속성입니다. 알고리즘에 시간 복잡성이 주어질 수있는 것은 이러한 유형의 인코딩에서만 가능합니까?
혼동이 있다면 ' 시간 복잡성 은 무엇입니까 ?'라는 문구에서 시간 이라는 단어가 있다는 사실에서 발생합니다. 그리고 '얼마나 시간 이 걸릴까요?' 매우 다른 것을 의미합니다
아아, 용어는 같은 단어를 사용하지만 머리 속에 "단계 복잡성"을 사용하여 자신에게 다시 질문 할 수 있습니다. 답이 실제로 ^ _ ^임을 이해하는 데 도움이되기를 바랍니다.
1 이것은 또한 각 인스턴스가 다르지만 임의적이지 않은 길이를 가지므로 점근 적 접근의 필요성을 설명합니다.
2 여기서 올바른 영어 용어를 사용하고 있기를 바랍니다.
3 또한 이것이 우리 log(log(n))
가 수학에서 종종 용어를 찾는 이유 입니다.
4 Idest, 단계는 유한하지만 null이 아니거나 연결되지 않은 시간 간격을 차지해야합니다.
5 이것은 물리적 시간에 대한 지식으로서의 계산 모드, 즉 용어로 표현할 수 있음을 의미합니다. 비유는 제네릭이 .NET 프레임 워크에서 작동하는 방식입니다.
O(N)
복잡하지O(1)