본문 바로가기
알고리즘/자료구조

[자료구조] (이진)이분탐색 Binary Search

by 왹져박사 2023. 1. 30.
728x90

이분탐색이란?

배열에서 내부의 데이터들이 정렬되어 있을 때, 혹은 정렬할 수 있는 데이터들을 가질 때 특정한 수를 찾기 위한 방법

 

1) 배열의 중간값을 변수에 할당

2) 변수와 찾으려는 값을 비교 

3)

    -1 변수가 더 크다면) 왼쪽의 데이터들의 중간값을 다시 변수에 할당

    -2 변수가 더 작다면) 오른쪽의 데이터들의 중간값을 다시 변수에 할당

 

시간복잡도

데이터가 N개인 배열에서 최악의 경우에도 시간복잡도는 O(logN)  (밑이 2)

 

코드 구현 C#

using System;
using System.IO;

namespace BinarySearch
{
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader sr = new StreamReader(Console.OpenStandardInput());

            string[] str = sr.ReadLine().Split(' ');
            int[] arr = new int[str.Length];
            for(int i = 0; i < str.Length; i++)
            {
                arr[i] = int.Parse(str[i]);
            }
            Array.Sort(arr);

            int target = int.Parse(sr.ReadLine());
            int low = 0;
            int high = arr.Length - 1;
            bool ans = false;

            while (low <= high)
            {
                int mid = (low + high) / 2;

                if (arr[mid] == target)
                {
                    ans = true;
                    break;
                }
                else if (arr[mid] > target)
                    high = mid - 1;
                else
                    low = mid + 1;
            }

            if (ans == true)
                Console.WriteLine("{0}이 존재합니다", target);
            else
                Console.WriteLine("{0}이 존재하지 않습니다.", target);

        }
    }
}

중복된 값이 있을 경우 깔끔하게 탐색하기 위해

Lower bound : 찾으려는 값보다 같거나 큰 값이 처음 나오는 위치 반환

Upper bound : 찾으려는 값보다 큰 값이 처음 나오는 위치 반환

        static void LowerBound(int[] arr, int target)
        {
            int low = 0;
            int high = arr.Length - 1;

            while (low < high)
            {
                int mid = (low + high) / 2;

                if (arr[mid] >= target)
                    high = mid;
                else
                    low = mid + 1;
            }

            if (high > arr.Length - 1)
            {
                Console.WriteLine("lowerBound : {0}", high);
            }
        }
        static void UpperBound(int[] arr, int target)
        {
            int low = 0;
            int high = arr.Length - 1;

            while (low < high)
            {
                int mid = (low + high) / 2;

                if (arr[mid] > target)
                    high = mid;
                else
                    low = mid + 1;
            }

            if (high > arr.Length - 1)
            {
                Console.WriteLine("upperBound : {0}", high);
            }
        }

 

728x90

'알고리즘 > 자료구조' 카테고리의 다른 글

[자료구조] 그래프 BFS(너비우선탐색)  (0) 2023.01.30