선형 검색(linear search) 또는 순차 검색(sequential search)
요소가 직선 모양으로 늘어선 배열에서 검색은 원하는 키값을 갖는 요소를 만날 때까지 맨 앞부터 순서대로 요소를 검색함
배열의 요솟수가 n개일 때 종료조건(검색 실패 혹은 성공)을 판단하는 횟수는 평균 n/2회
int i = 0;
while(true) {
if(i == n)
return -1; // 검색 실패(-1 반환)
if(a[i] == key)
return i; // 검색 성공(인덱스 반환)
i++;
}
선형 검색
package ch03_2;
import java.util.Scanner;
// 선형 검색
public class Ex01_seqSearch {
// 요솟수가 n인 배열 a에서 key와 값이 같은 요소를 선형 검색
static int seqSearch(int[] a, int n, int key) {
int i = 0;
while(true) {
if(i == n)
return -1; // 검색 실패(-1 반환)
if(a[i] == key)
return i; // 검색 성공(인덱스 반환)
i++;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("요솟수: ");
int num = scanner.nextInt();
int[] x = new int[num]; // 요솟수가 num인 배열
for (int i = 0; i < num; i++) {
System.out.print("x[" + i + "]: ");
x[i] = scanner.nextInt();
}
System.out.print("검색할 값: "); // 키 값
int key = scanner.nextInt();
int index = seqSearch(x, num, key);
if(index == -1) {
System.out.println("그 값의 요소가 없습니다.");
} else {
System.out.println("그 값은 x[" + index + "]에 있습니다.");
}
}
}
/*
요솟수: 5
x[0]: 6
x[1]: 4
x[2]: 3
x[3]: 7
x[4]: 2
검색할 값: 7
그 값은 x[3]에 있습니다.
*/
무한 루프 구현
while(true) {}
for(; true ;) {} // 제어식 생략
do {} while(true) // 끝까지 읽어야 무한루프 알 수 있기에 권장x
선형 검색 for문
package ch03_2;
import java.util.Scanner;
// 선형 검색 for문
public class Ex02_seqSearchFor {
// 요솟수가 n인 배열 a에서 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; // 검색 실패(-1 반환)
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("요솟수: ");
int num = scanner.nextInt();
int[] x = new int[num]; // 요솟수가 num인 배열
for (int i = 0; i < num; i++) {
System.out.print("x[" + i + "]: ");
x[i] = scanner.nextInt();
}
System.out.print("검색할 값: "); // 키 값
int key = scanner.nextInt();
int index = seqSearch(x, num, key);
if(index == -1) {
System.out.println("그 값의 요소가 없습니다.");
} else {
System.out.println("그 값은 x[" + index + "]에 있습니다.");
}
}
}
/*
요솟수: 3
x[0]: 1
x[1]: 2
x[2]: 3
검색할 값: 5
그 값의 요소가 없습니다.
*/
보초법(sentinel method)
준비해 놓은 배열 a[0]~a[6] + a[7] 은 검색하고자 하는 키값을 저장하는 보초(sentinel)
위와 같이 보초에 저장해 두면 종료 조건 중 하나인 검색 실패(검색 값을 발견하지 못하고 배열의 끝을 지나간 경우)를 고려하지 않아도 되기에 종료 조건 검사 비용이 반으로 줄어듦
선형 검색(보초법)
package ch03_2;
import java.util.Scanner;
// 선형 검색(보초법)
public class Ex03_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) // 검색 성공 - 보초법을 사용해 하나의 if문만 사용
break;
i++;
}
return i == n ? -1 : i;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("요솟수: ");
int num = scanner.nextInt();
int[] x = new int[num + 1]; // 요솟수가 num + 1 인 배열
for (int i = 0; i < num; i++) {
System.out.print("x[" + i + "]: ");
x[i] = scanner.nextInt();
}
System.out.print("검색할 값: "); // 키값
int key = scanner.nextInt();
int index = seqSearchSen(x, num, key); // 배열 x에서 값이 key인 요소 검색
if(index == -1) {
System.out.println("그 값의 요소가 없습니다.");
} else {
System.out.println("그 값은 x[" + index + "]에 있습니다.");
}
}
}
/*
요솟수: 5
x[0]: 1
x[1]: 3
x[2]: 2
x[3]: 3
x[4]: 4
검색할 값: 3
그 값은 x[1]에 있습니다.
*/
'공부기록 > 알고리즘' 카테고리의 다른 글
Chapter 04-1. 스택과 큐_스택이란 (0) | 2024.08.04 |
---|---|
Chapter 03-3. 검색 알고리즘_이진 검색 (0) | 2024.08.04 |
Chapter 03-1. 검색 알고리즘_검색 알고리즘이란 (0) | 2024.08.04 |
Chapter 02-2. 기본 자료구조_클래스란 (0) | 2024.06.22 |
Chapter 02-1. 기본 자료구조_배열이란 (0) | 2024.06.22 |
댓글