본문 바로가기

플밍 is 뭔들/자료구조

08-1 순차 검색

※ 순차 검색(Sequential Search)
 - 일렬로 되어있는 자료를 처음부터 마지막까지 검색하는 방법
 - 선형 검색(Linear Search)이라고도 한다.
 - 검색하는 양에 따라 효율이 달라진다. 자료의 양이 많아질수록 비효율 적이지만 알고리즘이 단순하여 구현이 쉽다.

※ 정렬되지 않은 순차 자료구조에서의 순차 검색
 - 첫 번째 원소부터 시작하여 키값이 일치하는 원소를 찾는다.
 - 정렬이 되어있지 않기때문에 키값이 일치하는 원소를 찾을때 까지 검색한다.
 - 끝까지 검색했는데 키값이 없다면 검색 실패

※ 정렬이 된 순차 자료구조에서의 순차 검색
 - 첫 번째 원소부터 시작하여 키값이 일치하는 원소를 찾는다.
 - 단 정렬되어 있기 때문에 키값보다 작거나 같은 원소까지만 검색을 하고 그 이후는 하지 않는다.
 - 키값보다 큰 원소 직전까지 검색을 했는데 키값이 없다면 검색 실패

Sequential Search
public class SequentialSearch {
      
      
      public void sequentialSearch1(int[] a, int size, int key){
            
            int idx =0;
            
            for(int i=idx; i<size; i++){
                  if(a[i] == key){
                        System.out.println((i+1) + "번째 원소에서 검색 완료");
                        return;
                  }
                  idx++;
            }
            
            System.out.println((idx+1) + "번째 원소에서 검색 실패");
      }
      
      public void sequentialSearch2(int[] a, int size, int key){
            for(int i=0; i<size; i++){
                  
                  if(a[i] > key){
                        System.out.println((i+1)+"번째 원소에서 검색 실패");
                        return;
                  }
                  
                  if(a[i] == key){
                        System.out.println((i+1) + "번째 원소에서 검색 완료");
                        return;
                  }
            }
      }
}

Main
public class Main {
      
      public static void main(String[] args) {
            int a1[] = {8,30,1,9,11,19,2};
            int size = a1.length;
            SequentialSearch ss = new SequentialSearch();
            System.out.println("\n정렬되지 않은 자료에서 순차검색");
            ss.sequentialSearch1(a1, size, 9);
            ss.sequentialSearch1(a1, size, 6);
            
            int a2[] ={1,2,8,9,11,19,29};
            size = a2.length;
            System.out.println("\n정렬되어 있는 자료에서 순차검색");
            ss.sequentialSearch2(a2, size, 9);
            ss.sequentialSearch2(a2, size, 6);
      }
}


※ 색인 순차 검색(Index Sequential Search)
 - 인덱스 테이블을 추가로 사용하여 탐색의 효율을 높인 검색 방법이다.
 - 인덱스 테이블은 index와 key값으로 2차원 배열이며 일정간격의 인덱스와 키값을 저장해 둔것이다.
 - 그래서 어떤 키값이 들어왔을때 IndexTablekey[i] <= key <  indexTableKey[i+1]  일때 배열의 검색범위는 indexTableKey값이 가르키는 두 인덱스 사이만 검색하면 된다.
 - 인덱스 테이블이 크기가 너무 크면 검색할때 배열에서 검색하는 범위는 작아지지만 인덱스 테이블의 검색 범위가 커진다.
 - 인덱스 테이블의 크기를 줄이기 위해 인덱스 사이의 범위를 크게하면 검색해야하는 범위도 넓어지기 때문에 인덱스 테이블을 검색하는 범위는 작아지지만 배열에서 검색 범위가 커진다.


IndexSequentialSearch
public class IndexSequentialSearch {
      
      int idxTable[][] = null;
      
      public IndexSequentialSearch(int a[]) {
            // TODO Auto-generated constructor stub
            makeIdxTable(a);
      }
      
      public void IndexSequentialSearch(int[] a, int size, int key){
            
            for(int i=0; i<idxTable.length; i++){
                  if(i+1 <= idxTable.length-1 ){
                        if(idxTable[i][1] <= key && key < idxTable[i+1][1]){
                              sequentialSearch(a, idxTable[i][0]
, idxTable[i+1][0],key);
                              break;
                        }
                  }else{
                        sequentialSearch(a,idxTable[idxTable.length-1][0]
, a.length-1, key);
                        break;
                  }
            }
      }
      
      public void sequentialSearch(int[]a, int stIdx, int edIdx, int key){
            for(int i=stIdx; i<=edIdx ; i++){
                  if(a[i] == key){
                        System.out.println((stIdx+1) + "~" + (edIdx+1)
                         + "사이의 " + (i+1) + "번째 원소에서 검색 완료");
                        return;
                  }
            }
            System.out.println((stIdx+1) + "~" + (edIdx+1) + "사이에 검색값 "
                                  + key + "없음.");
      }
      
      public void makeIdxTable(int[] a){
            
            int tableSize = (a.length)/3;
            int aIdx =0;
            int idxInterval = (a.length)/tableSize;
            idxTable = new int[tableSize][2];
            
            for(int i=0; i<idxTable.length; i++){
                  idxTable[i][0] = aIdx;
                  System.out.print(idxTable[i][0] + ", ");
                  
                  idxTable[i][1] = a[aIdx];
                  System.out.println(idxTable[i][1]);
                  
                  aIdx += idxInterval;
            }
            
            System.out.println("인덱스 테이블 생성 완료");
      }
}

Main
public static void main(String[] args) {
            int a[] = {1,2,8,9,11,19,29,30,40,100};
            int size = a.length;
            IndexSequentialSearch iss = new IndexSequentialSearch(a);
            System.out.println("\n 색인순차검색");
            iss.IndexSequentialSearch(a, size, 9);
            iss.IndexSequentialSearch(a, size, 6);
            iss.IndexSequentialSearch(a, size, 100);
      }


'플밍 is 뭔들 > 자료구조' 카테고리의 다른 글

08-3 이진 트리 검색  (0) 2016.12.04
08-2 이진 검색  (0) 2016.12.04
07-9 트리 정렬  (0) 2016.11.30
07-8 힙 정렬  (0) 2016.11.30
07-7 기수 정렬  (0) 2016.11.30