[자료구조] 탐색 (순차 탐색, 이원 탐색, 두 리스트 비교)

2023. 5. 30. 17:21·전공/자료구조
728x90
반응형

탐색

  • 리스트: 하나 이상의 필드로 된 레코드의 집합
  • 키(key): 레코드를 구분하기 위해서 사용되는 필드

 

순차 탐색

template <class E, class K>
int SeqSearch(E *a, const int n, const K &k)
{   // a[1:n]을 왼쪽에서 오른쪽으로 탐색
    // a[i]의 키 값이 k와 같은 가장 작은 i를 반환, 없으면 0 반환
    int i;
    for (i = 1; i <= n && a[i] ! = k; i + +);
    if (i > n) return 0; // i값을 찾지 못한 경우
    return i;            // i값을 찾은 경우
}

 

시간복잡도 - O(n)

 

순차 탐색의 성능 향상(정렬된 리스트의 경우)

  • SepSearch의 for 조건 부분을 i <= n && a[i] < k로 변경
  • if 조건 i > n을 i > n || a[i] != k로 변경
  • 탐색이 실패할 때 성능 향상

 

 

이원 탐색(Binary Search)

int BinarySearch(int *a, const int x, const int left, const int right)
{ // 배열 a에서 x값 탐색
    if (left <= right)
    {
        int middle = (left + right) / 2;
        if (x < a[middle])
            return BinarySearch(a, x, left, middle - 1);
        else if (x > a[middle])
            return BinarySearch(a, x, middle + 1, right);
        return middle;
    }
    return -1; // 배열에 x값 존재하지 않음
}

 

시간복잡도 - O(log n)

 

 

두 개의 리스트 비교

비 정렬 리스트의 경우

void Verify1(Element *l1, Element *l2, const int n, const int m)
{ // 길이가 n, m인 두 리스트 l1, l2를 비교
    bool *marked = new bool[m + 1];
    fill(marked + 1, marked + m + 1, false);

    for (i = 1; i <= n; i++)
    {
        int j = SeqSearch(l2, m, l1[i]);
        if (j == 0)
            cout << l1[i] << " not in l2 " << endl; // (1)을 만족
        else
        {
            if (!Compare(l1[i], l2[j])) // (3)을 만족
                cout << "Discrepancy in " << l1[i] << endl;
            marked[j] = true; // l2[j]를 겁사한 것으로 표시
        }
    }
    for (i = 1; i <= m; i++)
        if (!marked[i])
            cout << l2[i] << " not in l1. " << endl; // satisfies (2)
    delete[] marked;
}

 

시간복잡도 - O(nm)

 

  • (1) l1리스트에 있는 키와 대응되는 레코드가 l2리스트에 없으면 메시지를 출력
  • (2) (1)과 반대인 경우 메시지 출력
  • (3) 같은 키를 가진 두 레코드 사이에 차이가 없으면, 결과에 대해 메시지 출력

 

정렬 리스트의 경우

void Verify2(Element *l1, Element *l2, const int n, const int m)
{ // l1과 l2 정렬 + Verify1과 같은 기능
    Sort(l1, n); // 키를 오름차순 정렬
    Sort(l2, m);
    int i = 1, j = 1; // l1, l2에서 작업할 위치
    while ((i <= n) && (j <= m))
        if (l[i] < l[j])
        {
            cout << l1[i] << " not in l2" << endl;
            i++;
        }
        else if (l[i] > l[j])
        {
            cout << l2[j] << " not in l1" << endl;
            j++;
        }
        else
        { // 같은 키들
            if (!Compare(l1[i], l2[j]))
                cout << "Discrepancy in " << l1[i] << endl;
            i++;
            j++;
        }
    if (i <= n)
        OutputRest(l1, i, n, 1); // l1의 레코드 i부터 n까지 출력
    else if (j <= m)
        OutputRest(l2, j, m, 2); // l2의 레코드 j부터 m까지 출력
}

 

시간복잡도 - O(\(t_{sort}(n) + t_{sort}(m) + n + m\)

\(t_{sort}(n)\): n개의 레코드를 가진 리스트를 정렬하는데 걸리는 시간 - O(n log n)시간에 정렬 가능

 

 

728x90
반응형

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

[자료구조] 정렬 2 (외부 정렬 - 합병 정렬)  (1) 2023.06.06
[자료구조] 정렬 1 (내부 정렬 - 삽입 정렬, 퀵 정렬, 합병 정렬, 히프 정렬, 기수 정렬)  (0) 2023.06.06
[자료구조] 그래프 2 (신장 트리, Kruskal, Prim, Sollin 알고리즘, 그래프 최단경로, AOV 네트워크)  (0) 2023.05.30
[자료구조] 그래프 1 (그래프 정의, 그래프 표현, 그래프 탐색)  (0) 2023.05.30
[자료구조] 트리 2 (최대 히프, 이진 탐색 트리)  (2) 2023.05.19
'전공/자료구조' 카테고리의 다른 글
  • [자료구조] 정렬 2 (외부 정렬 - 합병 정렬)
  • [자료구조] 정렬 1 (내부 정렬 - 삽입 정렬, 퀵 정렬, 합병 정렬, 히프 정렬, 기수 정렬)
  • [자료구조] 그래프 2 (신장 트리, Kruskal, Prim, Sollin 알고리즘, 그래프 최단경로, AOV 네트워크)
  • [자료구조] 그래프 1 (그래프 정의, 그래프 표현, 그래프 탐색)
dev_ares
dev_ares
대학에서 컴퓨터공학을 전공하고 있는 학생입니다.
    반응형
    250x250
  • dev_ares
    노트
    dev_ares
  • 전체
    오늘
    어제
    • 분류 전체보기 (187)
      • IT 트랜드 (2)
      • 백엔드 (18)
        • Java + Spring (8)
        • Kotlin + Spring (5)
        • 백엔드 (5)
      • 프론트엔드 (1)
        • React (1)
      • 대외활동 (17)
        • 42서울 (17)
      • 백준 (6)
        • Java (2)
        • C++ (3)
      • 전공 (121)
        • 객체지향프로그래밍 (17)
        • 자료구조 (23)
        • 리눅스시스템관리 (16)
        • 컴퓨터구조 (25)
        • 네트워크 (25)
        • 데이터베이스 (15)
        • 기타 전공 (0)
      • 프로그래밍 언어 (18)
        • Java (5)
        • Swift (4)
        • C++ (1)
        • Kotlin (8)
      • 기타 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    C++
    추가 문제
    자료구조
    컴공 포트폴리오
    코틀린
    오블완
    상속
    사설 문제
    명령어
    메모리 계층 구조
    42서울
    리눅스
    컴퓨터구조
    백준
    자바
    컴퓨터 구조 및 설계
    단일 사이클
    반복자
    데이터패스
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
dev_ares
[자료구조] 탐색 (순차 탐색, 이원 탐색, 두 리스트 비교)
상단으로

티스토리툴바