-
[알고리즘] Linear SearchAlgorithm/알고리즘 2019. 3. 1. 01:12반응형
[Algorithm - Linear Search]
※ 검색 알고리즘
- 데이터 집합에서 원하는 값을 가진 요소를 찾아내는 검색 알고리즘에 대해 살펴보자.
※ 선형 검색- 요소가 직선 모양으로 늘어선 배열에서의 검색은 원하는 키 값을 갖는 요소를 만날 때까지 맨앞부터 순서대로 요소를 검색하면 되는데 이것이 선형 검색(linear search) 또는 순차 검색(sequential search) 알고리즘이다.
- 선형 검색(순차 검색)은 결과가 두 조건으로 나누어짐
- 배열의 요소를 맨 앞부터 순서대로 검색함
- key 값인 14를 맨 앞부터 찾는다면 4번째 인덱스에서 key 값을 찾게 되고 검색 성공
- key 값인 99를 맨 알부터 찾는다면 배열을 순차적으로 검색해도 값이 없기 때문에 검색 실패
※ 선형 검색 구현 (java)
package chap03.practice;
import java.util.Scanner;
/**
* 선형 검색
*/
class SeqSearchFor {
// 배열 a의 앞쪽 n개의 요소에서 key와 같은 요소를 선형 검색
static int seqSearch(int[] a, int n, int key) {
for (int i = 0; i < n; i++) {
if(a[i] == key) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("요솟수: ");
int num = stdIn.nextInt();
int[] x= new int[num];
for(int i = 0; i < num; i++) {
System.out.print("x[" + i + "]: ");
x[i] = stdIn.nextInt();
}
System.out.print("검색할 값: ");
int ky = stdIn.nextInt();
int idx = seqSearch(x, num, ky);
if(idx == -1)
System.out.println("그 값의 요소가 없습니다.");
else
System.out.println(ky + "은(는) x[" + idx + "]에 있습니다.");
}
}- 배열 검색의 종료 조건은 2개임을 알 수 있다.
- 조건 1: 검색할 값을 발견하지 못하고 배열의 끝을 지나간 경우
- 조건 2: 검색할 값과 같은 요소를 발견한 경우
- i == n 이 성립하는 경우 (종료조건 1 : 검색 실패이므로 -1을 반환)
- a[i] == key가 성립하는 경우 (종료조건 2: 검색 성공이므로 i를 반환)
※ 보초법
- 선형 검색은 반복할 때마다 종료 조건 1과 2를 모두 판단한다. 단순한 판단이라고 생각할 수 있지만 종료 조건을 검사하는 비용은 결코 무시할 수 없다.
- 종료 조건 1. 검색할 값을 발견하지 못하고 배열의 끝을 지나간 경우- 종료 조건 2. 검색할 값과 같은 요소를 발견한 경우
- 이 비용을 반(50%)으로 줄이는 방법이 보초법(sentinel method) 이다.- 검색하기 전에 검색하고 하는 키 값을 맨 끝 요소 a[n+1]에 저장한다. 이때 저장하는 값을 보초라고 한다.
- 그러면 원하는 값이 원래의 데이터에 존재하지 않아도 보초인 a[n+1]까지 검색하면 종료조건 2가 성립한다.- 이렇게 하면 원하는 키 값을 찾지 못했을 때를 판단하는 종료조건 1이 없어도 된다.
- 보초는 반복문에서 종료 판단 횟수를 2회에서 1회로 줄이는 역할을 한다.※ 보초법 구현
package chap03.practice; import java.util.Scanner; /** * 선형 검색 (보초법) */ class SeqSearchSen { // 요솟수가 n인 배열 a에서 key와 같은 요소를 보초법으로 선형 검색합니다. static int seqSearchSen(int[] a, int n, int key) { int i = 0; a[n] = key; // 보초를 추가 while(true) { if(a[i] == key) // 검색 성공 break; i++; } return i == n? -1 : i; } public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("요솟수 : "); int num = stdIn.nextInt(); int[] x = new int[num + 1]; // 요솟수 num + 1 for (int i = 0; i < num; i++) { System.out.print("x[" + i + "] : "); x[i] = stdIn.nextInt(); } System.out.print("검색할 값 : "); // 키 값을 입력 int ky = stdIn.nextInt(); int idx = seqSearchSen(x, num, ky); // 배열 x에서 값이 ky인 요소를 검색 if(idx == -1) System.out.println("그런 요소가 없습니다."); else System.out.println(ky + "은(는) x[" + idx + "]에 있습니다."); } }
반응형'Algorithm > 알고리즘' 카테고리의 다른 글
[알고리즘] DFS, BFS 개념 (0) 2023.02.24 [알고리즘] 깊이 우선 탐색(DFS) 과 너비 우선 탐색(BFS) (6) 2018.10.24 [알고리즘] 코딩인터뷰 알고리즘 참고사이트 (0) 2018.05.21