C 언어 데이터 구조 - 알고리즘

@ (데이터 구조 알고리즘)

알고리즘의 1. 정의

== == 산술 : 특정 문제 해결 단계와, 컴퓨터에 지시를 우선 순위 순서의 성능을 해결하는 기술, 및 각각이 하나 이상의 명령 작업을 나타낸다. (알고리즘은 문제 설명을 해결하는 방법이다.)

알고리즘의 2 특성

  1. 입출력
    알고리즘은 제로 또는 그 이상의 입력들을 갖는다. 인쇄로 "안녕하세요 세계!"입력 매개 변수를 필요로하지 않습니다.
    출력은 알고리즘 할 수는 없지만 입력이 있어야합니다 .
  2. 가난한있다
    == == 유한성은 : 제한 단계의 실행 후에 알고리즘을 지칭하지만, 자동 무한 루프가 종료되지 않고, 각 공정을 수용 가능한 기간내에 완료
    알고리즘 경우, 현실에서 물론 그것은 수학적 의미가 한정되어 있음을 완료하는 데 년이 걸리지 만 알고리즘의 의미가 아닙니다.
  3. 불확실성
    == == 확실성 : 알고리즘의 각 단계는 정의 된 의미를 모호 나타나지있다.
    특정 조건에서 알고리즘은 하나 개의 실행 경로 같은 입력은 고유의 출력을 가질 수있다. 알고리즘의 각 단계는 모호성없이 정확하게 정의한다.
  4. 타당성
    == == 타당성 : 알고리즘의 각 단계는 그 각각의 단계는 제한된 횟수를 수행하여 완료 될 수있다, 실현해야한다.
    타당성이 알고리즘은 컴퓨터 프로그램을 실행하고 올바른 결과를 얻을 변환 할 수 있다는 것을 의미한다.

3. 알고리즘의 설계 요구 사항

  1. 정확성
    == == 정확성 적어도 올바르게 입력, 출력 및 명확한 처리를 요구하는 문제를 반영해야 알고리즘을 의미한다, 당신이 바로 그 답을 얻을 수 있습니다.
    : 네 단계로 나누어
    1 알고리즘 프로그램없이 구문 오류.
    2. 출력 결과를 생성 할 수있는 알고리즘 프로그램은 유효 입력 데이터에 대한 요구를 만족시킨다.
    불법 입력 데이터 3. 알고리즘 프로그램은 결과의 사양을 충족 할 수 있습니다.
    4. 알고리즘 프로그램에도주의 깊게 테스트 데이터 출력 요구를 모두 만족시키기 매우 어려운 선택.
  2. 가독성
    == == 가독성 : 그것은 알고리즘의 또 다른 목적은 읽기, 이해와 소통의 용이성을 위해 설계되어 있습니다.
    알고리즘은 주로 사람들이 읽을 수와 기계 다음에 교환을 수행 할 수 있습니다. 좋은 가독성 알고리즘에 대한 사람들의 이해에 기여, 디버깅하기 어려운 많은 오류를 숨기고 수정 모호한 프로그램이 편리합니다.
  3. 견고성
    == == 견고성 : 입력 데이터가 정당하지 않은 경우, 알고리즘은 해당 프로세스보다는 예외 또는 불가해 결과를 만들 수있다.
    예를 들어, 입력 시간 또는 거리가 음수이어야한다.
  4. 고효율 및 낮은 축적 시간
    == == 시간 효율 : 알고리즘의 실행 시간을 말한다.
    == == 저장 요건 : 주로 메모리 또는 외부 하드 디스크 저장 공간의 점유 알고리즘 실행 시간을 참조하여, 실행의 최대 저장 용량 중 필요한 알고리즘을 지칭한다.
    디자인 알고리즘은 높은 시간 효율성과 낮은 메모리 요구 사항을 충족하기 위해 시도해야합니다.

