TIL11: Data Structure- Array(list) & Tuple

Seoyul Kim·2020년 4월 6일
0

DataStructure

목록 보기
1/4

Data Structure

  • 자료구조는 상황과 문맥에 맞게 데이터를 담을 수 있는 적절한 구조를 말하며 언어별로 지원하는 양상이 다르다.
  • 데이터에 편리하게 접근하고 조작하기 위한 방법이다.
  • 각 자료구조의 본질과 컨셉을 이해하고 상황에 맞는 적절한 자료구조를 선택하는 것이 중요하다.
  • 자료구조는 크게 단순구조(primitive data structure)와 비단순 구조(none-primitive data structure)로 나뉜다.
  • 단순구조: 프로그래밍에서 사용되는 기본 데이터 타입
  • 비단순 구조: 단순한 데이터를 저장하는 구조가 아니라 여러 데이터를 목적에 맞게 효과적으로 저장하는 자료구조이며 선형 구조와 비선형 구조로 나뉜다.
    • 선형구조: 저장되는 자료의 전후 관계가 1:1(list, stacks, queues)
    • 비선형 구조: 데이터 항목 사이의 관계가 1:n 또는 n:m(graphs, trees)

array(list)

  • 가장 기초적이고 단순하면서도 자주 사용되는 자료구조이며 순차적으로 데이터를 저장한다.
  • 삽입 순서대로 저장되며 이미 생성된 리스트도 수정 가능한다(mutable)
  • 동일한 값도 여러번 삽입 가능하다.
  • multi-dimentional array(다중 차원 배열): array의 요소가 array가 될 수 있다.
A=[[11,12,13],[21,22,23],[31,32,33]]
  • 순차적으로 index를 가진다

순차적으로 데이터를 저장할 수 밖에 없는 이유는?

  • 실제 메모리 상에서 물리적으로 데이터가 순차적으로 저장되기 때문이다.
  • 데이터에 순서가 있기 때문에
    1) index가 존재하며
    2) indexing(index를 사용해 특정 요소를 array(list)로 부터 읽어 들이는 것)이 가능하고
    3) slicing(요소의 특정 부분을 따로 분리해 조작하는 것)이 가능하다.

단점

  • 메모리의 실제 주소도 순차적으로 되어있기 때문에 여러 장점도 있지만 단점도 존재한다.
  1. removing or adding elements
  • 중간의 특정 요소를 삭제해야 하는 경우 항상 메모리가 순차적으로 이어져 있어야 하기 때문에 삭제된 요소로부터 뒤에 있는 모든 요소들을 앞으로 이동시켜주어야 한다. 그렇기 때문에 배열에서 요소를 삭제하는 것은 다른 자료 구조에 비해 느릴 수 있다.
  • 요소를 삭제하는 과정은 한줄이지만 실제 메모리 상에서 이루어지는 작업은 훨씬 커지기 때문이다.
    중간에 요소가 추가되는 경우도 마찬가지이다 그렇기 때문에 array는 정보가 자주 삭제되거나 추가되는 데이터를 담기에는 적절하지 않다.
  1. resizing
  • 배열은 메모리가 순차적으로 채워지기 때문에 처음 생성될 때 어느정도 메모리를 미리 할당한다. 이를 pre-allocation이라고 한다.
  • 요소들이 처음 할당한 메모리 이상으로 많아진다면 resizing이 필요하다.즉 메모리를 더 할당해야하며 추가적으로 할당된 메모리 또한 순차적이어야 하기 때문에 배열의 resizing은 상대적으로 오래걸리는 operation이다.
  • 그렇기 때문에 사이즈 예측이 잘 되지 않는 데이터를 다루기에는 적절하지 않다.
  • 일반적으로 대부분의 언어에서는 배열의 메모리 pre-allocation과 resizing을 자동으로 실행하지만 사이즈가 급격하게 자주 늘어날 확률이 있는 데이터는 array말고 더 적합한 자료구조를 선택해야 한다.

array는 언제 사용할까?

  • 순차적인 데이터를 저장할 때(값보다는 순서가 중요한 데이터)
  • 다차원 데이터를 다룰때
  • 어떠한 특정 요소를 빠르게 읽어야 할 때 (index를 통해 곧바로 읽을 수 있다.)
  • 데이터의 사이즈가 자주 변하지 않을 때
  • 요소가 자주 삭제되거나 추가되지 않을 때

Tuple

  • list와 마찬가지로 데이터를 순차적으로 저장할 수 있는 순열 자료구조이지만 한번 정의되고 나면 수정할 수 없다.(immutable)
  • 2~3개 정도의 적은 수의 소규모 데이터를 저장할 때 많이 사용한다.
  • 함수에서 리턴값을 한개 이상 리턴하고 싶을 때 자주 쓰인다.

장점

  • 간단한 값을 빨리 표현하고 싶을 때 많이 사용한다.

단점

  • 객체처럼 key-value쌍으로 이루어져있지 않고 괄호 안에 데이터만 담겨있기 때문에 문맥을 보고 의미를 가정해야 한다.
  • 소규모 데이터를 다루기에 적합하다.
  • 이러한 단점을 극복하기 위해 named tuple이 존재한다.

언제 사용하면 좋을까?

  • arrray를 쓰기에는 간단한 데이터들을 표현할 때 사용한다.(tuple이 array(list)보다 더 가볍고 메모리도 적게 먹는다.)

0개의 댓글