시간과 공간의 복잡성에 대해 배우기

알고리즘 시간 복잡도 정의

알고리즘을 분석할 때 전체 명령문 실행 횟수 T(n)은 문제 크기 n 의 함수 이며, n 에 따른 T(n) 의 변화를 분석하여 T(n) 의 크기 순서를 결정합니다. 알고리즘의 시간 복잡도는 알고리즘의 시간 측정입니다. 다음과 같이 기록됩니다: T(n)=O(f(n)) . 이는 문제 n이 증가 할수록 알고리즘 실행 시간의 증가율이 f(n)의 증가율과 동일하다는 것을 의미하는데, 이를 알고리즘의 점근적 시간 복잡도라고 하며, 이를 시간 복잡도라고 합니다 . 그 중 f(n)은 문제 크기 n의 함수이다.

표준 알고리즘 측정 단위

점근 표기법

1、Θ(빅세타)

양의 상수 c1, c2 및 n0이 있어 n ≥ n0일 때 부등식 0 ≤ c1g(n) ≤ f(n) ≤ c2g(n)이 항상 참인 경우 g(n)은 멤버라고 합니다. f(n)의 점근적 컴팩트 경계는 Θ로 표시됩니다. 이는 점근적 상한점근적 하한을 포함합니다 .

간단한 이해는 n ≥ n0일 때 f(n)이 c1g(n)과 c2g(n) 사이에 끼어 있으면 c1g(n)은 f (n)의 점근 하한 이고 c2g(n)은 f( n)의 점근적 상한은 아래 그림과 같습니다.

여기에 이미지 설명을 삽입하세요.

2、O(빅오)

양의 상수 c와 n0이 있어서 n ≥ n0일 때 부등식 0 ≤ f(n) ≤ cg(n)이 항상 유지되면 g(n)은 f(n)의 점근 상한 이라고 합니다. , O로 표시됩니다.

간단히 이해하면 n ≥ n0일 때 cg(n)은 항상 f(n)보다 높습니다. cg(n)은 f(n)의 점근 상한 입니다 . 아래 그림과 같이.

여기에 이미지 설명을 삽입하세요.

3、Ω(큰 오메가)

양의 상수 c와 n0이 있어 n ≥ n0일 때 부등식 0 ≤ cg(n) ≤ f(n)이 항상 참인 경우 g(n)은 f(n의 점근 하한) 이라고 합니다. ) , Ω 으로 표시됩니다.

간단한 이해는 n ≥ n0일 때 cg(n)은 항상 f(n)보다 낮다는 것입니다. cg(n)은 f(n)의 점근 하한 입니다 . 아래 그림과 같이.
여기에 이미지 설명을 삽입하세요.

최악의 경우 알고리즘의 시간 복잡도를 나타내기 위해 O를 사용하고, 최선의 경우 알고리즘의 시간 복잡도를 나타내기 위해 Ω을 사용하고, 평균적인 경우에 알고리즘의 시간 복잡도를 나타내기 위해 Θ를 사용합니다. 이는 알고리즘 서적에서 상대적으로 표준적인 내용으로 요즘 대부분의 인터넷에서는 O를 직접 사용하여 요약하므로 여기서만 이해하면 됩니다.

여기 인터넷에 있는 글을 보고 배웠습니다.
원본링크: https://blog.csdn.net/qq_31116753/article/details/81602582

시간 복잡도 단계 및 규칙 도출

단계

  1. 알고리즘에서 기본 명령문을 찾으십시오.
    알고리즘에서 가장 많이 실행되는 명령문은 기본 명령문이며 일반적으로 가장 안쪽 루프의 루프 본문입니다.

  2. 기본문 실행 횟수의 크기 차수를 계산하고,
    최고차항만 유지하면서 기본문 실행 횟수의 크기 순서를 계산합니다. 이는 알고리즘 분석을 단순화하고 가장 중요한 점인 성장률에 주의를 집중시킵니다.

  3. 런타임 시 모든 추가 상수를 상수 1로 바꿉니다.

  4. 최고차 항이 존재하고 1이 아닌 경우 이 항을 곱한 상수를 제거합니다. 결과는 Big O 순서입니다.

