데이터 구조: 알고리즘에 대한 사전 이해

알고리즘은 특정 문제를 해결하기 위한 단계에 대한 설명으로 컴퓨터에서 유한한 명령 시퀀스로 표시되며 각 명령은 하나 이상의 작업을 나타냅니다.

알고리즘이란 무엇인가

1+2+3+...+100의 결과를 얻는 프로그램을 작성하라는 요청을 받았는데, 어떻게 작성해야 할까요?
대부분의 사람들은 즉시 다음 C 언어 코드(또는 다른 언어의 코드)를 작성합니다:

int a, sum- o, n= 100;
for (1 = 1; 1 <= n; i++) {
    
    
	sum = sumt + i;
}
printf("%d", sum);

18세기 독일의 작은 마을에서 태어난 위대한 수학자 가우스는 이렇게 대답합니다.

프로그램은 다음과 같이 구현됩니다.
int i, sum = O, n = 100; 
 sum = (1 + n ) * n / 2;
 printf("%d", sum);

특정 또는 특정 유형의 문제를 이해하려면 명령을 특정 작업 순서로 표현해야 합니다. 작업 순서에는 일련의 작업이 포함되며 각 작업은 특정 기능을 완성합니다. 이것이 바로 알고리즘입니다. (알고리즘은 실제로 문제를 해결하는 방법을 설명합니다.)

또한 위의 예에서 주어진 문제에 대해 이를 신속하게 해결하기 위한 여러 알고리즘이 있을 수 있다는 것을 확인했습니다.
일반적인 알고리즘이 있나요? 모든 질병을 치료할 수 있는 약이 있나요? 현실 세계의 문제는 온갖 종류가 있고, 물론 알고리즘도 끊임없이 변화하고 있으며, 모든 문제를 해결할 수 있는 보편적인 알고리즘은 없습니다. 작은 문제를 해결하는데도 아주 좋은 알고리즘은 적합하지 않을 수 있습니다.

알고리즘의 특성

알고리즘에는 입력, 출력, 유한성, 확실성, 실현 가능성이라는 다섯 가지 기본 특성이 있습니다.

  • 입력
    알고리즘에는 0개 이상의 입력이 있습니다 . 대부분의 알고리즘 입력 매개변수는 필요하지만 hello world!이와 같은 코드 인쇄와 같은 일부 경우에는 입력 매개변수가 필요하지 않습니다.
  • 출력
    알고리즘에는 적어도 하나 이상의 출력이 있습니다 . 알고리즘은 출력을 해야 하는데 출력이 필요하지 않은데 왜 이 알고리즘을 사용하는 걸까요? 출력은 인쇄물 형식이거나 하나 이상의 값 반환 형식일 수 있습니다.
  • 유한성(Finiteness)은
    무한 루프 없이 제한된 수의 단계를 실행한 후 알고리즘이 자동으로 종료되며, 각 단계는 허용 가능한 시간 내에 완료되는 것을 의미합니다 . 알고리즘을 작성하면 컴퓨터가 완성하는 데 20년이 걸리며, 수학적으로는 유한하지만 며느리가 시어머니가 되었기 때문에 알고리즘의 의미는 크지 않다. 엄청난.
  • 결정론적
    알고리즘의 각 단계에는 명확한 의미가 있으며 모호함이 없습니다 . 동일한 입력에는 고유한 출력 결과만 있을 수 있습니다.
  • 타당성
    알고리즘의 각 단계는 실행 가능해야 하며 제한된 횟수를 실행하여 완료할 수 있어야 합니다 . 타당성(Feasibility)이란 알고리즘을 프로그램으로 변환해 컴퓨터에서 오랫동안 실행해 올바른 결과를 얻을 수 있다는 뜻이다.

알고리즘 설계 요구 사항

알고리즘은 고유하지 않으며 동일한 문제를 해결하기 위해 여러 알고리즘이 있을 수 있습니다. 알고리즘이 독특하지는 않지만 비교적 좋은 알고리즘이 여전히 존재합니다.

  • 정확성
    알고리즘의 정확성은 알고리즘이 최소한 명확한 입력, 출력 및 처리를 갖추고 문제의 요구 사항을 올바르게 반영할 수 있으며 문제에 대한 올바른 답을 얻을 수 있음을 의미합니다.
  • 가독성
    알고리즘 설계의 또 다른 목적은 읽기, 이해 및 의사소통을 촉진하는 것입니다.
  • 견고성
    : 입력 데이터가 불법인 경우에도 알고리즘은 비정상적이거나 설명할 수 없는 결과를 생성하지 않고 이를 처리할 수 있습니다.
  • 높은 시간 효율성과 낮은 저장 용량
    설계 알고리즘은 높은 시간 효율성과 낮은 저장 용량 요구 사항을 충족하도록 노력해야 합니다. 사람들은 최소한의 돈을 쓰고 가장 짧은 시간에 가장 큰 일을 하고 싶어 합니다. 알고리즘도 같은 생각입니다. 동일한 일을 달성하기 위해 최소한의 저장 공간을 사용하고 최소한의 시간을 사용하는 것이 가장 좋은 알고리즘입니다.

