이 용어 "O (1) 액세스 시간"이 "빠르게"를 의미하는 것을 보았지만 그 의미를 이해하지 못합니다. 같은 맥락에서 볼 수있는 다른 용어는 "O (n) 액세스 시간"입니다. 누군가이 용어가 의미하는 바를 간단한 방식으로 설명해 주시겠습니까?
또한보십시오
이 용어 "O (1) 액세스 시간"이 "빠르게"를 의미하는 것을 보았지만 그 의미를 이해하지 못합니다. 같은 맥락에서 볼 수있는 다른 용어는 "O (n) 액세스 시간"입니다. 누군가이 용어가 의미하는 바를 간단한 방식으로 설명해 주시겠습니까?
또한보십시오
답변:
당신은 복잡성의 순서를 읽고 싶을 것입니다.
http://en.wikipedia.org/wiki/Big_O_notation
간단히 말해서 O (1)은 14 나노초와 같이 일정한 시간이 걸리거나 세트의 데이터 양에 관계없이 3 분이 걸린다는 것을 의미합니다.
O (n)은 세트의 크기에 비례하는 시간이 걸리므로 크기가 두 배인 세트는 두 배의 시간이 걸립니다. 당신은 아마 이것들 중 하나에 백만 개의 물체를 넣고 싶지 않을 것입니다.
int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }
is O(1)
.
본질적으로 컬렉션에있는 항목의 수가 적든 매우 많든 상관없이 (하드웨어의 제약 내에서) 컬렉션에서 값을 찾는 데 동일한 시간이 걸립니다.
O (n)은 항목을 찾는 데 걸리는 시간이 컬렉션의 항목 수에 비례 함을 의미합니다.
일반적인 예로는 크기에 관계없이 직접 액세스 할 수있는 배열과 주어진 항목에 액세스하기 위해 처음부터 순서대로 순회해야하는 연결 목록이 있습니다.
일반적으로 논의되는 다른 작업은 삽입입니다. 컬렉션은 액세스의 경우 O (1)이고 삽입의 경우 O (n) 일 수 있습니다. 실제로 배열은 정확히이 동작을 가지고 있습니다. 왜냐하면 중간에 항목을 삽입하려면 다음 슬롯에 복사하여 각 항목을 오른쪽으로 이동해야하기 때문입니다.
현재이 질문에 응답하는 모든 답변은 O(1)
평균 상수 시간 (측정에 발생하는 모든 일, 런타임, 작업 수 등이 될 수 있음)을 의미합니다. 이것은 정확하지 않습니다.
런타임 O(1)
이라는 것은 입력과 무관하게 c
런타임이 위에 바운드 되는 상수 가 있음을 의미합니다 c
. 예를 들어 n
정수 배열의 첫 번째 요소를 반환하는 것은 O(1)
다음과 같습니다.
int firstElement(int *a, int n) {
return a[0];
}
그러나이 기능도 O(1)
마찬가지입니다.
int identity(int i) {
if(i == 0) {
sleep(60 * 60 * 24 * 365);
}
return i;
}
여기서 런타임은 1 년으로 제한되어 있지만 대부분의 경우 런타임은 나노초 정도입니다.
그 실행은 말할 O(n)
일정이 있음을 의미 c
런타임 경계는 이상이되도록 c * n
, 여기서 n
측정 입력의 크기. 예를 들어, n
다음 알고리즘에 의해 정렬되지 않은 정수 배열에서 특정 정수의 발생 횟수를 찾는 것은 다음과 같습니다 O(n)
.
int count(int *a, int n, int item) {
int c = 0;
for(int i = 0; i < n; i++) {
if(a[i] == item) c++;
}
return c;
}
이는 각 요소를 한 번에 하나씩 검사하는 배열을 반복해야하기 때문입니다.
O (1)은 반드시 "빠르게"를 의미하지는 않습니다. 이는 걸리는 시간이 일정 하며 함수에 대한 입력 크기를 기반으로 하지 않음 을 의미합니다. 상수는 빠르거나 느릴 수 있습니다. O (n)은 함수에 걸리는 시간이 n으로 표시되는 함수에 대한 입력 크기에 정비례하여 변경됨을 의미합니다. 다시 말하지만, 그것은 빠르거나 느릴 수 있지만, n의 크기가 증가함에 따라 느려질 것입니다.
Big O 표기법 이라고하며 다양한 알고리즘에 대한 검색 시간을 설명합니다.
O (1)은 최악의 실행 시간이 일정 함을 의미합니다. 대부분의 경우 컬렉션을 우연히 검색 할 필요가 없으며 검색중인 내용을 즉시 찾을 수 있습니다.
O(1)
데이터 세트 n에 관계없이 항상 같은 시간에 실행됩니다. O (1)의 예는 인덱스로 요소에 액세스하는 ArrayList입니다.
O(n)
선형 순서라고도하는 성능은 입력 데이터의 크기에 정비례하여 선형 적으로 증가합니다. O (n)의 예는 임의의 위치에서 ArrayList 삽입 및 삭제입니다. 임의의 위치에서 각각의 후속 삽입 / 삭제로 인해 ArrayList의 요소가 선형 구조를 유지하기 위해 내부 배열의 왼쪽 오른쪽으로 이동합니다. 새 배열의 생성 및 이전 요소의 복사에 대해서는 말할 것도 없습니다. 따라서 처리 시간이 많이 소요되는 새로운 어레이로 인해 성능이 저하됩니다.
기본적으로 O (1)은 계산 시간이 일정하다는 것을 의미하고 O (n) 은 입력의 크기에 선형 적 으로 의존한다는 것을 의미합니다. 즉, 배열을 통해 반복하는 것은 O (n)을 갖습니다. 이는 숫자에 따라 달라지기 때문입니다. 최대 항목 수를 계산하면서 일반 숫자 사이의 최대 값은 O (1)입니다.
Wikipedia도 도움이 될 수 있습니다. http://en.wikipedia.org/wiki/Computational_complexity_theory
여기에 간단한 비유가 있습니다. O (1)을 사용하여 온라인으로 영화를 다운로드한다고 가정 해보십시오. 영화 한 편을 다운로드하는 데 5 분이 걸리더라도 20 편의 영화를 다운로드하는데도 같은 시간이 걸립니다. 따라서 다운로드하는 영화의 수는 중요하지 않습니다. 영화 한 편이든 20 편이든 같은 시간 (5 분)이 걸립니다. 이 비유의 일반적인 예는 영화 라이브러리에 가면 한 영화를 찍든 5 영화를 찍든 한 번에 선택하기 만하면됩니다. 따라서 같은 시간을 보냅니다.
그러나 O (n)을 사용하면 영화 한 편을 다운로드하는 데 5 분이 걸리면 영화 10 편을 다운로드하는 데 약 50 분이 걸립니다. 따라서 시간은 일정하지 않거나 다운로드하는 영화 수에 비례합니다.
알고리즘 소개 : Cormen, Leiserson, Rivest & Stein의 Second Edition은 44 페이지에 다음과 같이 말합니다.
모든 상수는 0 차 다항식이므로 모든 상수 함수를 Theta (n ^ 0) 또는 Theta (1)로 표현할 수 있습니다. 그러나이 후자의 표기법은 어떤 변수가 무한대 경향이 있는지 명확하지 않기 때문에 사소한 남용입니다. 우리는 종종 어떤 변수에 대해 상수 또는 상수 함수를 의미하기 위해 Theta (1) 표기법을 사용할 것입니다. ... 우리는 0 <= f (n) <= c * g (n)과 같은 양의 상수 c와 n0이 존재하는 함수 f (n)의 집합을 O (g (n))로 표시합니다. 모든 n> = n0. ... f (n) = Theta (g (n))는 f (n) = O (g (n))를 의미합니다. Theta 표기법이 O 표기법보다 강하기 때문입니다.
알고리즘이 O (1) 시간에 실행되면 점근 적으로 어떤 변수에도 의존하지 않음을 의미합니다. 즉, 1을 곱할 때 함수의 점근 복잡도 (~ 런타임)보다 큰 양의 상수가 하나 이상 존재 함을 의미합니다. n 값이 특정 금액 이상인 경우. 기술적으로 O (n ^ 0) 시간입니다.
내 관점에 따르면
O (1)은 최적의 경우 알고리즘의 시간 복잡도 분석에서 한 번에 하나의 작업 또는 명령을 실행하는 데 걸리는 시간을 의미합니다.