알고리즘에 대한 간략한 설명 - 문자열 및 문자열 일치, 정렬, 깊이/폭 우선 검색, 동적 프로그래밍, 분할 및 정복, 탐욕, 역추적, 분기 및 경계

목차

알고리즘 간략한 설명

기초적인

일반적인 알고리즘 목록

문자열 대 문자열 일치

종류

깊이/너비 우선 검색

동적 프로그래밍

분열시켜 정복하라

탐욕스러운

역추적

분기 및 경계


알고리즘 간략한 설명

기초적인

에헴... 알고리즘에 관해서는 우리는 CS 학생이 아닙니다. 알고리즘은 모델링된 문제를 해결하기 위한 특정 방법 및 방법이라고 말씀드리겠습니다. 프로그래밍을 위한 성숙하고 형성된 완성 문제를 학습하는 것입니다. 계산 루틴 및 아이디어 .

일반적인 알고리즘 목록

문자열 대 문자열 일치

기초적인

문자열은 0개 이상의 문자로 구성된 제한된 시퀀스이며 문자열이라고도 합니다. 문자열(drool)의 연속 문자로 구성된 하위 시퀀스는 문자열의 하위 문자열입니다. 문자열의 인코딩 방식은 ASCII 인코딩, 유니코드 인코딩 등의 문자 인코딩입니다.

문자열의 요소는 모두 문자입니다. 문자열 연산은 개별 요소보다는 주로 문자열 연산과 관련이 있으며, 대부분은 다음과 같이 부분 문자열의 위치 찾기, 지정된 위치에서 부분 문자열 얻기, 부분 문자열 바꾸기 등의 작업입니다. 다음과 같습니다:

자산/문자열 작업.jpg

당연히 string.h와 같은 표준 라이브러리는 기본적인 문자열 연산 API를 제공하는데, C 표준 라이브러리에 대한 자세한 사용 방법은 " C & MCU 작성 사양 및 기타 " 기사의 "7 C 표준 라이브러리 사용" 섹션을 참조하시기 바랍니다. .

문자열 일치 알고리즘(문자열 패턴 일치라고도 함)

예를 들어 문자열 일치: 기본 문자열 S = "BBC ABCDAB ABCDADCDABDE"에서 패턴 문자열 P = "ABCDABD"와 동일한 하위 문자열의 위치를 ​​찾습니다.

문자열 패턴 매칭 알고리즘 - BF 알고리즘(또는 무차별 대입 알고리즘)

i = 0 위치에서 시작하는 메인 문자열 S가 j = 0 위치에서 시작하는 패턴 문자열 P와 한 문자씩 같은지, 같으면 i와 j가 모두 1씩 증가한 후 그 여부를 판단합니다. 일치. 서로 다르면 i는 여기로 돌아오며, 동시에 j는 일치하는 시작 위치의 첫 번째 위치로 돌아가서 하나씩 일치를 계속합니다. 사진은 다음과 같이 설명합니다.

인용 출처: 21 문자열 패턴 매칭 알고리즘(BF 알고리즘) - Zhihu(zhihu.com)

자산/BF 알고리즘(또는 무차별 대입 알고리즘).jpg

문자열에 대한 빠른 패턴 매칭 알고리즘 - KMP 알고리즘

주요 아이디어는 BF 알고리즘과 비교하여 매칭 속도를 높이기 위해 몇 가지 규칙을 찾는 것입니다. 매칭이 실패하면 j는 매번 P의 시작 부분으로 돌아갈 필요가 없습니다. 이해가 안가시면 아래 튜토리얼 글을 읽어보시길 추천드립니다. , 이해 후 요약은 이렇습니다) 패턴 문자열에서 각 문자열의 각 접두사와 접미사 하위 문자열의 최대 공통 요소 길이는 다음 배열을 구성하는 데 사용되며, 매번 j만큼 이동하는 자릿수는 다음에 따라 조정됩니다.

종류

깊이/너비 우선 검색

그래프 순회는 일반적으로 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS)을 사용하여 수행됩니다. "트리를 특별한 종류의 그래프로 생각한다면 DFS는 선주문 순회입니다."

동적 프로그래밍

어떤 사람들은 가능한 모든 솔루션을 탐색하지 않고도 문제에 대한 최적의 솔루션을 찾을 수 있도록 문제를 이해하고 모델링하기 위해 "동적 프로그래밍"(최적화 목표 및 상태 전이 방정식(또는 재귀 관계) 작성)이라는 아이디어를 사용하는 것으로 이해합니다. (분기를 자르거나 시간을 절약하기 위해 최적의 솔루션이 아닐 것 같은 계산을 제거하거나 중복되는 하위 문제를 제거) 일반적인 구현 방법은 반복 계산을 줄이기 위해 캐시를 사용하여 데이터를 저장하는 것입니다(전체 계산 프로세스를 트리로 확장) , 그런 다음 반복적으로 계산되는 부분을 찾아내고, 이전에 반복적으로 계산된 결과의 복사본을 캐싱을 사용하여 유지하여 반복 계산을 줄입니다.) 그 외에도 많은 기술과 방법이 있습니다.

