ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자료구조] Java 검색 알고리즘 + 스택, 큐
    개발공부/알고리즘 2020. 12. 24. 13:50

     검색

      선형 검색 

        - 완전검색, 순차검색 이라고 불리기도 한다.
        - 배열의 가장 좌측부터 시작하여 찾으려는 값과 하나씩 배열의 각 요소를 비교하는 방법이다.
        - 찾으려는 값을 발견하면 배열의 해당 인덱스를 반환하며, 찾으려는 값이 없다면 -1을 반환한다.
        - 찾으려는 값이 여러개라면 최초 발견된 인덱스를 반환하고 검색이 종료된다.
        - 정렬되지 않은 배열에서도 적용할 수 있다.
        - 시간복잡도는 평균 n/2회로 O(n) 이다.
        - 검색의 종료 조건
         1. 검색할 값과 같은 요소를 발견한 경우 (n회, 평균 n/2회)
         2. 검색할 값을 발견하지 못하고 배열의 끝을 지나간 경우 (n+1 회)

      소스코드는 다음과 같다.

    int search(int arr[], int n, int x) { // 매개변수 : 배열이름, 배열의 길이, 찾으려는 값
        for (int i = 0; i < n; i++) { 
            if (arr[i] == x) { // 종료조건 1 
                return i; 
            }
        }
        return -1; // 종료조건 2 
    }
    
    //출처: https://yeolco.tistory.com/74 [열코의 프로그래밍 일기]
    

     

     보초법(Sentinel Method)

       - 선형검색은 종료조건을 모두 판단하기 때문에 검사 비용이 많이 든다고 볼 수 있다. 원하는 key값을 찾지 못하는 경우에 관한

         종료조건을 제거함으로 종료 판단횟수를 1로 줄이는 방법이 보초법이다.

       - 검색 전, 검색하고자 하는 key 값을 배열의 맨 끝 요소에 저장한다.

       - 검색 결과, key 값이 원래 data에 존재하지 않아도 검색결과가 없는 경우에 관한 종료조건이 필요 없다.

     

     소스코드는 다음과 같다.

    int sentinelSearch(int arr[], int n, int x) { // 매개변수 : 배열이름, 배열의 길이, 찾으려는 값
        arr[n] = x;
     
        for (int i = 0; i < n; i++) { 
            if (arr[i] == x) { 
                return i; 
            }
        }
        //return -1; 마지막 인덱스에 찾는 값이 있으므로 종료조건 2번이 필요 없다.
    }

     

     이진검색

      - 검색 반경을 반으로 나뉘어 반복하는 검색 방법이다.

      - 정렬 된 배열에서만 사용 가능 하다.

      - 찾으려는 값을 배열의 중간값과 비교하여 그 값이 더 작다면 우측배열, 크다면 좌측 배열로 이동하여 반복한다.

      - 분할 정복 알고리즘의 규칙에 따라 설계된 방법이다.

      - 시간 복잡도는 평균 k = 2ⁿ 을 log 씌운 logk = n 으로 O(log) 이다.

     

     소스코드는 다음과 같다.

    int binarySearch(int arr[], int l, int r, int x) { // 매개변수 : 배열이름, 배열 시작 인덱스, 배열 끝 인덱스, 찾으려는 값
       if (r >= l) { 
            int mid = l + (r - l)/2; // 중간 값 선택
    
    		if (arr[mid] == x) return mid; // 검색 성공
            
            if (arr[mid] > x) return binarySearch(arr, l, mid-1, x); // 좌측 배열 탐색
            else return binarySearch(arr, mid+1, r, x); // 우측 배열 탐색
       }
       return -1;  // 검색 실패
    } 
    
    //출처: https://yeolco.tistory.com/74 [열코의 프로그래밍 일기]

     


    스택과 큐

     추상자료형(Abstract Data Type - ADT)

        - 추상자료형은 수학적 모델을 가졌으며 구현 방법을 따로 명시하고 있지 않다는 점이 자료 구조와 다르다.

       - 인터페이스와 구현을 분리하여 추상화 계층을 둔 것이다. 

       - 대표적으로 복소수, 리스트, 스택, 큐, 맵, 우선순위 큐, 집합 등이 있다.

     

     스택 (Stack)

       - 후입선출(Last In First Out - LIFO) 형태의 자료구조이다.

     

      일반적으로 구현에 필요한 메서드

    더보기
    • pop
      스택의 마지막에 위치한 데이터를 추출한 후 스택에서 삭제.
    • push
      스택의 마지막에 데이터를 삽입.
    • isEmpty
      스택이 비어있는지 확인.
    • peek
      스택의 마지막에 위치한 데이터를 추출. (삭제하지 않음)

     

    큐 (Queue)

      - 선입선출(First In First Out - FIFO) 형태의 추상자료형이다.

     

     일반적으로 구현에 필요한 메서드

    더보기
    • add
      큐의 마지막에 데이터를 삽입하고 성공하면 true를 반환.
    • peek
      큐의 맨 앞에 데이터를 반환, 큐가 비어있으면 null을 반환.
    • element
      큐의 맨 앞에 데이터를 반환, 큐가 비어있으면 Exception을 발생.
    • poll
      큐의 맨 앞에 있는 데이터를 추출한 후 큐에서 삭제. 비어있으면 null을 반환.
    • remove
      큐의 맨 앞에 있는 데이터를 추출한 후 큐에서 삭제, 비어있으면 Exception을 발생.

    '개발공부 > 알고리즘' 카테고리의 다른 글

    [자료구조] Java 리스트(List)  (0) 2021.01.07
    [자료구조] Java 문자열 검색  (0) 2021.01.07
    [자료구조] Java 집합(Set)  (0) 2021.01.07
Designed by Tistory.