교수님이 쓰라고 하셔서 쓰는 그런데 은근 재밌는 듯

자료구조

[자료구조] 탐색

shinyunha 2025. 12. 7. 13:58

탐색 키: 항목과 항목을 구별해주는 키


Sequential Search (Linear Search, 순차 탐색)

정렬되지 않은 배열을 처음부터 마지막까지 하나씩 검사

 

Time Complexity: O(n)

 

비교 횟수

성공: (n+1)/2

실패: n

int seq_search(int key, iint low, int high){
    for(int i = low; i <= high; i++){
        if(list[i] == key)
            return i; //탐색 성공    
    }
    return -1; //탐색 실패        
}

 

개선된 순차 탐색 - 별로 개선 안 됨

리스트 끝에 탐색 키 저장

for문 안의 비교를 제거

int seq_search2(int key, int low, int high){
    list[high +1] = key;
    
    int i;
    for(i = low; list[i] != key; i++); //키 값을 찾을 때까지
    if(i == (high +1)) return -1; //탐색 실패
    else return i; //탐색 성공
}

Binary Search (이진 탐색)

정렬된 배열의 중앙에 있는 값 조사 후 범위를 반으로 줄여나감

삽입 / 삭제 비효율적

 

Time Complexity: O(logn)

int search_binaary(int key, int low, int high){
    int middle;
    
    if(low <= high){ //실패 판단
        middle = (low + high)/2;
        
        if(key == list[middle]) return middle; //탐색 성공;
        //왼쪽 탐색
        else if(key < list[middle])
            return search_binary(key, low, middle-1);
        //오른쪽 탐색    
        else
            return search_binary(key, middle+1, high);
    }
    return -1; //탐색 실패
}

순환

int search_binary(int key, int low, int high){
    int middle;
    
    while(low <= high){
        middle = (low + high)/2;
        
        if(key == list[middle]) return middle; //탐색 성공
        //오른쪽 탐색
        else if(key > list[middle]) low = middle+1;
        //왼쪽 탐색
        else high = middle-1;
    }
    return -1; //탐색 실패
}

반복

Indexed Sequential Search (색인 순차 탐색)

index table 사용 (주 자료에서 일정 간격으로 발췌)

index table을 먼저 탐색하여 key가 있을 범위를 알아낸 후 그 범위에 대해서만 순차 탐색 

 

Time Complexity: O(m + g)

m: index table의 크기

g: 일정한 간격(gap)

g = n/m


이진탐색트리 (BST - Binary Search Tree) 

https://shinyunha.tistory.com/13 여기서 가져옴 

 

중위순회하면 오름차순 정렬

key(왼쪽 sub 트리) < key(루트 노드) < key(오른쪽 sub 트리)

삽입 / 삭제 빠름 

 

Time Complexity: 트리의 높이 h

균형: O(logn)

불균형: O(n) - 순차탐색과 동일

TreeNode* search(TreeNode* node, int key){
    if(node == NULL) return NULL;
    
    if(key == node->key) return node;
    else{
        if(key < node->key)
            return search(node->left, key);
        else
            return search(node->right, key);
    }
}

순환탐색

TreeNode* search(TreeNode* node, int key){
    while(node != NULL){
        if(key == node->key) return node;
        else{
            if(key < node->key)
                node = node->left;
            else
                node = node->right;
        }
    }
    
    return NULL; //실패했을 때 
}

반복탐색


AVL 트리

Adelson-Velskii와 Landis가 제안

모든 노드의 왼쪽과 오른쪽 서브트리의 높이 차가 1이하인 이진탐색트리

스스로 노드들을 재배치하여 균형 상태 유지 

 

balance factor (균형 인수) = 왼쪽 서브트리의 높이 - 오른쪽 서브 트리의 높이  

각 노드들이 자신의 balance factor를 저장, 모두 0/1면 AVL 

 

Time Complexity: O(logn)

 

항상 leaf node에 삽입

삽입할 때 불균형이 되면 삽입 노드부터 균형 인수가 2가 된 가장 가까운 조상 노드까지 회전

돌린다고 복잡하게 생각하지 말고 그냥 규칙 만족하게 배치하자


보간 탐색 (Interpolation Search)

탐색키가 존재할 위치를 예측하여 탐색

이진 탐색과 유사하나 불균등 분할

 

Time Complexity: O(logn)

 

value의 비와, index의 비가 같다는 점 이용

int interpol_search(int key, int n){
    int low = 0;
    int high = n - 1;
    int j; 
    
    while(low <= high){
        j = ((float)(key - list[low]) / (list[high] - list[low]) * (high - low)) + low;
        
        if(key > list[j]) low = j+1;
        else if(key < list[j]) high = j-1;
        else return j; //탐색 성공
    }
    return -1; //탐색 실패 
}

 

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

[자료구조] 해싱  (1) 2025.12.09
[자료구조] 정렬  (0) 2025.12.06
[자료구조] 그래프  (0) 2025.12.04
[자료구조] Heap  (0) 2025.10.28
[자료구조] 트리  (0) 2025.10.27