4. 알고리즘 효율 측정 방법

  • 나중에 통계적 방법
    == == 이후 통계적 방법 : 주로 좋은 디자인 테스트 절차와 데이터를 통해, 프로그램의 준비 시간을 실행하는 컴퓨터 알고리즘 다른 타이머를 사용하여이 알고리즘의 효율성의 수준을 결정하기 위해 비교 하였다.
    이 방법은 큰 단점이있다 :
    이 프로그램은 제조 된 알고리즘에 따라 실행해야합니다 1.,
    통계 결과 시간이 알고리즘 자체의 약점을 은폐하기 위해 컴퓨터 하드웨어, 소프트웨어, 때로는 쉬운 환경 적 요인에 따라 달라합니다.

  • 분석 전에 추정 방법
    은 컴퓨터 프로그램으로는 통계적 방법에 기초하여 추정하는 알고리즘 == == 분석 전에 추정 방법.
    소비하는 컴퓨터에 높은 수준의 프로그래밍 언어 런타임에서 작성된 프로그램은 다음과 같은 요인에 따라 달라집니다 :
    1. 알고리즘 전략의 사용, 방법. (기본 알고리즘은 좋거나 나쁜)
    컴파일러에 의해 생성 된 코드의 품질 2.. (유무 소프트웨어 지원)
    규모의 3 문제에 들어갔다. (입력의 수를 나타냄)
    의 지시를 수행하는 시스템의 속도 4.. (하드웨어 성능에 따라 다름)
    , 예를 들면, 다음의 두가지 방법 :

int i,sum = 0,n=100;      // 执行1次
for(i=1;i<=n;i++)         // 执行了n+1次
{
    sum = sum + i;        // 执行n次
}
printf("%d",sum);         // 执行1次

수행 1+ (N + 1) + N + 1 = 2N + 3 번 시간

int sum = 0,n = 100;      // 执行一次
sum = (1 + n) * n/2;      // 执行一次
printf("%d",sum);         // 执行一次

1 + 1 + 1 = 3의 구현은
제 알고리즘보다 명확하다.
실행 시간 계산의 결정은 소비의 실행 시간의 번호와 기본 작업을 수행 할 수있는 가장 신뢰할 수있는 방법입니다. 시간을 실행하면이 수에 비례한다.
프로그램의 실행 시간을 분석 할 때 마지막으로, 가장 중요한 것은 프로그래밍 언어 알고리즘 또는 단계의 일련의 독립적 인 프로그램으로 볼 수있다.

진보적 인 성장 5. 기능

프로그레시브 성장 함수 == == 주어 두 함수 F (N)와 g (n)은 정수 N을, 존재하는 경우 등의 모든 N> N, F (n)에 대한 g보다 항상 크다는 (N) 다음, 우리는 말할 그 F (n)을 빠르게 g (n)이보다 점진적 증가.
일반적으로, 다음과 같은 결론에 :

  1. 첨가제 일정 + 3, 1 등 + 무시할 수 있습니다.
  2. 최고 차항 상수를 곱한 것은 중요하지 않습니다.
  3. N의 성장과 함께 높은 등급 용어 인덱스 많은 기능의 결과가 특히 빠른 성장 될 것이다.
  4. 알고리즘의 효율성을 결정할 때, 함수 상수 및 기타 사소한 항목은 종종 무시 될 수 있지만, 순서의 주요 항목 (최상위 기간)에 대해 우려해야한다.
  5. 알고리즘은, N이 증가함에 따라, 그것은 점점 알고리즘이 다른 것보다 더 나은, 또는 다른 알고리즘에 악화되고이 될 것입니다.