O(log2n), O(n), O(nlog2n), O(n2) 및 O(n3)은 다항식 시간이라고 하며 O(2n) 및 O(n!)은 지수 시간이라고 합니다. 컴퓨터 과학자들은 일반적으로 전자가 효과적인 알고리즘이라고 믿고 이러한 문제를 P(Polynomial, Polynomial) 문제라고 부르고, 후자를 NP(Non-Deterministic Polynomial, Non-Deterministic Polynomial) 문제라고 부릅니다.

  1. 일부 간단한 입력 및 출력 문이나 대입문의 경우 O(1) 시간이 소요되는 것으로 추정됩니다.

  2. 순차 구조의 경우 일련의 명령문을 순차적으로 실행하는 데 필요한 시간을 Big O의 "합산 규칙"을 사용하는 데 사용할 수 있습니다. 합산 규칙: 알고리즘의 두 부분의 시간 복잡도가 T1( n)=O(f(n) )) 및 T2(n)=O(g(n)), 그러면 T1(n)+T2(n)=O(max(f(n),g(n)) ). 특히 T1(m)=O(f(m)), T2(n)=O(g(n))이면 T1(m)+T2(n)=O(f(m)+g( N))

  3. if 문과 같은 선택 구조의 경우, 주요 시간 소비는 then 절이나 else 절을 ​​실행하는 데 소요되는 시간이며, 테스트 조건에도 O(1) 시간이 필요하다는 점에 유의해야 합니다.

  4. 루프 구조의 경우 루프 문의 실행 시간은 주로 루프 본문을 실행하고 여러 반복에서 루프 조건을 테스트하는 데 소요되는 시간에 반영됩니다. 일반적으로 Big O의 "곱셈 규칙"을 사용할 수 있습니다. 곱셈 규칙
    : 알고리즘의 두 부분의 시간 복잡도 T1(n)=O(f(n)) 및 T2(n)=O(g(n)), 그러면 T1*T2=O(f(n)*g (N))

  5. 복잡한 알고리즘의 경우 추정하기 쉽도록 여러 부분으로 나누어 합산법칙과 곱셈법칙 기술을 사용할 수 있으며, 전체 알고리즘의 시간복잡도
    역시 다음과 같은 2가지 연산규칙을 갖는다. n)=O(f(n)), 그러면 O(f(n))+O(g(n))=O(f(n)); (2)O(Cf(n)) = O(f (n)) , 여기서 C는 양의 상수입니다.

1. 꾸준한 주문

시퀀스 구조의 복잡성. 다음으로 가우스의 정리를 사용하여 1, 2, 3...n개의 숫자의 합을 계산합니다.

여기에 이미지 설명을 삽입하세요.
이 요소를 함수로 취급합니다. 함수에는 f(n) = 3으로 표시되는 세 개의 진술이 있습니다. 위의 규칙에 따르면 함수는 n의 영향을 받지 않고 상수 항이므로 시간 복잡도는 O 로 표시됩니다. (1). . 문제의 크기(n의 크기)에 관계없이 일정한 실행 시간을 갖는 이 알고리즘을 O(1)의 시간 복잡도라고 하며, 상수 차수라고도 합니다 .

2. 선형 순서

선형 순서 순환 구조는 훨씬 더 복잡합니다. 알고리즘의 순서를 결정하려면 특정 명령문이나 명령문 세트가 실행된 횟수를 결정해야 하는 경우가 많습니다. 따라서 알고리즘의 복잡성을 분석하려면 루프 구조의 작동을 분석하는 것이 핵심입니다.

여기에 이미지 설명을 삽입하세요.
위 그림에서 진술 1의 빈도는 1,
진술 2의 빈도는 1,
진술 3의 빈도는 1,
진술 4의 빈도는 n,
진술 5의 빈도는 n,
진술 6의 빈도는 는 n
이므로 2차 함수는 f(n) = 1 + 1 + 1 + n + n + n = 3n + 3으로 기록됩니다. 규칙에 따르면 이 알고리즘의 시간 복잡도는 O(n)입니다.

3. 대수 차수

여기에 이미지 설명을 삽입하세요.

위 그림과 같이 n>1 이고 , 1 문의 빈도는 1,
2 문의 빈도는 2^f(n) <= n f(n) = log2^n 임을 알 수 있으며
,
최대값 f(n) = log2^n을 취하므로
시간 복잡도는 O(log2^n)으로 기록됩니다.

4. 정사각형 순서

여기에 이미지 설명을 삽입하세요.
위 그림에서 볼 수 있듯이
, 진술 1의 빈도는 1이고,
진술 2의 빈도는 n n
f(n) = 1 + n
n = n^2+1
이므로 시간 복잡도는 O(n)으로 기록됩니다. ^2).

5. 큐빅 차수

