반응형
Notice
Recent Posts
«   2024/09   »
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
Today
Total
관리 메뉴

H-Log

[알고리즘] 순차탐색 / 이분탐색 본문

dev-log/cs

[알고리즘] 순차탐색 / 이분탐색

hong6v6 2023. 10. 20. 23:53
반응형

예제 : 임의의 수 x 찾기

문제: 크기가 n인 배열 S에 x가 있는가?

  • 입력(파라미터): (1) 양수 n, (2) 배열 S[1..n], (3) 키 x
  • 출력: x의 위치, 만약 없으면 0.
  • 알고리즘(자연어):
  • x와 같은 원소를 찾을 때까지 S에 있는 모든 원소를 차례로 검사한다.
  • 만일 x 와 같은 원소를 찾으면 S 에서의 그 위치를, S 를 모두 검사하고도 찾지 못하면 0을 내준다

1. 순차 탐색

void seqsearch(int n,              // 입력(1)
								const keytype S[], // (2)
								keytype x,         // (3)
								index& location) { // 출력
	location = 1;
	while (location <= n && S[location] != x)
		location++;
	if (location > n)
		location = 0;
}
  • while-루프: 아직 검사할 항목이 있고, x를 찾지 못했나?
  • if-문: 모두 검사하였으나, x를 찾지 못했나?

사색

  • 순차검색 알고리즘으로 키(key)를 찾기 위해서 S에 있는 항목을 몇 개 검색해야 하는가? √ key와 같은 항목의 위치에 따라 다름 √ 최악의 경우: n → 모든 배열의 원소를 다 확인할 경우
  • 좀 더 빨리 찾을 수는 없는가? √ S에 있는 항목에 대한 정보가 없는 한 더 빨리 찾을 수 없다. ex) S 의 정렬 방식 등 .

2. 이분탐색

void binsearch(int n, // 입력(1)
								const keytype S[], // (2)
								keytype x, // (3)
								index& location) // 출력
	{ index low, high, mid;
		low = 1; high = n;
		location = 0;
		while (low <= high && location == 0) 
			{ mid = (low + high) / 2; // 정수나눗셈
			if(x == S[mid]) 
				location = mid;
			else if (x < S[mid]) 
				high = mid – 1;
			else low = mid + 1;
	}
}
  • while-루프: 아직 검사할 항목이 있고, x를 찾지 못했나?

사색

  • while 문을 수행할 때마다 검색 대상의 총 크기가 1/2 씩 감소하기 때문에 최악의 경우라도 logn + 1개만 검사하면 된다

순차탐색 VS 이분탐색

 

반응형

'dev-log > cs' 카테고리의 다른 글

[알고리즘] 시간 복잡도  (0) 2023.10.20
[알고리즘] 피보나찌 수 구하기  (0) 2023.10.20
[알고리즘] 알고리즘이란  (0) 2023.10.20
[운영체제] 네트워크  (0) 2023.10.01
[운영체제] 파일 시스템  (0) 2023.10.01
Comments