6. 알고리즘 시간 복잡도

  1. 알고리즘의 시간 복잡도가 정의
    == == 한정 알고리즘 시간 복잡도 : 알고리즘 분석, 실행 문 T (N) (N)의 총 수는 문제의 크기의 함수이고, 그리고 N, T (N)과 함께 변화를 분석 크기 T (n)의 순서를 결정하는 단계를 포함한다. T (N) = O (: 알고리즘의 시간 복잡도는 알고리즘에 의해 표시된 시간의 측정 값이며, F (N)). N의 크기가 증가하는 문제점이 알고리즘의 실행 시간은 동일한 성장 속도이고, f (n)을 성장 알고리즘의 호출 시간 복잡도 진보적 인 대표라고도 시간 복잡도 . F (n)은 문제의 크기 (N)의 함수이다.
    대문자 O는 (), 알고리즘 표기법의 시간 복잡도를 반영 큰 O 표기법이 될 수 있습니다.
    일반적으로, N이 증가함에 따라, T (n)의 알고리즘은 느린 성장 최적 알고리즘이다.
    • O (1)로 지칭 상수 스테이지
    • O (N)이라고 선형 오더
    • O (N ^ 2 ^)를 호출 사각형의 순서
  2. 큰 차수 O 도출 방법
    == == 주문 방법은 큰 O를 유도한다 : (1) 모든 첨가제 1 상수 대신 일정한 동작 시간. 오직 최고 차항을 유지 개정 된 수의 실행 기능 2.. 최상위 용어가 있고 1이 아닌 경우 (3)은, 상수항 제거 곱해진다. 그 결과 큰 O 순서이다.

  3. 상수 주문은
    아무리 일정, (1), O로 기록되지
    않고 O 이상 (3) O (4 ) 등 다른 번호입니다.

  4. 선형 주문
    동작 사이클 구조를 분석하여 키 분석 알고리즘의 복잡성이다.
    다음 코드 예에서, 시간 복잡도는 O (N)
int i;
for(i=0;i<n;i++)
{
    某个时间复杂度为O(1)的步骤   // 执行了n次
}
  1. 주문하려면
int count = 1;
while(count < n)
{
    count = count * 2;
    某个时间复杂度为O(1)的步骤
}

분석 : 각 계수 * 2가 가까이 N에, 즉, x가 2보다 큰 개월 것입니다 후 n은 곱 루프를 종료 한 후 때문입니다. 2 ^ X ^ N =이 X = LOG2 (N). 따라서, 상기 코드의 시간 복잡도는 O (로그 (N))이다.

  1. 사각형의 순서는
    복수의 사이클은 사이클 시간주기 동작의 횟수를 곱한 루프의 복잡성의 복잡성 동일한 경우.
    예를 들어 다음 코드의 경우 :
int i,j;
for(i=0;i<n;i++)
{
    for(j=i;j<n;j++)
    {
        时间复杂度为O(1)的步骤
    }
}

실행의 갯수가 n 개 + 인 (N-1) + (N-2) + ... + (2) 1 = (N ^ 2 ^ / 2) + (N / 2), 코드 시간 복잡도 세그먼트를 얻을 수는 O이다 + (N ^ 2 ^).

일반 :
O. (1) <O (로그 (N-)) <O (N-) <O (nlog (N-)) <O (N- ^ 2 ^) <O (N- ^^ 3.) <O (2 ^ N ^) <O (N! ) <O (N ^ N ^)

7. 기타

== == 최악의 경우는 나쁘지 않을 것입니다 실행 시간을 참조하면, 보장. 그리고 우리가 언급 실행 시간 실행 시간은 최악의 경우이며, 별도로 명시하지 않는 한이, 가장 중요한 요구 사항 중 하나입니다 적용됩니다.
이 원하는 작동 시간이기 때문에 == == 평균 실행 시간은 모든 경우에 가장 중요하다.
== == 계산 알고리즘에 의해 공간적 복잡도 필요한 저장 공간 구현 나타낸 식 : S (N) = O ( F (N)), 문제의 N - 스케일이고, f는 (N) 성명 약이고 함수 저장 공간은 N에 의해 점유.

추천

출처www.cnblogs.com/PursuingtheLight/p/11359721.html