요약하자면, 좋은 알고리즘은 정확성, 가독성, 견고성, 고효율 및 낮은 저장 용량이라는 특성을 가져야 합니다.

알고리즘 시간 복잡도

알고리즘을 분석할 때 총 문장 실행 횟수는 문제 크기의 함수이며, 이후 T(n)with 의 변화를 분석하여 크기의 순서를 결정합니다 . 알고리즘의 시간 복잡도, 즉 알고리즘의 시간 측정은 다음과 같이 작성됩니다 . 이는 문제의 크기가 커질수록 알고리즘 실행 시간의 증가율이 의 증가율 과 동일하다는 것을 의미하는데, 이를 알고리즘의 점근적 시간 복잡도라고 하며, 이를 시간 복잡도라고 합니다. 문제 크기의 일부 기능은 어디에 있습니까 ? 알고리즘의 시간 복잡도를 반영하기 위해 대문자 O() 를 사용하는 이 표기법을 Big O 표기법이라고 합니다.nT(n)nT(n)
T(n) = O(f(n))nf(n)f(n)n

Big O 순서를 도출합니다.
  • 런타임 시 모든 추가 상수를 상수 1로 바꿉니다.
  • 수정된 실행 횟수 함수에서는 가장 높은 차수의 항만 유지됩니다.
  • 최고차 항이 존재하고 1이 아닌 경우 이 항을 곱한 상수를 제거합니다.

일반적인 시간 복잡도

실행 시간 함수 수준 비공식 용어
12 오(1) 일정한 순서
2n+3 오( nn ) 선형 순서
3n 2n^{2}N2 +2n+3 오( nn ) 제곱 순서
5 로그 2 로그_{2}o g2n+20 O(로그 nn ) 로그 순서
2n+3n 로그 2 log_{2}o g2n+19 오( nnn 로그nn ) 로그인 순서
6n 3n^{3}N3 +2n 2n^{2}N2 +3n+4 O( n 3 n^{3}N3 ) 3차 순서
2n 2^{n}2N 오( 2n 2^{n}2 ) 지수 순서

작은 것부터 큰 것까지 일반적으로 사용되는 시간 복잡도는 다음과 같습니다.
O(1)<O(log nnn )<O(nn )<O(nn 로그nnn )<O(n 2 n^{2}N2 )<O(n 3 n^{3}N3 )<O(2n 2^{n}2n )<O(nn !)<O(nnn^{n}N )

알고리즘을 분석하는 한 가지 방법은 모든 상황의 평균을 계산하는 것이며, 이러한 시간 복잡도를 계산하는 방법을 평균 시간 복잡도라고 합니다. 또 다른 접근법은 최악의 시간 복잡도라고 불리는 최악의 시간 복잡도를 계산하는 것입니다. 일반적으로 달리 명시하지 않는 한 최악의 시간복잡도를 의미한다.

알고리즘 공간 복잡도

코드를 작성할 때 공간과 시간을 맞바꿀 수 있습니다. 예를 들어 특정 연도가 윤년인지 확인하기 위해 알고리즘을 작성하는 데 시간이 좀 걸릴 수 있으며, 알고리즘이므로 매해 1년이 주어지는 것을 의미합니다. , 윤년인지 계산이 필요합니다. 또 다른 방법은 미리 2050개의 요소로 배열을 만든 다음(연도 수는 실제보다 약간 큼) 모든 연도를 아래 첨자 숫자에 대응시키는 것입니다. 윤년인 경우 이 배열 항목의 값은 1입니다. , 그렇지 않은 경우 값은 0입니다. 이처럼, 소위 특정 연도가 윤년인지 판단하는 것은 이 배열에서 특정 항목의 값을 찾는 문제가 됩니다. 이때 우리의 연산은 최소화되지만 이 2050개의 0과 1은 하드디스크나 메모리에 저장되어야 한다. 이는 계산 시간을 위해 공간 오버헤드를 교환하는 작은 트릭입니다.

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

알고리즘 실행에 필요한 보조 공간이 입력 데이터의 양에 비해 일정하면 알고리즘은 제자리에서 작동한다고 하며 공간 복잡도는 0(1)입니다.

추천

출처blog.csdn.net/wujakf/article/details/127885423