알고리즘은 문제를 해결하거나 작업을 완료하기 위해 미리 정해진 순서에 따라 수행되는 일련의 명령입니다. 함수는 프로그램의 다른 부분에서 호출하고 실행할 수 있는 코드 블록입니다.
문제를 해결하거나 특정 활동을 수행하기 위한 일련의 지침입니다. 컴퓨터 과학에서 알고리즘은 기본적인 수학부터 복잡한 데이터 처리까지 광범위한 작업에 사용됩니다.
C에서 사용되는 일반적인 알고리즘 중 하나는 정렬 알고리즘입니다. 정렬 알고리즘은 숫자순이나 알파벳순과 같은 특정 순서로 항목 컬렉션을 정렬합니다.
많은 정렬 알고리즘이 있으며 각각 장점과 단점이 있습니다. C에서 가장 일반적인 정렬 알고리즘은 퀵 정렬(quicksort), 병합(merge), 정렬(sort)입니다.
C의 주요 기능 중 하나는 포인터 지원입니다. 이를 통해 배열, 큐 등과 같은 데이터 구조를 효율적으로 조작할 수 있습니다. 이는 정렬 및 알고리즘 검색과 같이 복잡한 데이터 조작이 필요한 알고리즘을 구현하는 데 적합합니다.
C로 구현된 소프트웨어 라이브러리의 유명한 예 중 하나는 STL(Standard Template Library)입니다. 이 라이브러리는 데이터 구조 정렬, 검색 및 조작과 같은 작업을 위한 다양한 알고리즘을 제공합니다.
알고리즘의 특징
이는 다음을 포함하여 알고리즘의 몇 가지 중요한 기능을 정의합니다.
알고리즘 분석
알고리즘 분석은 효율성, 복잡성 및 기타 기준 측면에서 알고리즘 성능을 평가하는 프로세스입니다. 일반적으로 이는 많은 알고리즘을 평가하고 특정 문제 또는 소프트웨어에 대한 최적의 솔루션을 선택하기 위해 수행됩니다.
알고리즘 분석에는 일반적으로 시간 및 공간 복잡성을 측정하는 작업이 포함됩니다.
필요한 메모리 또는 디스크 공간의 양을 설명하는 공간 복잡도와 마찬가지로 시간 복잡도는 알고리즘이 작업 수행을 결정하는 기간을 설명합니다.
Big O 및 Omega 표기법과 같은 알고리즘의 시간 복잡도를 분석하는 방법에는 여러 가지가 있습니다. Omega 기호는 알고리즘의 시간 복잡도에 대한 상한을 제공하고 Omega 기호는 하한을 제공합니다.
시간 및 공간 복잡성을 측정하는 것 외에도 알고리즘 분석에는 안정성, 병렬성 및 확장성과 같은 다른 기준도 포함됩니다.
여기에는 두 가지 유형의 분석이 포함됩니다.
그들은:-
- 사전 분석.
- 사후 분석.
사전분석
Prior는 실제로 알고리즘을 실행하지 않고 알고리즘의 수학적 특성을 기반으로 알고리즘의 성능을 추정하는 데 중점을 둔 알고리즘 분석 방법입니다.
이 접근 방식을 사용하면 알고리즘을 구현하고 실행할 필요 없이 알고리즘과 기타 측정항목의 시간 및 공간 복잡성을 분석할 수 있습니다.
사후 분석
반면, 사후분석은 실제로 알고리즘을 실행하고 그 성능을 측정하는 알고리즘 분석 방법이다.
이 접근 방식은 알고리즘 성능에 대한 보다 정확하고 자세한 정보를 제공하지만 알고리즘의 구현 및 실행이 필요합니다.
알고리즘 복잡성
알고리즘 복잡도는 알고리즘의 효율성과 성능을 측정하는 척도입니다. 알고리즘은 일반적으로 문제를 해결하거나 특정 목표를 달성하는 데 필요한 시간과 공간 측면에서 평가됩니다.
자바 포인트
알고리즘의 복잡성에는 두 가지 요소가 사용됩니다.
그들은:-
- 시간 요소.
- 공간 요소.
시간 요소
- 알고리즘이 작업을 수행하는 데 필요한 시간을 시간 복잡도라고 합니다. 이는 일반적으로 알고리즘이 문제를 해결하기 위해 수행해야 하는 작업 또는 단계의 수로 측정됩니다.
- 알고리즘의 시간 복잡도는 실행하는 데 걸리는 시간을 결정하고 프로그램 및 시스템 성능에 상당한 영향을 미칠 수 있으므로 중요합니다.
- 알고리즘의 시간 복잡도는 알고리즘의 시간 복잡도에 대한 상한을 표현하는 방법인 Big O 표기법을 사용하여 표현할 수 있습니다.
- 시간 복잡도가 O(n)인 알고리즘은 알고리즘을 실행하는 데 필요한 시간이 입력 데이터의 크기(n)에 정비례한다는 의미입니다.
- 다른 일반적인 시간 복잡도는 O(n^2) 2차 복잡도와 O(log n) 로그 복잡도입니다.
공간분석
- 반면, 공간 복잡도는 알고리즘을 실행하는 데 필요한 메모리나 저장 공간의 양을 나타냅니다.
- 이는 애플리케이션이나 시스템의 전반적인 성능에 영향을 미칠 수 있는 알고리즘을 실행하는 데 필요한 리소스 수를 결정하기 때문에 중요합니다.
- 알고리즘의 공간 복잡도가 O(n)인 경우 입력 크기에 따라 선형적으로 증가하는 메모리 양을 사용합니다.
- 알고리즘의 공간 복잡도가 O(1)인 경우 입력 크기에 관계없이 고정된 양의 메모리를 사용합니다.
알고리즘을 작성하는 방법
1. 먼저 알고리즘을 통해 해결하려는 문제를 정의합니다.
예를 들어 숫자 목록에서 최대값을 찾는 알고리즘을 작성한다고 가정해 보겠습니다.
2. 문제를 더 작고 관리 가능한 단계로 나누십시오.
- 'max' 변수를 목록의 첫 번째 값으로 초기화합니다.
- 목록의 각 후속 값에 대해 'max'와 비교하십시오.
- 값이 'max'보다 큰 경우 'max'를 해당 값으로 설정합니다.
- 목록의 모든 값이 비교될 때까지 이 작업을 계속합니다.
- 최종 '최대' 값을 반환합니다.
3. 의사코드나 프로그래밍 언어로 알고리즘을 작성합니다.
의사 코드로 작성된 알고리즘:
MAX (list) max = list[0] For i = 1 the length of the list list IF[i] > max max = list[i] End for Maximum return Maximum end
4. 알고리즘을 테스트하여 정확하고 효율적인지 확인하세요.
다양한 숫자 목록을 입력하고 정확한 최대 값을 반환하는지 확인하여 알고리즘을 테스트할 수 있습니다. 또한 알고리즘의 시간 복잡도를 분석하여 더 큰 입력에 대해 얼마나 잘 확장되는지 확인할 수 있습니다.
예:-
입력: [1, 5, 2, 7, 3]
출력: 7.
설명: 7은 목록의 최대값입니다.
5. 알고리즘을 최적화합니다.
더 빠르고 효율적으로 만들기 위해 알고리즘을 최적화하는 방법을 찾으십시오. 여기에는 의사 코드를 수정하거나 보다 효율적인 데이터 구조 또는 알고리즘을 구현하는 것이 포함될 수 있습니다.
알고리즘의 기본 작성
예: - 두 정수의 합.
img CSS 정렬
1 단계 - 시작하다
2 단계 - 세 개의 정수 a, b, c를 선언하세요.
3단계 - a와 b의 값을 정의합니다.
4단계 - a와 b의 값을 더한다
5단계 - 4단계의 출력을 c에 저장합니다.
6단계 - 인쇄 c
7단계 - 멈추다
C언어에서 사용되는 알고리즘의 종류.
1. 정렬 알고리즘
C는 버블 정렬, 삽입 정렬, 빠른 정렬과 같은 다양한 정렬 알고리즘을 구현하는 데 사용할 수 있는 풍부한 데이터 유형 및 연산자 세트를 제공합니다.
이러한 알고리즘은 다양한 크기와 유형의 데이터를 정렬하는 데 사용할 수 있으므로 많은 응용 프로그램에서 유용합니다.
다양한 정렬 알고리즘이 있습니다.
그들은:-
(i) 버블 정렬: 근처 구성 요소를 반복적으로 비교하고 순서가 잘못된 경우 해당 구성 요소를 교체하는 복잡하지 않은 정렬 알고리즘입니다.
버블 정렬의 알고리즘은 다음과 같습니다.
- 정렬되지 않은 요소 목록으로 시작하세요.
- 목록의 처음 두 요소를 비교하십시오. 첫 번째 요소가 두 번째 요소보다 크면 서로 바꿉니다.
- 다음 요소 쌍으로 이동하고 목록 끝에 도달할 때까지 2단계를 반복합니다.
- 목록의 각 항목에 대해 2단계와 3단계를 한 번 더 반복합니다. 그걸 패스라고 합니다.
- 전체 목록에 대해 2~4단계를 반복합니다. 패스를 반복하면 요소가 정렬된 목록의 올바른 위치로 '버블업'됩니다.
- 패스가 완료되고 스왑이 이루어지지 않으면 목록이 정렬되고 알고리즘이 중지될 수 있습니다.
- 최종 정렬된 목록이 반환됩니다.
(ii) 삽입 정렬 : 각 요소를 적절한 위치에 배치하여 한 번에 하나씩 개별 요소를 정렬된 목록으로 만드는 정렬 방법입니다.
삽입 정렬 알고리즘은 다음과 같습니다.
- 정렬할 요소의 빈 정렬 목록과 정렬되지 않은 목록을 초기화합니다.
- 정렬되지 않은 목록의 첫 번째 구성원을 가져와서 정렬된 목록의 적절한 위치에 배치해야 합니다.
- 정렬되지 않은 목록의 각 후속 요소에 대해 2단계를 반복합니다.
- 현재 요소를 정렬된 목록의 요소와 비교합니다(바로 왼쪽 요소부터 시작).
- 현재 요소가 왼쪽 요소보다 작은 경우 두 요소를 바꿉니다.
- 현재 요소가 왼쪽 요소보다 크면 정렬된 목록의 올바른 위치에 삽입하세요.
- 정렬되지 않은 목록의 각 후속 요소에 대해 4~6단계를 반복합니다.
- 모든 요소가 처리되면 정렬된 목록에 모든 요소가 올바른 순서로 포함됩니다.
- 정렬 프로세스가 완료되었습니다.
(iii) 선택 정렬 : 정렬되지 않은 목록에서 가장 작은 세부 사항으로 정렬된 목록을 일관되게 시작하는 정렬 방법입니다.
선택 정렬 알고리즘은 다음과 같습니다.
- 목록의 기본 요소를 최소 요소로 설정하여 시작하세요.
- 목록의 나머지 항목을 반복하여 각 항목을 현재 최소값과 비교합니다.
- 요소가 기존 요소보다 작은 것으로 확인되면 새로운 최소값을 설정합니다.
- 결론에 도달할 때마다 현재 최소값을 목록의 첫 번째 요소로 변경합니다.
- 목록의 정렬되지 않은 나머지 부분에 대해 2-4단계를 반복하되 목록의 두 번째 항목부터 시작합니다(첫 번째 요소는 이미 정렬되어 있으므로).
- 모두 정렬될 때까지 이 방식으로 목록을 계속 정렬합니다.
(iv) 퀵 정렬 : 피벗 요소를 선택하고 요소가 피벗보다 적거나 많은지에 따라 목록을 하위 목록으로 분할하는 분할 정복 정렬 알고리즘입니다. 그 후 전체 목록이 정렬될 때까지 하위 목록이 반복적으로 정렬됩니다.
빠른 정렬의 알고리즘은 다음과 같습니다.
- 목록에서 피벗 요소를 선택합니다. 이는 일반적으로 첫 번째 요소이지만 임의의 요소이거나 목록의 중앙값일 수도 있습니다.
- 목록을 두 개의 하위 목록으로 나눕니다. 하나는 피벗보다 작은 요소를 포함하고 다른 하나는 피벗보다 큰 요소를 포함합니다.
- 동일한 프로세스를 사용하여 피벗보다 작은 요소를 포함하는 하위 목록을 재귀적으로 정렬합니다.
- 동일한 절차를 사용하여 피벗보다 큰 항목의 하위 목록을 재귀적으로 정렬합니다.
- 완전히 정렬된 목록을 형성하려면 정렬된 하위 목록을 사이에 피벗 요소와 연결하세요.
- 완전히 정렬된 목록을 반환합니다.
(v) 롯이 가다 : 분할 정복 정렬 알고리즘은 목록을 두 부분으로 나누고 각 부분을 정렬한 다음 정렬된 순서에 따라 두 부분을 병합합니다.
병합 정렬 알고리즘:
- 목록에서 두 개의 하위 목록을 만듭니다. 하나는 피벗 아래 요소가 있고 다른 하나는 피벗 위 요소가 있습니다.
- 하위 목록이 하나만 존재할 때까지 하위 목록을 반복적으로 병합하여 새로 정렬된 하위 목록을 생성합니다. 이것이 정렬된 목록이 될 것입니다.
- 두 개의 하위 디렉터리를 병합하는 단계:-
- 정렬된 요소를 보관할 빈 목록을 만듭니다.
- 각 하위 목록의 첫 번째 요소를 비교합니다.
- 더 작은 요소를 새 목록에 추가하고 상위 하위 목록에서 제거합니다.
- 목록이 완전히 비워질 때까지 2단계와 3단계를 반복합니다.
- 다른 하위 목록의 나머지 요소를 새 목록에 추가합니다.
- 병합된 하위 목록을 새로 정렬된 목록으로 바꿉니다.
- 모든 하위 목록이 하나의 정렬된 목록으로 병합될 때까지 이 프로세스를 반복합니다.
(vi) 힙 정렬 : 힙이라는 데이터 구조를 사용하여 요소를 정렬하는 정렬 알고리즘입니다.
분류 알고리즘은 다음과 같습니다.
- 나머지 요소를 쌓으십시오. 루트부터 시작하여 각 노드는 하위 노드와 비교되며 최대 힙 속성이 충족될 때까지 더 오래된 하위 노드와 노드를 교환합니다.
- 올바른 위치에 있는 마지막 요소를 제외하고 새로 쌓인 요소에 대해 2단계와 3단계를 반복합니다.
- 스택에 단 하나의 요소만 남을 때까지 이 과정을 반복합니다. 이제 정렬되었습니다.
(vii) 기수 정렬 : 이진 표현의 숫자를 기준으로 요소를 정렬하는 정렬 알고리즘입니다.
기수 정렬 알고리즘은 다음과 같습니다.
C# 코드 예제
- 입력 목록의 가장 큰 요소에 포함된 자릿수를 결정합니다.
- 현재 숫자 위치를 나타내는 변수(예: 숫자 자리)를 1로 초기화합니다.
- 0부터 9까지 가능한 각 숫자 값에 대해 빈 목록을 만듭니다.
- 입력 목록을 반복하고 현재 숫자 위치의 값을 기반으로 각 요소를 적절한 목록에 추가합니다.
- 모든 목록을 연결하여 숫자 목록 순서대로 새 목록을 만듭니다.
- 다음 자리로 이동하려면 digitPlace에 10을 곱하세요.
- 가장 큰 요소의 모든 숫자가 고려될 때까지 각 숫자 위치에 대해 4-6단계를 반복합니다.
- 최종 목록은 요소의 숫자를 기준으로 오름차순으로 정렬됩니다.
- 최종 정렬된 목록을 반환합니다.
2. 알고리즘 검색
C는 또한 선형 검색 및 이진 검색과 같은 다양한 검색 알고리즘을 구현하는 데 필요한 도구를 제공합니다. 이러한 알고리즘은 데이터 세트에서 특정 항목을 빠르게 찾을 수 있으므로 광범위한 애플리케이션에 유용합니다.
검색 알고리즘에는 다양한 유형이 있습니다.
그들은:-
(i) 선형 검색 : 원하는 항목을 찾을 때까지 목록의 각 항목을 하나씩 검사하는 기본 검색 알고리즘입니다.
선형 검색 알고리즘:-
- 알고리즘에 대한 입력 정의: 선형 검색 알고리즘에 대한 입력은 요소 목록(또는 배열)과 우리가 검색 중인 대상 요소입니다.
- 'index'라는 변수를 -1로 초기화합니다. 이 변수는 대상 요소가 발견되면 해당 요소의 인덱스를 저장하는 데 사용됩니다.
- 요소 목록을 반복합니다. 첫 번째 요소부터 시작하여 목록의 각 요소를 하나씩 확인합니다.
- 현재 요소를 평가를 위해 원하는 요소와 비교: index 변수에 현재 요소의 인덱스를 유지하고 최신 요소와 목표 요소가 동일하면 루프를 종료합니다.
- 대상 요소의 인덱스 반환: 루프가 완료된 후 인덱스 변수에 저장된 값을 반환합니다. 대상 요소를 찾을 수 없으면 인덱스 값은 -1이 됩니다.
(ii) 이진 검색 : 목록을 절반으로 분할하고 해당 절반 내에서 검색하는 방식으로 작동하는 검색 알고리즘은 요소를 포함할 가능성이 더 높습니다.
이진 검색 알고리즘:-
- 입력: n개 요소와 대상 요소 x의 정렬된 목록입니다.
- 변수 초기화: low index를 0으로, high index를 n-1로, mid를 (low+high)/2로 설정합니다.
- 루프 시작: 낮은 인덱스가 높은 인덱스보다 작거나 같을 때 다음 단계를 반복합니다.
- mid 요소를 x와 비교합니다. mid 요소가 x와 같으면 mid 인덱스를 반환합니다.
- 낮은 또는 높은 인덱스 업데이트: x가 중간 요소보다 큰 경우 낮은 인덱스를 mid + 1로 설정합니다. 그렇지 않으면 높은 인덱스를 mid - 1로 설정합니다.
- 중간 지수 업데이트: 중간 = (낮음+높음)/2.
- 루프 끝: 낮은 인덱스가 높은 인덱스보다 크면 x는 목록에 없으며 알고리즘은 실패를 반환합니다.
- 출력: 목록 또는 실패 메시지의 x 인덱스입니다.
(iii) 깊이 우선 탐색 : 방향을 전환하기 전에 각 지점을 가능한 한 멀리 검사하는 검색 알고리즘입니다.
깊이 우선 검색에는 다음 지침이 적용됩니다.
- 시작할 그래프의 시작 정점이나 노드를 선택합니다.
- 첫 번째 꼭지점에 방문 표시를 추가합니다.
- 시작 정점을 스택에 직접 배치합니다.
- 스택이 빌 때까지 다음 작업을 반복합니다. -
- 스택의 상단 정점을 제거합니다.
- 방문한 것으로 표시하고 팝된 정점의 방문하지 않은 각 이웃을 스택에 삽입합니다.
- 그래프의 모든 정점을 방문할 때까지 이 과정을 계속합니다.
- 모든 정점을 방문하면 알고리즘이 완료되고 그래프에서 깊이 우선 검색이 수행됩니다.
(iv) 너비 우선 탐색 : 다음 레벨로 이동하기 전에 노드의 모든 이웃을 탐색하는 검색 알고리즘입니다.
너비 우선 검색 알고리즘은 다음과 같습니다.
- 루트 노드 또는 초기 상태로 시작합니다.
- 큐에 루트 노드를 추가합니다.
- 대기열이 비어 있는지 확인하십시오. 그렇다면 알고리즘을 종료하십시오.
- 대기열에서 첫 번째 요소를 가져와 방문한 것으로 표시합니다.
- 방문하지 않은 모든 이웃을 대기열에 추가하여 최신 노드를 증폭시킵니다.
- 원하는 노드를 찾거나 대기열이 비어 있을 때까지 3~5단계를 반복합니다.
- 목표 노드를 찾으면 예비 상태에서 목표 상태로의 경로를 반환합니다.
- 규칙 집합을 종료하고 대기열이 비어 있으면 목표 상태가 식별되지 않았다고 보고합니다.
(v) 보간 검색 : 검색된 요소의 값을 이용하여 인덱스에서의 위치를 추정하는 검색 알고리즘입니다.
배열이 고르게 분포되는 것이 중요합니다. 그렇지 않으면 알고리즘입니다.
예상대로 작동합니다.
알고리즘은 다음과 같이 요약될 수 있습니다.
- 검색할 입력 목록과 키 값을 가져옵니다.
- 목록의 첫 번째 및 마지막 인덱스에서 하위 및 상위 변수를 초기화합니다.
- 하한값이 상한값보다 작거나 같으면 다음과 같습니다.
- 다음 공식을 사용하여 예상 위치를 계산합니다.
pos = 낮음 + ((높음 - 낮음) / (arr[높음] - arr[낮음])) * (x - arr[낮음]). - 추정된 위치 값이 키 값인 경우 위치를 반환합니다.
- c) 추정 위치 값이 키 값보다 작은 경우에는 낮게 설정합니다.
위치 + 1. - d) 추정 위치 값이 키 설정 값보다 큰 경우 위치 - 1 위.
- 다음 공식을 사용하여 예상 위치를 계산합니다.
- 키 값을 찾을 수 없으면 -1을 반환하여 해당 값이 목록에 없음을 나타냅니다.
(vi) 점프 검색 : 관련 요소를 찾거나 해당 요소가 더 이상 존재하지 않는다고 판단할 때까지 일정한 길이의 단계로 목록을 반복하는 검색 방법입니다.
자식 풀 구문
점프 검색 알고리즘은 다음과 같습니다.
- 먼저 점프 크기를 배열 요소 수의 제곱근으로 설정합니다.
- 'current'라는 변수를 배열의 첫 번째 요소로 설정합니다.
- 'jump'라는 변수를 증가시키면서 점프 크기만큼 점프하여 배열을 반복합니다.
- 기존 요소가 원하는 요소보다 작은 경우 다음 도약으로 이동합니다.
- 현재 요소가 대상 요소보다 큰 경우 현재 요소와 이전 점프 요소 사이에서 선형 검색을 수행하여 대상 요소를 찾습니다.
- 대상 요소가 배열에서 발견되지 않으면 -1을 반환하여 해당 요소가 배열에 없음을 나타냅니다.
- 요소가 발견되면 배열의 요소 인덱스를 반환합니다.
3. 그래프 알고리즘
C는 포인터와 배열 및 연결 목록과 같은 데이터 구조를 지원하므로 그래프에서 두 노드 사이의 최단 경로를 찾는 것과 같이 그래프를 조작하는 알고리즘을 구현하는 데 적합합니다.
다양한 유형의 그래프 알고리즘이 있습니다.
그들은:-
4. 암호화 알고리즘
C는 낮은 수준의 작업과 효율적인 데이터 조작을 지원하므로 데이터 암호화 및 암호 해독 알고리즘과 같이 암호화에 사용되는 알고리즘을 구현하는 데 이상적입니다.
암호화 알고리즘에는 다양한 유형이 있습니다.
그들은:-
알고리즘의 장점
알고리즘에는 많은 장점이 있습니다.
그들은:-
알고리즘의 단점
알고리즘은 프로그래밍에 매우 유용하지만 알고리즘에는 단점도 있습니다.
그들은:-