분열시켜 정복하라

인용: 일반적으로 사용되는 5가지 알고리즘 - 분할 및 정복 알고리즘에 대한 자세한 설명 및 고전적인 예_ 더 나은 방법에 대한 생각 중지 블로그 - CSDN 블로그_ 분할 및 정복 알고리즘의 고전적인 예 .

분할 정복 방식의 설계 아이디어는 직접 해결하기 어려운 큰 문제를 여러 개의 작은 동일한 문제로 나누어 개별적으로 해결하고 분할 정복할 수 있도록 하는 것입니다.

분할 정복 전략은 크기 n의 문제에 대해 문제가 쉽게 해결될 수 있으면(예: 크기 n이 작음) 직접 해결하고, 그렇지 않으면 이를 k개의 더 작은 규모의 하위 크기로 분해하는 것입니다. 이러한 하위 문제는 서로 상호 작용하며 독립적으로 원래 문제와 동일한 형태로 이러한 하위 문제를 재귀적으로 해결한 다음 각 하위 문제에 대한 솔루션을 결합하여 원래 문제에 대한 솔루션을 얻습니다. . 이러한 알고리즘 설계 전략을 분할 및 정복이라고 합니다.

원래 문제를 k개의 하위 문제(1<k≤n)로 나눌 수 있고 이러한 하위 문제를 모두 풀 수 있고 이러한 하위 문제의 해를 사용하여 원래 문제에 대한 해를 찾을 수 있다면 다음과 같습니다. 분할정복 방식이 가능하다. 분할 정복 방법으로 생성된 하위 문제는 원래 문제의 더 작은 모델인 경우가 많으며, 이는 재귀적 기술의 사용을 용이하게 합니다. 이 경우 분할정복법을 반복적으로 적용하면 하위 문제는 원래의 문제 유형과 일치하게 되지만 그 규모는 지속적으로 줄어들어 결국 하위 문제는 직접적으로 해결하기 쉬운 수준으로 축소된다. 그 해결책을 찾아보세요. 이는 자연스럽게 재귀적인 프로세스로 이어집니다. 분할 정복과 재귀는 쌍둥이 형제와 같아서 종종 알고리즘 설계에 동시에 사용되므로 효율적인 알고리즘을 많이 생성합니다.

분할 정복 방법을 사용하여 해결할 수 있는 몇 가지 고전적인 문제는 다음과 같습니다.

  • (1) 이진 검색
  • (2) 대정수 곱셈
  • (3) 스트라센 행렬 곱셈
  • (4)체스판 취재
  • (5) 병합 정렬
  • (6) 퀵 정렬
  • (7) 선형 시간 선택
  • (8) 최근접점 쌍 문제
  • (9) 라운드 로빈 일정
  • (10) 하노이 타워

분할정복 알고리즘의 핵심은 하위 문제의 크기가 가까운지 여부에 있으며, 크기가 가까우면 알고리즘이 더 효율적입니다.

분할 정복 알고리즘과 동적 프로그래밍은 모두 하위 문제를 해결한 다음 솔루션을 병합하지만 분할 정복 알고리즘은 원래 문제보다 훨씬 작은 하위 문제를 찾습니다(여전히 속도가 빠르기 때문). 작은 데이터 문제를 계산하는 컴퓨터), 동시에 분할 거버넌스 알고리즘의 효율성이 반드시 좋은 것은 아니며 동적 프로그래밍의 효율성은 하위 문제의 개수에 따라 달라집니다. 하위 문제의 총 개수(즉, 반복되는 하위 문제가 많음)보다 알고리즘이 매우 효율적입니다.

탐욕스러운

인용: 일반적으로 사용되는 5가지 알고리즘 - Greedy Algorithm에 대한 자세한 설명 및 고전적인 예_ 더 나은 방법에 대한 생각 중지 블로그 - CSDN 블로그_ Greedy Algorithm .

탐욕 알고리즘(탐욕 알고리즘이라고도 함)은 문제를 해결할 때 항상 현재 최선의 선택을 한다는 것을 의미합니다. 즉, 그가 만든 것은 전체 최적해를 고려하지 않은 채 어떤 의미에서는 국소적 최적해에 불과했다. 그리디 알고리즘은 모든 문제에 대해 전체 최적해를 얻을 수는 없지만 광범위한 문제에 대해 전체 최적해 또는 전체 최적해에 대한 대략적인 해를 생성할 수 있습니다.

기본 아이디어

  1. 문제를 설명하기 위해 수학적 모델을 구축합니다.

  2. 해결해야 할 문제를 여러 하위 문제로 나눕니다.

  3. 각 하위 문제를 해결하고 하위 문제의 로컬 최적 솔루션을 얻습니다.

  4. 하위 문제의 국소 최적 솔루션은 원래 문제의 솔루션으로 합성됩니다.

