ν”„λ‘œκ·Έλž˜λ°/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 (탐색 μ‹€νŒ¨)

java
λ‹«κΈ°
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λ¬Έ μ’…λ£Œ (탐색 μ‹€νŒ¨)

java
λ‹«κΈ°
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 (찾은 값이 μ›λž˜ λ°°μ—΄μ˜ 데이터인지 μΆ”κ°€ν•œ λ³΄μ΄ˆμΈμ§€ νŒλ‹¨)

java
λ‹«κΈ°
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)