여기에 이미지 설명을 삽입하세요.
위 그림과 같이
f(n) = 1 + n n n = n^3+1
이므로 시간 복잡도는 O(n^3)으로 기록됩니다.

이전에 겪었던 흥미로운 질문을 확장해 보세요.

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
수학 공식 보충

공식 1: 1 2/2+2 3/2+3*4/2+…+n(n+1)/2=n(n+1)(n+2)/6
공식 2: 1 2+ 2 2+3 2+…+n 2=n(n+1)(2n+1)/6공식 3
: 1 3+2 3+3 3+…+n 3=[n(n+1) / 2]^2
여기에 이미지 설명을 삽입하세요.
f(n) = n(n+1)(n+2)/6
= n(n^2 +3n +3)/6
= (n^3 + 3n^2 + 3n)/
6 시간 복잡도는 O(n^3)입니다.

일반적인 시간 복잡도 비교

일반적으로 사용되는 시간 복잡도는 작은 것부터 큰 것까지 다음과 같습니다.
O(1) < O(log2 ^n) < O(n) < O(nlog2 ^n) < O(n ^ 2) < O(n ^ 3) < O(2 ^n) < O(n!) < O(n ^n)

지수차수 O(2^n), 계승차 O(n!) 등 아주 작은 n값이 아닌 이상 n이 100에 불과하더라도 악몽같은 실행시간이다. 따라서 우리는 일반적으로 이러한 비현실적인 알고리즘 시간 복잡도에 대해 논의하지 않습니다.

최악의 경우와 평균적인 경우

n개의 난수 배열에서 숫자를 검색합니다. 가장 좋은 경우는 첫 번째 숫자가 이고 알고리즘의 시간 복잡도는 O(1)이지만 숫자가 마지막 위치에서 기다리고 있을 수도 있습니다. . 이면 알고리즘의 시간 복잡도는 O(n)이 되며 이는 최악의 경우입니다.
최악의 런타임은 런타임이 결코 악화되지 않는다는 것을 보장합니다. 이것이 가장 중요한 요구 사항 중 하나인 응용 프로그램에서 일반적으로 달리 지정하지 않는 한 우리가 언급하는 실행 시간은 최악의 실행 시간입니다.
평균 실행 시간은 확률 관점에서 나온 것이며, 각 위치에서 이 숫자가 나올 가능성은 동일하므로 대상 요소를 찾는 데 평균 검색 시간은 n/2배입니다. 무엇보다도 평균 실행 시간은 예상 실행 시간이기 때문에 가장 의미가 크다. 즉, 프로그램 코드를 실행할 때 평균 실행 시간을 확인하려고 합니다. 그러나 현실적으로 평균 러닝타임은 분석을 통해 구하기 어려우며, 일반적으로 일정량의 실험 데이터를 실행하여 추정한다. 일반적으로 달리 명시하지 않는 한 최악의 시간복잡도를 의미한다.

알고리즘 공간 복잡도

시간 복잡도에 대한 논의와 유사하게, 알고리즘의 공간 복잡도 S(n)는 알고리즘이 소비하는 저장 공간으로 정의되며, 이는 문제 크기 n의 함수이기도 합니다. 점근적 공간 복잡도는 간단히 공간 복잡도라고도 합니다. 공간 복잡도는 알고리즘이 작동하는 동안 일시적으로 차지하는 저장 공간의 양을 측정한 것입니다. 컴퓨터 메모리에서 알고리즘이 차지하는 저장 공간은 저장 알고리즘 자체가 차지하는 저장 공간 , 알고리즘의 입력과 출력이 차지하는 저장 공간, 연산 중에 알고리즘이 일시적으로 차지하는 저장 공간의 세 가지 측면을 포함합니다. 알고리즘의 입출력 데이터가 차지하는 저장 공간은 해결하려는 문제에 따라 결정되며 매개변수 테이블을 통해 호출 함수에 의해 전달되며, 알고리즘이 달라도 변경되지 않습니다. 저장 알고리즘 자체가 차지하는 저장 공간은 알고리즘을 쓰는 길이에 비례하는데, 이 영역의 저장 공간을 압축하려면 더 짧은 알고리즘을 작성해야 한다. 알고리즘이 작동 중 임시로 차지하는 저장 공간은 알고리즘에 따라 다릅니다. 일부 알고리즘은 소수의 임시 작업 단위만 차지하면 되며 문제의 크기에 따라 변하지 않습니다. 우리는 이 알고리즘을 "in-place"라고 부릅니다. 위에서 설명한 저장 공간 절약 알고리즘입니다. 일부 알고리즘이 점유해야 하는 임시 작업 단위의 수는 문제 n의 규모와 관련이 있으며, 이는 n이 증가함에 따라 증가하며, n이 클수록 더 많은 저장 단위를 차지하게 됩니다.

