ν”„λ‘œκ·Έλž˜λ°/Algorithm

[μ•Œκ³ λ¦¬μ¦˜] 탐색 μ•Œκ³ λ¦¬μ¦˜ - μ„ ν˜• 탐색 Linear Search

NaNaRinπŸ™ƒ 2021. 1. 17. 23:01

 

μ„ ν˜• 탐색(Linear Search) μ•Œκ³ λ¦¬μ¦˜ or 순차 탐색(Sequential Search) μ•Œκ³ λ¦¬μ¦˜ :

μš”μ†Œκ°€ 직선 λͺ¨μ–‘μœΌλ‘œ λŠ˜μ–΄μ§„ λ°°μ—΄μ—μ„œ μ›ν•˜λŠ” ν‚€ 값을 κ°–λŠ” μš”μ†Œλ₯Ό λ§Œλ‚  λ•Œ κΉŒμ§€ 맨 μ•žλΆ€ν„° μˆœμ„œλŒ€λ‘œ 탐색

 

λ°°μ—΄ Linear

μœ„ λ°°μ—΄μ—μ„œ μš”μ†Œλ₯Ό νƒμƒ‰ν•˜λ©΄

탐색 성곡                                                                               νƒμƒ‰ μ‹€νŒ¨

κ°’ 5λ₯Ό νƒμƒ‰ν•˜λ©΄ Linear[2] μ—μ„œ 탐색에 μ„±κ³΅ν•˜μ§€λ§Œ

κ°’ 3을 νƒμƒ‰ν•˜λ©΄ Linear에 κ°’ 3이 μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 탐색에 μ‹€νŒ¨ν•œλ‹€. 

 

μœ„ μ˜ˆμ‹œλ₯Ό 보면 λ°°μ—΄ νƒμƒ‰μ˜ μ’…λ£Œ 쑰건이 λ‹€μŒ 2κ°œμž„μ„ μ•Œ 수 μžˆλ‹€.

   μ‘°κ±΄ 1 : 탐색할 κ°’κ³Ό 같은 μš”μ†Œλ₯Ό λ°œκ²¬ν•œ 경우 (탐색 성곡)

   μ‘°κ±΄ 2 : 탐색할 값을 λ°œκ²¬ν•˜μ§€ λͺ»ν•˜κ³  λ°°μ—΄μ˜ 끝을 μ§€λ‚˜κ°„ 경우 (탐색 μ‹€νŒ¨)

λ°°μ—΄μ˜ μš”μ†Œ μˆ˜κ°€ n개 일 λ•Œ 쑰건 1,2λ₯Ό νŒλ‹¨ν•˜λŠ” νšŸμˆ˜λŠ” 평균 n/2회 이닀. => O(n)

 

 

λ©”μ„œλ“œ seqSearch() : λ°°μ—΄ a 의 μ²˜μŒλΆ€ν„° λκΉŒμ§€ 총 n개의 μš”μ†Œ μ€‘μ—μ„œ 값이 key인 μš”μ†Œλ₯Ό μ„ ν˜• νƒμƒ‰

λ§€κ°œλ³€μˆ˜ : int[] a, int n, int key

λ°˜ν™˜κ°’ : ν‚€ 값이 μ—¬λŸ¬κ°œ μ‘΄μž¬ν•  경우, 처음 λ°œκ²¬ν•œ μš”μ†Œμ˜ 인덱슀λ₯Ό, ν‚€ 값이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ -1을 λ°˜ν™˜

 

- while문으둜 κ΅¬ν˜„ν•œ 경우

     μ‘°κ±΄ 1 : a[i] == key (탐색 성곡)

     μ‘°κ±΄ 2 : i == n (탐색 μ‹€νŒ¨)

int seqSearch(int[] a, int n, int key) {
	int i = 0;
	
	while(true) {
		if(i == n) {
			return -1;
		}
		if(a[i] == key) {
			return i;
		}
		i++;
	}
}

 

- for문으둜 κ΅¬ν˜„ν•œ 경우

     μ‘°κ±΄ 1 : a[i] == key (탐색 성곡)

     μ‘°κ±΄ 2 : forλ¬Έ μ’…λ£Œ (탐색 μ‹€νŒ¨)

int seqSearch(int[] a, int n, int key) {
	for(int i = 0; i < n; i++) {
		if(a[i] == key) {
			return i;
		}
	}
	return -1;
}

 

λ³΄μ΄ˆλ²• : 

μ„ ν˜• 탐색은 λ°˜λ³΅ν•  λ•Œ λ§ˆλ‹€ 쑰건 1κ³Ό 2λ₯Ό λͺ¨λ‘ νŒλ‹¨. νƒμƒ‰ν•˜κΈ° μ „ νƒμƒ‰ν•˜κ³ μž ν•˜λŠ” ν‚€ 값을 λ°°μ—΄μ˜ μš”μ†Œ 맨 끝에 μΆ”κ°€. ν‚€ 값을 찾지 λͺ»ν–ˆμ„ λ•Œλ₯Ό νŒλ‹¨ν•˜λŠ” μ’…λ£Œ 쑰건 2κ°€ ν•„μš”ν•˜μ§€ μ•Šκ²Œ λ§Œλ“€μ–΄ νŒλ‹¨ 횟수λ₯Ό 반으둜 쀄인닀.

λ³΄μ΄ˆλ²•

κ°’ 5λ₯Ό νƒμƒ‰ν•˜λ©΄ 탐색에 μ„±κ³΅ν•˜μ§€λ§Œ

κ°’ 3을 νƒμƒ‰ν•˜λ©΄ λ°°μ—΄μ˜ 맨 λ§ˆμ§€λ§‰μ—μ„œ ν‚€ 값을 발견, 탐색에 μ„±κ³΅ν•˜μ§€λ§Œ λ°°μ—΄μ˜ κΈ°μ‘΄ 값이 μ•„λ‹Œ 직접 μΆ”κ°€ν•œ 보초(Sentinel)이닀.

 

쑰건 1 : a[i] == key (탐색 성곡)

+ return i == n ? -1 : i (찾은 값이 μ›λž˜ λ°°μ—΄μ˜ 데이터인지 μΆ”κ°€ν•œ λ³΄μ΄ˆμΈμ§€ νŒλ‹¨)

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 ;
}

 

 

 

 

 

μ„ ν˜• 탐색 Linear Search : O(N)