언제 이 데이터구조를 활용하면 좋은지에 초점을 맞춰 공부해야한다
Data Structure(자료 구조)란?
데이터에 편리하게 접근하고 조작하기 위해 데이터를 저장하거나 조직하는 방법
상황과 문맥에 맞게 데이터를 담을 수 있는 적절한 구조를 말한다.
데이터에 맞는 적절한 자료 구조를 사용하는 것은 전체 개발 시스템에 굉장히 큰 영향을 끼친다
메모리의 효율적인 사용 - 프로그램의 실행시간 효율과 저장공간 효율성을 높인다.
자료 구조의 분류
- 단순구조
- 비단순 구조 :여러 데이터를 목적에 맞게 효과적으로 저장하는 자료 구조
1) 선형 구조 : 저장되는 자료의 전후 관계가 1:1 (ex. List, Stacks, Queues)
2) 비선형 구조 :데이터 항목 사이의 관계가 1:n 또는 n:m (ex. Graphs, Trees )
Array(List)
1. 특징
- 순차적(ordered)으로 저장한다 : index를 가진다 (0부터 시작, 마이너스 부호는 맨마지막 요소부터 시작)
- 순서가 상관 없더라도 서로 연결된 데이터들을 저장할때 사용한다.
- 삽입 순서대로 저장된다.
- 이미 생성된 리스트도 수정 가능하다(mutable)
- 값 중복 가능
- 다중차원배열(Multi-dimentional Array)
2. 왜 Array가 순차적으로 데이터를 저장할 수 밖에 없을까?
실제 메모리 상에서, 즉 물리적으로 데이터가 순차적으로 저장되기 때문이다. 따라서
- index가 존재
- indexing : index를 사용해서 특정 요소를 array로부터 읽어들일 수 있다
- Slicing : 요소의 특정부분을 따로 분리해 조작가능하다.
3. 단점
1. 항상 메모리가 순차적으로 이어져있어야하기 때문에, 요소를 삭제하거나 추가하는 경우
- 나머지 요소들을 다시 이동시켜야한다 : 다른 자료 구조에비해 느리다.
- 코드상에는 한 줄 이어도, 실제 메모리 상에서 이루어지는 작업은 훨씬 크다(expensive operation)
그렇기 때문에 Array 는 정보가 자주 삭제 되거나 추가되는 데이터를 담기에는 적절치 않다.
2. Array Resizing
- 배열은 메모리가 순차적으로 채워지기 때문에 배열이 처음 생성될 때 어느 정도 메모리를 미리 할당한다(pre-allocation)
- 새로 추가되는 요소들도 순차적으로 할당된 메모리에 저장되지만, 요소들이 메모리 이상으로 많아지면 resizing 해야한다.
(새로 더 큰 메모리를 생성하고, 기존 데이터를 복사해넣고, 그 다음에 데이터를 추가)-> 오래걸림!
그렇기 때문에 Array 는 사이즈 예측이 잘 안 되는 데이터를 다루기에는 적절치 않다.
4. 언제 사용해야할까
- 순차적인 데이터를 저장할떄 (ex.주식가격:값보다는 순서가 중요할때)
- 다차원 데이터를 다룰때
- 특정 요소를 빠르게 읽어야할때 (index로 가능)
- 데이터 사이즈가 자주 변하지 않을때
- 요소가 자주 삭제 되거나 추가되지 않을 때
Tuple
1. 특징
- 데이터를 순차적으로 저장할 수 있는 순열 자료구조
- 한 번 정의되고 나면 수정할 수 없다(immutable)
- 2-3개 정도의 적은 수의 소규모 데이터를 저장할 때 많이 사용한다
2. 장점
- 간단한 값을 빨리 표현하고 싶을 때
- 함수에서 리턴 값을 한 개 이상 리턴하고 싶을 경우 (ex. 지도 좌표)
3. 단점
- 데이터가 무슨 의미인지 명확하지 않다(문맥을 보고 파악해야한다)
4. 언제 사용해야할까
- Array(List)를 쓰기에는 간단한 데이터들을 표현할 때
더 가볍고 메모리가 적다.
ex) 좌표 데이터 (파이썬)coordinations = [
(1, 2),
(3, 4),
(5, 6)
]