3) 선형 검색

2022. 6. 8. 15:36·CS/알고리즘

주어진 배열 또는 구조체에서 선형 검색을 할 수 있습니다.

 

  • 선형 검색
  • 구조체

선형 검색

찾고자 하는 자료를 검색하는 데 사용되는 다양한 알고리즘이 있습니다. 그 중 하나가 선형 검색입니다.

선형검색은 원하는 원소가 발견될 때까지 처음부터 마지막 자료까지 차례대로 검색합니다.

이렇게 하여 선형 검색은 찾고자 하는 자료를 찾을 때까지 모든 자료를 확인해야 합니다.

 

효율성 그리고 비효율성

선형 검색 알고리즘은 정확하지만 아주 효율적이지 못한 방법입니다.

리스트의 길이가 n이라고 했을 때, 최악의 경우 리스트의 모든 원소를 확인해야 하므로 n번만큼 실행됩니다.

여기서 최악의 상황은 찾고자 하는 자료가 맨 마지막에 있거나 리스트 안에 없는 경우를 말합니다.

만약 100만 개의 원소가 있는 리스트라고 가정해본다면 효율성이 매우 떨어짐을 느낄 수 있습니다.

반대로 최선의 상황은 처음 시도했을 때 찾고자 하는 값이 있는 경우입니다.

평균적으로 선형 검색이 최악의 상황에서 종료되는 것에 가깝다고 가정할 수 있습니다.

선형 검색은 자료가 정렬되어 있지 않거나 그 어떤 정보도 없어 하나씩 찾아야 하는 경우에 유용합니다.

이러한 경우 무작위로 탐색하는 것보다 순서대로 탐색하는 것이 더 효율적입니다.

이제 여러분은 왜 검색 이전에 정렬해줘야 하는지 알 수 있을 것입니다.

정렬은 시간이 오래 걸리고 공간을 더 차지합니다.

하지만 이 추가적인 과정을 진행하면 여러분이 여러 번 리스트를 검색해야 하거나 매우 큰 리스트를 검색해야 할 경우 시간을 단축할 수 있을 것입니다.

 

주어진 배열에서 특정 값을 찾기 위해서 선형 검색을 사용한다면, 아래와 같은 코드를 작성할 수 있습니다.

 

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // numbers 배열 정의 및 값 입력
    int numbers[] = {4, 8, 15, 16, 23, 42};

    // 값 50 검색
    for (int i = 0; i < 6; i++)
    {
        if (numbers[i] == 50)
        {
            printf("Found\n");
            return 0;
        }
    }
    printf("Not found\n");
    return 1;
}

 

배열의 크기만큼 for 루프를 돌면서 배열의 인덱스를 차례대로 방문하며 찾는 값이 있는지를 검사하면 됩니다. 

 

문자열로 이루어진 배열도 비슷한 방식으로 검색할 수 있습니다.

만약 전화번호부에서 특정 이름을 찾아 해당하는 전화번호를 출력하는 프로그램을 작성하려면 어떻게 할 수 있을까요?

가장 간단한 예는 아래와 같은 프로그램이 될 것입니다.

 

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    string names[] = {"EMMA", "RODRIGO", "BRIAN", "DAVID"};
    string numbers[] = {"617–555–0100", "617–555–0101", "617–555–0102", "617–555–0103"};

    for (int i = 0; i < 4; i++)
    {
        if (strcmp(names[i], "EMMA") == 0)
        {
            printf("Found %s\n", numbers[i]);
            return 0;
        }
    }
    printf("Not found\n");
    return 1;
}

 

names 배열과 numbers 배열을 따로 정의하고 names 배열에서 검색을 해서 해당하는 인덱스의 numbers 배열 값을 출력하는 것이죠.

하지만 이 경우에는 names 배열과 numbers 배열이 서로 같은 인덱스를 가져야 한다는 한계가 있습니다.

더 좋은 방법은 아래 코드와 같이 새로운 자료형으로 구조체를 정의해서 이름과 번호를 묶어주는 것입니다.

 

이러한 구조체를 사용하면 되는 것이다. 

typedef struct
{
    string name;
    string number;
}
person;
#include <cs50.h>
#include <stdio.h>
#include <string.h>

typedef struct
{
    string name;
    string number;
}
person;

