본문 바로가기

알고리즘4

2021.6.14 TIL: [알고리즘] NP-완전 (NP-Completeness) 여러 문제들을 분류해 보면 주어진 문제의 해를 구하는 알고리즘이 전혀 존재하지 않는 풀 수 없는 문제들이 존재한다. 그리고 풀 수 있는 문제들이 존재한다. 풀 수 있는 존재들을 분류 하면 현실적인 시간 내에 풀 수 없는 문제들과 현실적인 시간 내에, 즉 합리적인 시간 내에 풀 수 있는 문제들이 있다. 오늘 배운 NP-완전 문제들은 현실적인 시간 내에 풀 수 없는 문제들에 속할 것이라고 추정되는 문제들이다. 현실적인 시간은 다항식 시간(polynomial time)을 의미한다. 입력의 크기를 n이라고 할 때 n의 다항식으로 표시되는 시간을 말한다. 즉, O(n^k) 나 O(3nk + 5nk -1), O(n log n) 등이다. 비다항식 시간의 예로는 O(2^n) 혹은 O(n!) 등이 존재한다. 문제에서 요.. 2021. 6. 14.
2021.6.13 TIL : [알고리즘] 백트래킹 (BackTracking) 마지막 알고리즘 수업에서는 백트래킹과 NP-완전을 배웠다. 둘 다 조금은 이해하기 어렵다고 느껴져서 오늘은 이 내용을 정리해보고자 한다. 문제에서 어떤 해를 구할 때, 해의 형태가 n개의 원소로 이루어진 튜플인 경우가 있다. (이 때, 이 튜플 내의 각 원소를 x1, x2, x3, ... xn이라고 한다.) 해의 원소들(xi)은 유한 집합(Si)에서 선택된다. 백트래킹은 기준함수인 P를 최대화/최소화/만족하는 해를 구하는 문제를 해결하는데 적용하는 방법으로 효율적인 알고리즘이 존재하지 않을 경우에 사용한다. 모든 문제의 사례에 대해서 효율적이진 않지만 많은 문제 사례에서 효율적이다. mi를 Si의 크기, 즉 원소의 개수라고 하면, xi가 선택할 수 있는 해는 각각 m1, m2, m3, ..., mi, ... 2021. 6. 13.
2021.2.25 TIL : [자료구조] 순차 탐색과 이진 탐색(Sequential Search and Binary Search) 순차 탐색(Sequential Search)이란 특정한 원소를 찾기 위해 원소를 순차적으로 하나씩 탐색하는 방법이다. 데이터 정렬 유무에 상관 없이 가장 앞에 있는 원소부터 하나씩 확인해야 한다는 점에서 O(N)의 시간 복잡도를 가진다. 순차 탐색 코드는 여기에서 확인할 수 있다. 이진탐색(Binary Search)은 배열 내부 데이터가 이미 정렬 되어 있는 상황에서만 사용 가능한 알고리즘이다. 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 특징이 있다. 이진 탐색은 한 번 확인할 때마다 보아야 하는 원소의 개수가 절반씩 줄어든다는 점에서 탐색 시간에서 O(log N)의 시간 복잡도를 가진다. 여기에서 이진 탐색 코드를 확인할 수 있다. 2021. 2. 26.
2021.2.20 TIL : [자료구조] 선택 정렬과 삽입정렬 선택 정렬이란 데이터 중에 가장 작은 것을 선택해서 앞으로 보내는 정렬 기법이다. 가장 작은 것을 선택하는 데에 N번, 앞으로 보내는 데에 N번의 연산으로 O(N^2)의 시간 복잡도를 가진다. 즉, 의사코드를 적어보면 다음과 같다. C언어로 구현한 선택 정렬 코드는 여기에서 확인할 수 있다. for(int i = 0; i < N; i++) i 번째 숫자부터 N번째 숫자까지 모두 확인하여 가장 작은 수를 찾아낸다. 가장 작은 숫자를 i번째 숫자와 바꾼다. 삽입 정렬이란 각 숫자를 적절한 위치에 삽입하는 정렬 기법으로, 들어갈 위치를 선택하는 데에 N번, 선택하는 횟수가 N번이니까 O(n^2)의 시간 복잡도를 가진다. 즉, i가 0에서 N까지 1씩 증가하는 수라고 할 때, i번째 자리의 값이 i-1번째 값보.. 2021. 2. 20.