1장 자료 구조가 중요한 까닭

김현수·2022년 2월 6일
0

  • 코드 품질의 척도
    1. 코드 유지 보수성
    2. 코드 효율성
const printNumberVersionOne = () => {
  let number = 2;
  
  while (number <= 100) {
    if(number % 2 === 0) {
      console.log(number);
    }
    number += 1;
  }
}

const printNumberVersionTwo = () => {
  let number = 2;
  while (number <= 100) {
    console.log(number);
    number += 2;
  }
}

printNumberVersionOne은 루프를 100번 돌고 끝나지만 printNumberVersionTwo는 50번만 돈다.
따라서 첫 번째 버전이 두 번째 버전보다 두 배 더 많은 단계를 거친다.

1.1 자료 구조

데이터: 일반적으로 모든 유형의 정보를 망라하는 용어. 가장 기초적인 수와 문자열로 이뤄진다.
자료 구조: 데이터를 조직하는 방법.
데이터 조직이 코드의 실행 속도에 미치는 영향이 크다.

const x = "Hello! ";
const y = "How are you ";
const z = "today?"
console.log(x + y + z);

const array = ["Hello! ", "How are you ", "today?"];
console.log(array[0] + array[1] + array[2]);

같은 데이터를 다양한 방식으로 조직할 수 있다.

1.2 배열: 기초 자료 구조

배열: 컴퓨터 과학에서 기초적인 자료 구조 중 하나. 데이터 원소들의 리스트.

  • 배열의 크기: 배열에 데이터 원소가 얼마나 들어있는지
  • 배열의 인덱스: 특정 데이터가 배열의 어디에 있는지.
    • 대부분의 프로그래밍 언어에서 인덱스는 0부터 시작한다.

1.2.1 자료 구조 연산

대부분의 자료 구조는 네 가지 연산이 있다.

  • 읽기: 자료 구조 내 특정 위치를 찾아보는 것.
  • 검색: 자료 구조 내에서 특정 값을 찾는 것.
  • 삽입: 자료 구조에 새로운 값을 추가하는 것.
  • 삭제: 자료 구조에서 값을 제거하는 것.

1.3 속도 측정

연산이 얼마나 "빠른가" = 연산에 얼마나 "많은 계산 단계가 필요한가"

1.4 읽기

배열 내 특정 인덱스에 어떤 값이 들어 있는지 찾아보는 것.

배열에서의 읽기는 딱 한 단계.
인덱스 2를 찾는다면 인덱스 2로 바로 가서 값을 알려준다.

  1. 컴퓨터는 모든 메모리 주소에 한 번에 갈 수 있다.
  2. 컴퓨터는 배열을 할당할 때 어떤 메모리 주소에서 시작하는지도 기록해 둔다.
  3. 컴퓨터는 어떤 인덱스에 있는 값이든 간단한 덧셈을 수행해 찾을 수 있다.

1.5 검색

배열에 특정 값이 있는지 알아본 후, 있다면 어떤 인덱스에 있는지 찾는 것.

컴퓨터에 을 제공하고 그 값이 들어 있는 인덱스를 반환하라고 요청하는 것.
컴퓨터는 모든 메모리 주소에 한 번에 접근하지만 각 메모리 주소에 어떤 값이 있는지 바로 알지 못한다.

N개의 셀로 이뤄진 배열은 선형 검색에 최대 N단계가 필요하다.

1.6 삽입

삽입 연산은 배열의 어디에 데이터를 삽입하는가에 따라 효율성이 다르다.

  • 배열의 맨 끝에 추가할 경우, 딱 한 단계만 필요하다.
    • 배열을 할당할 때 항상 배열의 크기를 기록하기 때문이다.
    • 컴퓨터는 배열이 시작하는 메모리 주소와 배열의 크기를 알기 때문에, 마지막 데이터의 인덱스 역시 안다.
  • 배열의 맨 처음이나 중간에 삽입할 경우 삽입할 공간을 만들기 위해 많은 데이터 조각을 이동시켜야 하므로 단계가 늘어난다.
    • 최악의 시나리오인 배열의 맨 앞에 삽입할 경우 배열 내 모든 값을 한 셀씩 오른쪽으로 옮겨야 한다.
    • 최악의 시나리오는 N+1 단계가 걸린다.

1.7 삭제

배열의 특정 인덱스의 값을 제거하는 과정

  • 삭제하는 것은 한 단계면 되지만, 삭제한 공간을 메꾸기 위해 뒤의 데이터를 앞으로 한 칸씩 이동해야 한다.
  • 배열의 맨 처음 원소를 삭제하는 경우가 최악의 시나리오이다.
    • 최악의 시나리오는 N단계가 걸린다.

1.8 집합: 단 하나의 규칙으로 효율성이 달라진다.

집합: 중복 값을 허용하지 않는 자료 구조. 중복 데이터가 없어야 할 때 유용하다.

중복 금지라는 제약으로 인해 집합 삽입의 효율성이 배열과 달라진다. 읽기, 검색, 삭제는 동일하다.

집합에서는 값을 삽입하기 전에 먼저 이 값이 집합에 들어 있는지 결정해야 한다.
즉, 삽입하려는 값이 집합에 이미 있는지부터 먼저 검색해야 한다. 집합에 삽입하려는 값이 없을 때에만 컴퓨터는 삽입을 허용한다.
따라서 모든 삽입에는 검색이 우선이다.

값을 집합의 맨 앞에 삽입하는 최악의 시나리오일 때, 총 2N+1단계가 필요하다.

  • 검색에 N단계
  • 삽입할 공간을 만드는데 N단계
  • 삽입하는데 1단계

집합의 삽입이 배열의 삽입보다 느리긴하지만, 중복 데이터가 없어야 할 때는 집합이 답이다.
애플리케이션의 요구사항을 먼저 분석한 후 어떤 자료 구조가 더 적합한지 결정해야 한다.

1.9 마무리

자료 구조의 성능 측정은 연산에 필요한 단계 수를 구하는 게 핵심이다.

0개의 댓글