IT/알고리즘

1일 1코딩

So1_b 2022. 4. 10. 15:50

* 데이터 검색 시 사용 목적, 속도, 비용 등을 고려해 알고리즘을 선택해야 함.

 

/**
 * 선형검색
 * 배열에서 순차적으로 검색하는 유일한 방법
 * 
 * 무한 루프 구현
 * 1. while(true){}
 * 2. for( ; ; ){}
 * 			for문에서 제어식을 생략하면 1이 지정된것으로 봄.
 * 3. do{
 *    }while(true);
 *    	코드를 보고 바로 무한루프인 것을 알 수 없기때문에 권장 안함.
 *    
 *   해당 코드에서 종료조건: i==n이 성립하는 경우 
 *   				  a[i]==key가 성립하는 경우 
 *   
 *   요솟수가 n일 때 종료조건을 검사하는 비용: - 배열에 값이 없을 경우 1: n+1회 2: n회
 *   			(종료조건 판단횟수)	    - 평균 n/2회
 *   
 */		
package chap03;
import java.util.Scanner;
public class 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++;
//		}
		
		for(int i=0; i<n;i++) { // 배열a의 앞쪽 n개의 요소에서 key와 같은 요소를 선형 검색
			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.printf("x[%d] :	",i);
			x[i]=stdIn.nextInt();
		}
		System.out.print("검색할 값 : ");
		int ky=stdIn.nextInt();
		
		int idx=seqSearch(x,num, ky); //배열 x에서 키 값이 ky인 요소를 검색
		
		if(idx==-1)
			System.out.println("그 값의 요소가 없습니다.");
		else System.out.println(ky+"은(는) x["+idx+"]에 있습니다.");
	}
}

 


이진 검색

package chap03;
import java.util.Scanner;
//이진 검색
//요소가 정렬되어 있어야 한다.
//횟수: 대략 log(n-1)회
public class BinSearch {
	static int binSearch(int[] a,int n, int key) {
		int pl=0; //검색범위의 첫인덱스
		int pr=n-1; //검색범위의 마지막 인덱스
		
		do {
			int pc=(pl+pr)/2; //중앙값 
			if(a[pc]==key) return pc; //중앙 요소 검색 (검색 성공)
			else if(a[pc]<key) pl=pc+1; //검색범위 뒤쪽 절반으로 좁힘.
			else pr=pc-1; //검색 범위를 앞쪽 절반으로 좁힘.
		}while(pl <= pr);  //종료조건2(검색할 범위)을 검사 존재할 경우만 do문 실행
		
		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]; //요솟수가 num인 배열
		
		System.out.println("오름차순으로 입력하세요.");
		
		System.out.print("x[0] :"); x[0]=stdIn.nextInt(); //첫요소 입력
		
		for(int i=1;i<num;i++) {
			do {
				System.out.print("x["+i+"] :"); x[i]=stdIn.nextInt();
			}while(x[i]<x[i-1]); //바로 앞의 요소보다 작으면 다시 입력
		}
		System.out.println("검색할 값 : ");  int ky=stdIn.nextInt(); 
		
		int idx=binSearch(x, num, ky); //배열 x에서 키값이 ky인 요소를 검색
		
		if(idx==-1) System.out.println("그 값의 요소가 없습니다.");
		else System.out.printf("%d은(는) x[%d]에 있습니다.",ky,idx);
		
		
	}
}