“O (1) 액세스 시간”은 무엇을 의미합니까?


126

이 용어 "O (1) 액세스 시간"이 "빠르게"를 의미하는 것을 보았지만 그 의미를 이해하지 못합니다. 같은 맥락에서 볼 수있는 다른 용어는 "O (n) 액세스 시간"입니다. 누군가이 용어가 의미하는 바를 간단한 방식으로 설명해 주시겠습니까?

또한보십시오


답변:


161

당신은 복잡성의 순서를 읽고 싶을 것입니다.

http://en.wikipedia.org/wiki/Big_O_notation

간단히 말해서 O (1)은 14 나노초와 같이 일정한 시간이 걸리거나 세트의 데이터 양에 관계없이 3 분이 걸린다는 것을 의미합니다.

O (n)은 세트의 크기에 비례하는 시간이 걸리므로 크기가 두 배인 세트는 두 배의 시간이 걸립니다. 당신은 아마 이것들 중 하나에 백만 개의 물체를 넣고 싶지 않을 것입니다.


66
현명하게 말하면 런타임 (또는 작업 횟수 등)이 일정하다는 의미는 아닙니다. 이는 런타임 (또는 작업 수 등)이 상수로 제한되는 상수가 있음을 의미합니다. 런타임에는 여전히 큰 차이가있을 수 있습니다. 예 : int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }is O(1).
jason

제이슨 @ 훌륭한 통찰력!
Chris Ruskai

35

본질적으로 컬렉션에있는 항목의 수가 적든 매우 많든 상관없이 (하드웨어의 제약 내에서) 컬렉션에서 값을 찾는 데 동일한 시간이 걸립니다.

O (n)은 항목을 찾는 데 걸리는 시간이 컬렉션의 항목 수에 비례 함을 의미합니다.

일반적인 예로는 크기에 관계없이 직접 액세스 할 수있는 배열과 주어진 항목에 액세스하기 위해 처음부터 순서대로 순회해야하는 연결 목록이 있습니다.

일반적으로 논의되는 다른 작업은 삽입입니다. 컬렉션은 액세스의 경우 O (1)이고 삽입의 경우 O (n) 일 수 있습니다. 실제로 배열은 정확히이 동작을 가지고 있습니다. 왜냐하면 중간에 항목을 삽입하려면 다음 슬롯에 복사하여 각 항목을 오른쪽으로 이동해야하기 때문입니다.


21

현재이 질문에 응답하는 모든 답변은 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;
}

이는 각 요소를 한 번에 하나씩 검사하는 배열을 반복해야하기 때문입니다.


19

O (1)은 무언가에 액세스하는 시간이 컬렉션의 항목 수와 무관 함을 의미합니다.

O (N)은 항목에 액세스하는 시간이 컬렉션의 항목 수 (N)에 비례 함을 의미합니다.


14

O (1)은 반드시 "빠르게"를 의미하지는 않습니다. 이는 걸리는 시간이 일정 하며 함수에 대한 입력 크기를 기반으로 하지 않음 을 의미합니다. 상수는 빠르거나 느릴 수 있습니다. O (n)은 함수에 걸리는 시간이 n으로 표시되는 함수에 대한 입력 크기에 정비례하여 변경됨을 의미합니다. 다시 말하지만, 그것은 빠르거나 느릴 수 있지만, n의 크기가 증가함에 따라 느려질 것입니다.


9

Big O 표기법 이라고하며 다양한 알고리즘에 대한 검색 시간을 설명합니다.

O (1)은 최악의 실행 시간이 일정 함을 의미합니다. 대부분의 경우 컬렉션을 우연히 검색 할 필요가 없으며 검색중인 내용을 즉시 찾을 수 있습니다.


"검색 시간"을 "최악의 실행 시간"으로 바꾸면 함께합니다.
Jason Punyon

2
@Seb : 특히 OP가 액세스 시간에 대해 물었 기 때문에 그의 이름이 잘못되었다고 생각합니다.
jkeys 2009-06-14

6

O(1)데이터 세트 n에 관계없이 항상 같은 시간에 실행됩니다. O (1)의 예는 인덱스로 요소에 액세스하는 ArrayList입니다.

