[순환] 순환 알고리즘의 설계
2023. 7. 21. 10:42ㆍ기타(이론)/인프런 - 알고리즘
순차 탐색 (Sequential Search)
아래 함수의 미션은 data[0]에서 data[n-1] 사이에서 target을 검색하는 것이다.
하지만 검색 구간이 시작 인덱스 0은 보통 생략한다.
즉 암시적 매개변수이다.
int search(int data[], int n, int target) {
for (int i = 0; i < n; i++)
if (data[i] == target)
return i;
return -1;
}
아래 함수의 미션은 data[begin]에서 data[end] 사이에서 target을 검색한다.
즉, 검색구간의 시작점을 명시적(explicit)으로 지정한다.
int search(int data[], int begin, int end, int target) {
if (begin > end)
return -1;
else if (target == data[begin])
return begin;
else
return search(data, begin + 1, end, target);
}
int search(int data[], int begin, int end, int target) {
if (begin > end)
return -1;
else if (target == data[end])
return end;
else
return search(data, begin, end-1, target);
}
int search(int data[], int begin, int end, int target) { //binary search와는 다름
if (begin > end)
return -1;
else {
int middle = (begin + end) / 2;
if (data[middle] == target)
return middle;
int index = search(data, begin, middle - 1, target); //앞쪽 검사
if (index != -1) //찾았다!
return index;
else
return search(data, middle + 1, end, target); //뒤쪽 검사
}
}
매개변수의 명시화: 최대값 찾기
public static int findMax(int[] data, int begin, int end) {
if(begin==end)
return data[begin];
else //앞 값과 뒷 값 중에 더 큰 값이 최댓값이다
return Math.max(data[begin], findMax(data, begin+1, end));
}
public static int findMax(int[] data, int begin, int end) {
if(begin==end)
return data[begin];
else {
int middle = (begin+end)/2;
int max1 = findMax(data, begin, middle);
int max2 = findMax(data, middle+1, end);
return Math.max(max1, max2);
}
}
Binary Search (이진탐색)
자바 target.compareTo 함수
-> 자바는 기본적으로 오름차순을 기본으로 하기 때문에
왼쪽 수를 기준으로 오른쪽 수가 더 작으면 음수를,
같으면 0을, 오른쪽 수가 더 크면 양수를 반환한다.
public static int binarySearch(String[] items, String target, int begin, int end) {
if(begin==end)
return -1;
else {
int middle = (begin+end)/2;
int compResult = target.compareTo(items[middle]);
if(compResult == 0)
return middle;
else if(compResult<0) //앞쪽에 있다
return binarySearch(items, target, begin, middle-1);
else //뒤쪽에 있다
return binarySearch(items, target, middle+1, end);
}
}
[무료] 영리한 프로그래밍을 위한 알고리즘 강좌 - 인프런 | 강의
영리하게 프로그래밍을 할 수 있기 위한 기본 소양인 '알고리즘'을 배우고 응용하는 방법을 배웁니다., 개발자라면 꼭 알아야 할 알고리즘 입문! [사진] 1. 강의 소개 부경대학교 IT융합응용공학
www.inflearn.com
'기타(이론) > 인프런 - 알고리즘' 카테고리의 다른 글
[순환] N-Queens (1) | 2023.07.21 |
---|---|
[순환] Counting Cells in a Blob (0) | 2023.07.21 |
[순환] Maze - 미로찾기 (0) | 2023.07.21 |
[순환] Recursion Thinking - 순환적으로 사고하기 (0) | 2023.07.19 |
[순환] Recursion의 개념과 기본 예제 (0) | 2023.07.19 |