알고리즘의 공간 복잡도가 일정할 때, 즉 처리할 데이터 n의 크기에 따라 변하지 않는 경우에는 O(1)로 표현할 수 있고, 알고리즘의 공간 복잡도가 비례할 때 2를 밑으로 하는 n의 로그에 비례하면 0(log2^n)으로 표현할 수 있고, 알고리즘의 공간복잡도가 n에 선형적으로 비례하면 0(n)으로 표현할 수 있다. 형식 매개변수는 배열이므로 저장 공간만 할당하면 됩니다. 실제 매개변수가 전송하는 주소 포인터의 공간, 즉 기계어 길이 공간, 형식 매개변수가 참조인 경우에는 공간 할당만 ​​하면 됩니다. 주소를 저장하는 공간으로, 해당 실제 매개변수 변수의 주소를 저장하는데 사용하므로 실제 매개변수 변수는 시스템에서 자동으로 참조됩니다.

알고리즘의 공간 복잡도는 알고리즘이 필요로 하는 저장 공간을 계산하여 구현되며, 알고리즘 공간 복잡도의 계산식은 S(n) = O(f(n))으로 기록됩니다. 문제에서 f(n)은 n에 관한 진술이 차지하는 저장 공간의 함수입니다.

일반적으로 프로그램이 기계에서 실행될 때 프로그램 자체의 명령, 상수, 변수 및 입력 데이터를 저장하는 것 외에도 데이터 작업을 위한 저장 단위도 저장해야 합니다. 입력 데이터가 차지하는 공간이 문제 자체에만 의존하고 알고리즘과는 아무런 관련이 없다면 알고리즘 구현에 필요한 보조 단위만 분석하면 됩니다. 알고리즘 실행에 필요한 보조 공간이 입력 데이터의 양에 비해 일정하면 알고리즘은 제자리에서 작동한다고 하며 공간 복잡도는 O(1)입니다. O(1)의 문제에 있어서, O(1)은 데이터의 크기가 임시변수의 개수와 무관하다는 뜻이며, 임시변수가 하나만 정의된다는 의미는 아니다. 예를 들어, 데이터 크기가 아무리 커도 100개의 변수를 정의하는데, 이를 데이터 크기라고 하며 임시 변수의 개수는 상관이 없습니다. 즉, 공간복잡도는 O(1)이다.

알고리즘의 경우 시간 복잡도와 공간 복잡도가 서로 영향을 미치는 경우가 많습니다. 더 나은 시간 복잡도를 추구하면 공간 복잡도의 성능이 나빠질 수 있습니다. 즉, 더 많은 저장 공간을 차지할 수 있으며, 반대로 더 나은 공간 복잡도를 추구하면 시간 복잡도가 더 나빠질 수 있습니다. 실행 시간이 길어졌습니다. 또한 알고리즘의 모든 성능 간에는 어느 정도 상호 영향이 있습니다. 따라서 알고리즘(특히 대규모 알고리즘)을 설계할 때에는 알고리즘의 성능, 알고리즘의 사용 빈도, 알고리즘이 처리하는 데이터의 양, 알고리즘 기술 언어의 특성, 기계의 특성 등을 종합적으로 고려해야 한다. 알고리즘이 실행되는 시스템 환경 등 다양한 요소를 고려해야만 더 나은 알고리즘을 설계할 수 있습니다.

일반적으로 사용되는 알고리즘의 시간 복잡도와 공간 복잡도

여기에 이미지 설명을 삽입하세요.

일부 계산 규칙

1. 추가 규칙

 T(n,m) = T1(n) + T2(m) = O(max{f(n), g(m)})

2. 곱셈 규칙

 T(n,m) = T1(n) * T2(m) = O(max{f(n)*g(m)})

3. 복잡성과 시간 효율성의 관계

c(常数) < logn < n < n*logn < n^2 < n^3 < 2^n < 3^n < n!
l------------------------------l--------------------------l--------------l
               较好                          一般                    较差

원본 링크: https://blog.csdn.net/daijin888888/article/details/66970902#commentBox

추천

출처blog.csdn.net/qq_42194657/article/details/135438355