int main(void)
{
    person people[4];

    people[0].name = "EMMA";
    people[0].number = "617–555–0100";
    people[1].name = "RODRIGO";
    people[1].number = "617–555–0101";
    people[2].name = "BRIAN";
    people[2].number = "617–555–0102";
    people[3].name = "DAVID";
    people[3].number = "617–555–0103";

    // EMMA 검색
    for (int i = 0; i < 4; i++)
    {
        if (strcmp(people[i].name, "EMMA") == 0)
        {
            printf("Found %s\n", people[i].number);
            return 0;
        }
    }
    printf("Not found\n");
    return 1;
}

person 이라는 이름의 구조체를 자료형으로 정의하고 person 자료형의 배열을 선언하면 그 안에 포함된 속성값은 ‘.’으로 연결해서 접근할 수 있습니다.

person a; 라는 변수가 있다면, a.name 또는 a.number 이 각각 이름과 전화번호를 저장하는 변수가 되겠죠.

이렇게 함으로써 더욱 확장성 있는 전화번호부 검색 프로그램을 만들 수 있습니다.

반응형

'CS > 알고리즘' 카테고리의 다른 글

6) 정렬 알고리즘의 실행시간  (0) 2022.06.08
5) 선택 정렬  (0) 2022.06.08
4) 버블 정렬  (0) 2022.06.08
2) 알고리즘 표기법  (0) 2022.06.08
1) 검색 알고리즘  (0) 2022.06.08
'CS/알고리즘' 카테고리의 다른 글
  • 5) 선택 정렬
  • 4) 버블 정렬
  • 2) 알고리즘 표기법
  • 1) 검색 알고리즘
코딩 코딩 코오딩
코딩 코딩 코오딩
  • 코딩 코딩 코오딩
    코딩하는 누누
    코딩 코딩 코오딩
  • 전체
    오늘
    어제
    • 분류 전체보기 (491)
      • 생산성 (2)
        • 인텔리제이 (2)
      • 프로젝트 기록 (14)
        • git (2)
        • spring (3)
        • TestCode (2)
        • spring security (3)
        • 기타 (2)
        • MySQL (0)
        • Cloud (2)
      • 회고 (4)
      • Spring (6)
      • JPA (0)
      • DB (4)
        • MySql (2)
        • Redis (1)
      • Java (7)
        • JSP (1)
      • 잡담 (1)
      • CS (30)
        • 컴퓨팅 사고 (0)
        • 배열 (4)
        • 알고리즘 (8)
        • 메모리 (7)
        • 자료구조 (9)
        • 암호학 (2)
      • opencv (14)
      • AI (56)
        • 머신러닝 (2)
        • 딥러닝 (7)
        • tensorflow (3)
        • 머신러닝(딥러닝) 정리 (21)
        • 강화학습 (7)
        • 논문 읽기 (1)
        • 잡동사니 (1)
        • python AI (13)
        • 선형대수 (1)
        • 확률론 (0)
      • 알고리즘 공부 (177)
        • 그래프 이론 (0)
        • 다익스트라 (4)
        • 위상정렬 (3)
        • 신장트리-크루스칼 알고리즘 (4)
        • 플로이드 워셜 (3)
        • 이진탐색 (9)
        • 백트래킹 (11)
        • 부르드포스 (9)
        • 다이나믹 프로그래밍 (20)
        • BFS & DFS (24)
        • 그리디 (6)
        • 구현 (15)
        • 정렬 (3)
        • 기타 (62)
        • 수학? (1)
      • 코딩 (173)
        • 파이썬(python) (15)
        • c언어 (13)
        • 프로그래머스 lv1 (46)
        • 프로그래머스 lv2 (41)
        • 백준 - c++ (49)
        • Softeer (9)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    백준
    에라토슽네스의 체
    c언어
    소수찾기
    삽입 정렬
    코딩기초
    왜곡보정
    코딩
    순차 탐색
    코딩기초스킬
    n진법 변환
    정렬
    알고리즘
    그리디
    스택
    if문
    BFS
    인접행렬
    선택정렬
    자료구조
    이미지처리
    캘리브레이션
    코딩테스트
    인접리스트
    코딩문제
    다이나믹 프로그래밍
    큐
    C언어 기초
    DFS
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩 코딩 코오딩
3) 선형 검색
상단으로

티스토리툴바