Basic/알고리즘
알고리즘 - 배열 검색
HappyWeasel
2021. 4. 17. 15:17
1. 선형 검색
- 무작위로 늘여 놓은 데이터 모임에서 아주 빠른 검색을 수행한다.
- 조건
- 검색할 값을 발견하지 못하고 배열의 끝을 지나간 경우
- 검색할 값과 같은 요소를 발견한 경우
- cost : n
public class Main {
public static void main(String[] args) {
int[] nums = {1,2,7,9,0};
System.out.println(solution(nums, 7));
}
public static int solution(int[] nums, int key){
int size = nums.length;
for(int i = 0; i < size; i++){
if(nums[i] == key){
return i;
}
}
return -1;
}
}
- 보초법
- 배열 마지막에 찾고자 하는 key를 삽입하여 조건 1이 성립하지 않도록한다.
- 조건 1이 빠지고 조건 2만 만족하면 되므로 종료 판단을 2회에서 1회로 줄일 수 있다.
2. 이진 검색
- 일정한 규칙으로 늘어놓은 데이터 모임에서 아주 빠른 검색을 수행한다.
- 반으로 줄여나가면서 검색한다.
- 반을 기준으로 key가 반보다 작으면 반의 앞에서 다시 반으로 줄이면서 검색.
- 크면 반의 뒤에서 다시 반으로 줄이면서 검색한다.
- 조건
- 검색 범위가 더 이상 없는 경우
- 검색할 값과 같은 요소를 발견한 경우
- cost : log(n+1)
public class Main {
public static void main(String[] args) {
int[] nums = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
System.out.println(solution(nums, 7));
}
public static int solution(int[] nums, int key) {
int length = nums.length;
// 검색 범위의 첫 인덱스
int pl = 0;
// 검색 범위의 끝 인덱스
int pr = length - 1;
do {
// 중앙 인덱스
int pc = (pl + pr) / 2;
// 중앙 인덱스와 key가 같다면 끝
if (nums[pc] == key) {
return pc;
}
// key 보다 중앙 인덱스가 작다면 검색 범위를 뒤쪽 절반으로 좁힌다.
else if (nums[pc] < key) {
pl = pc + 1;
}
// key 보다 중앙 인덱스가 크다면 검색 범위를 앞쪽 절반으로 좁힌다.
else {
pr = pc - 1;
}
} while (pl <= pr);
// 검색 실패
return -1;
}
}
- Java에서는 배열에서 이진검색 라이브러리를 지원한다.
- Arrays.binarySearch
public class Main {
public static void main(String[] args) {
int[] nums = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
System.out.println(Arrays.binarySearch(nums, 7));
}
}
3. 해시법
- 추가, 삭제가 자주 일어나는 데이터 모임에서 아주 빠른 검색을 수행한다.
- 체인법 : 같은 해시 값의 데이터를 선형 리스트로 연결하는 방법.
- 오픈 주소법 : 데이터를 위한 해시 값이 충돌할 때 재해시하는 방법.