알고리즘을 구현하는 과정

  1. 문제에 대한 초기 솔루션부터 시작합니다.

  2. 주어진 전체 목표를 향해 한 걸음 더 나아갈 수 있습니다.

  3. 실현 가능한 솔루션의 솔루션 요소를 찾습니다.

  4. 문제에 대한 실행 가능한 솔루션은 모든 솔루션 요소로 구성됩니다.

이 알고리즘에 문제가 있습니다

  1. 얻은 최종 솔루션이 최고라는 보장은 없습니다.
  2. 최대 또는 최소 솔루션 문제를 찾는 데 사용할 수 없습니다.
  3. 특정 제약 조건을 충족하는 실행 가능한 솔루션의 범위만 찾을 수 있습니다.

인용문: 동적 프로그래밍이란 무엇입니까? 동적 프로그래밍의 의미는 무엇입니까? - Zhihu(zhihu.com)는  탐욕 알고리즘의 단점을 설명합니다. 

먼저 우리가 인생에서 자주 접하는 일을 살펴보겠습니다. 당신이 부유한 사람이고 1, 5, 10, 20, 50, 100 위안짜리 지폐를 충분히 가지고 있다고 가정해 보겠습니다. 이제 당신의 목표는 가능한 한 적은 지폐를 사용하여 일정 금액을 모으는 것입니다 .

인생 경험을 바탕으로 우리는 분명히 다음 전략을 채택할 수 있습니다. 100을 사용할 수 있으면 100을 사용해 보고, 그렇지 않으면 50을 사용해 보십시오... 등등. 이 전략에서는 666=6×100+1×50+1×10+1×5+1×1, 총 10장의 지폐가 사용되었습니다.

이 전략을 " 그리디(Greedy) " 라고 합니다 . 우리가 직면한 상황이 "보상해야 할 부분"이라고 가정할 때, "아직 보완해야 할 부분"을 최대한 빨리 작게 만드는 것이 탐욕 전략입니다 . w를 100으로 줄일 수 있다면 100으로 줄여보세요. 이런 식으로 우리가 직면하는 다음 상황은 w-100을 만드는 것입니다. 장기적인 삶의 경험은 탐욕스러운 전략이 옳다는 것을 보여줍니다.

그러나 지폐 세트의 액면가를 변경하면 그리디 전략이 작동하지 않을 수 있습니다. 낯선 나라의 지폐 액면가가 1, 5, 11이라면 15가 나올 때 우리의 탐욕스러운 전략은 잘못될 것입니다.

15=1×11+4×1 (그리디 전략은 5개의 지폐를 사용합니다)

15=3×5 (올바른 전략, 3개의 지폐만 사용)

왜 그럴까요? 탐욕스러운 전략의 문제점은 무엇입니까?

근시안적인.

내가 방금 말했듯이 탐욕스러운 전략의 프로그램은 "다음에 직면할 상황을 더 작게 만들도록 노력하라"입니다. 이와 같이 그리디 전략은 w=15일 때 w를 4로 줄이기 위해 11을 사용하는 것을 우선시하지만, 이 문제에서는 4를 얻는 데 드는 비용이 매우 높기 때문에 4×1을 사용해야 합니다. 5를 사용하면 w는 10으로 감소합니다. 4만큼 작지는 않지만 5위안 두 개만 있으면 10이 됩니다.

여기서 우리는 탐욕이 단지 당면한 상황만을 고려하는 전략이라는 것을 알게 됩니다 .

역추적

인용 출처: leetcode 역추적 알고리즘(backtracking) _wonner_ 님의 블로그 요약-CSDN blog_leetcode backtracking .

역추적 알고리즘은 휴리스틱(Heuristic) 방법이라고도 하며, 문제에 대한 해결책을 체계적으로 찾는 방법이다. 역추적 알고리즘의 기본 아이디어는 한 경로에서 앞으로 이동하고, 가능하면 전진하고, 불가능하면 뒤로 돌아가서 다른 경로를 다시 시도하는 것입니다.

분기 및 경계

인용: 일반적으로 사용되는 5가지 알고리즘 - 분기 및 바운드 알고리즘에 대한 자세한 설명 및 고전적인 예_ 더 나은 방법에 대한 생각 중지 블로그 - CSDN 블로그_ 분기 및 바운드 알고리즘 예제에 대한 자세한 설명 .

비교 역추적

  • 역추적법의 풀이 목표는 제약 조건을 만족하는 해 공간에서 모든 해를 찾는 것이고, 분기 및 경계법의 풀이 목표는 제약 조건을 만족하는 해를 찾거나, 또는 해를 구하는 것일 것으로 추정된다. 제약조건을 만족하는 해들 중에서 어떤 목적함수 값이 최대해 또는 최소해에 도달하는데, 이것이 어떤 의미에서는 최적해이다.
  • 또 다른 매우 큰 차이점은 역추적 방법은 깊이 우선 방식으로 솔루션 공간을 검색하는 반면, 분기 및 경계 방식은 너비 우선 방식 또는 최소 비용 우선 방식으로 솔루션 공간을 검색한다는 것입니다.

추천

출처blog.csdn.net/Staokgo/article/details/132922554