don't stop believing

Jump Point Search - 점프 포인트 서치 (블록 탐색) 본문

Golang/Basic

Jump Point Search - 점프 포인트 서치 (블록 탐색)

Tongchun 2019. 5. 13. 00:17

선형 검색(Linear Search)의 경우 배열의 첫번째 자리에서부터 값을 찾아 값니다. 
하지만 찾으려는 값이 뒷쪽에 있다면 효율이 좋지 않기 때문에 하나씩 올라가지 않고 일정 블록을 잡아서 점프해 가며 찾겠습니다.

https://en.wikipedia.org/wiki/Jump_search

 

Jump search - Wikipedia

In computer science, a jump search or block search refers to a search algorithm for ordered lists. It works by first checking all items Lkm, where k ∈ N {\displaystyle k\in \mathbb {N} } and m is the block size, until an item is found that is larger than t

en.wikipedia.org

Go로 구현한 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package main
import "fmt"
import "math"
func jumpSearch(arr []int, key int) int {
// . math.Sqrt . (: square root)
sz := len(arr)
step := int(math.Sqrt(float64(sz)))
prev := 0
// loop .
// prev . -1 .
for arr[int(math.Min(float64(step), float64(sz)))-1] < key {
prev = step
step += int(math.Sqrt(float64(sz)))
if prev >= sz {
return -1
}
}
// prev 릿 .
// 릿 .
for arr[prev] < key {
prev++
if prev == int(math.Min(float64(step), float64(sz))) {
return -1
}
}
// 릿 릿 .
if arr[prev] == key {
return prev
}
return -1
}
func main() {
// .
arr := []int{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610}
key := 55
index := jumpSearch(arr, key)
fmt.Println(index)
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

점프할 블록을 잡을때 아래와 같이 전체 배열의 길이에 대한 재곱근으로 잡았습니다.

int(math.Sqrt(float64(len(arr))))

블록 단위로 점프하며 찾으려는 값보다 큰지를 비교하게됩니다.
찾으려는 값이 뒤에 있다면 0번째 자리부터 하나씩 찾는 것보다는 효율이 좋습니다.

 

'Golang > Basic' 카테고리의 다른 글

Doubly Linked List - 이중 연결 리스트  (0) 2019.05.13
Binary Search - 이진 검색  (0) 2019.05.13
Linear Search - 선형 검색 (순차 검색)  (0) 2019.05.12
Counting Sort - 계수 정렬  (0) 2019.05.09
Shell Sort - 쉘 정렬  (0) 2019.05.09