O(n)선형 순서라고도하는 성능은 입력 데이터의 크기에 정비례하여 선형 적으로 증가합니다. O (n)의 예는 임의의 위치에서 ArrayList 삽입 및 삭제입니다. 임의의 위치에서 각각의 후속 삽입 / 삭제로 인해 ArrayList의 요소가 선형 구조를 유지하기 위해 내부 배열의 왼쪽 오른쪽으로 이동합니다. 새 배열의 생성 및 이전 요소의 복사에 대해서는 말할 것도 없습니다. 따라서 처리 시간이 많이 소요되는 새로운 어레이로 인해 성능이 저하됩니다.


4

"Big O 표기법"은 알고리즘의 속도를 표현하는 방법입니다. n알고리즘이 작업하는 데이터의 양입니다. O(1)이는 아무리 많은 데이터가 있어도 일정한 시간에 실행된다는 것을 의미합니다. O(n)데이터 양에 비례 함을 의미합니다.


3

기본적으로 O (1)은 계산 시간이 일정하다는 것을 의미하고 O (n) 은 입력의 크기에 선형 적 으로 의존한다는 것을 의미합니다. 즉, 배열을 통해 반복하는 것은 O (n)을 갖습니다. 이는 숫자에 따라 달라지기 때문입니다. 최대 항목 수를 계산하면서 일반 숫자 사이의 최대 값은 O (1)입니다.

Wikipedia도 도움이 될 수 있습니다. http://en.wikipedia.org/wiki/Computational_complexity_theory


3

O (1)과 O (n)을 구별하는 가장 쉬운 방법은 배열과 목록을 비교하는 것입니다.

배열의 경우 올바른 인덱스 값이 있으면 즉시 데이터에 액세스 할 수 있습니다. (인덱스를 모르고 배열을 반복해야하는 경우 더 이상 O (1)이되지 않습니다)

목록의 경우 색인을 알든 모르 든 항상 반복해야합니다.


나는 O (1)의 예를 찾고 있었는데이 답변에만 이에 대한 설명이 있습니다.
neelmeg

3

여기에 간단한 비유가 있습니다. O (1)을 사용하여 온라인으로 영화를 다운로드한다고 가정 해보십시오. 영화 한 편을 다운로드하는 데 5 분이 걸리더라도 20 편의 영화를 다운로드하는데도 같은 시간이 걸립니다. 따라서 다운로드하는 영화의 수는 중요하지 않습니다. 영화 한 편이든 20 편이든 같은 시간 (5 분)이 걸립니다. 이 비유의 일반적인 예는 영화 라이브러리에 가면 한 영화를 찍든 5 영화를 찍든 한 번에 선택하기 만하면됩니다. 따라서 같은 시간을 보냅니다.

그러나 O (n)을 사용하면 영화 한 편을 다운로드하는 데 5 분이 걸리면 영화 10 편을 다운로드하는 데 약 50 분이 걸립니다. 따라서 시간은 일정하지 않거나 다운로드하는 영화 수에 비례합니다.


1

액세스 시간이 일정하다는 것을 의미합니다. 100 개 또는 100,000 개의 레코드에서 액세스하든 검색 시간은 동일합니다.

반대로 O (n) 액세스 시간은 검색 시간이 액세스하는 레코드 수에 정비례 함을 나타냅니다.


1

이는 액세스에 일정한 시간이 소요됨을 의미합니다. 즉 데이터 세트의 크기에 의존하지 않습니다. O (n)은 액세스가 데이터 세트의 크기에 선형 적으로 의존 함을 의미합니다.

O는 big-O라고도합니다.


1

알고리즘 소개 : 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) 시간입니다.


-2

O (1)은 랜덤 액세스를 의미합니다. 임의 액세스 메모리에서 모든 위치의 요소에 액세스하는 데 걸리는 시간은 동일합니다. 여기서 시간은 정수가 될 수 있지만 기억해야 할 것은 (n-1) 번째 또는 n 번째 위치에서 요소를 검색하는 데 걸리는 시간이 동일하다는 것입니다 (즉, 상수).

O (n)은 n의 크기에 의존합니다.


그것은 랜덤 액세스와는 아무 상관이 없다 - 투시 허용 대답은 추가 정보를 원하시면이 대답하기 전에 거의 일년 게시
Krease

-3

내 관점에 따르면

O (1)은 최적의 경우 알고리즘의 시간 복잡도 분석에서 한 번에 하나의 작업 또는 명령을 실행하는 데 걸리는 시간을 의미합니다.


6
더 열심히 노력하십시오. 그 특정한 질문은 단순한 관점이 아니라 명확한 정의가 필요합니다.
Alfabravo 2012
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.