Array는 가장 기초적이고 단순하면서도 가장 자주 사용되는 자료구조 (data structure) 입니다. 여러분들도 이미 많이 사용해 보신 자료구조 일겁니다.
이렇게 순서가 있다보니 당연히 순차적으로 번호를 지정할 수 있습니다. 마치 학교에서 이름을 부르지 않고 번호를 불르는 것과 동일한 개념입니다. 이 번호를 index 라고 합니다.
Index는 0부터 시작됩니다. Index는 마이너스 부호를 가질 수 도 있습니다. 마이너스 index는 맨 마지막 요소 부터 시작합니다. 예를 들어, -1 은 맨 마지막 요소 입니다.
순서가 있음으로 index가 있고 index가 있음으로 index를 사용해서 특정 요소를 array(list)로 부터 읽어들일 수 있습니다.
Array의 요소가 array가 될 수 있습니다. 이러한 array를 다중차원(multi-dimentional) array라고 합니다. 일반적으로 2D (2차원) array가 많이 사용됩니다. (좌표,바둑 등등)
앞서 본대로 Array는 메모리의 실제 주소도 순차적으로 되어있습니다. 그럼으로 indexing이 가능한 것을 비롯하여 여러 장점이 있지만 반대로 단점도 있습니다.
항상 메모리가 순차적으로 이어져있어야 하기 때문에, 요소를 삭제하면 삭제된 요소로 부터 뒤에 있는 모든 요소들을 앞으로 한칸씩 이동시켜주어야 합니다. 이뜻은 배열에서 요소를 삭제하는 것은 다른 자료구조들에 비해 느릴 수 있다는 뜻입니다.
요소 삭제와 마찬가지의 이유로 배열의 맨 앞에 요소를 삽입 하는 것은 상대적으로 느린 operation 입니다.
배열은 메모리가 순차적이어야 하다보니 배열이 처음 생성될때 어느정도 메모리를 미리 할당해놓습니다. 이를 전문 용어로 pre-allocation 한다 합니다. 메모리를 pre-allocation 함으로 새로 추가되는 요소들도 순차적으로 메모리에서 저장을 가능하게 합니다.
하지만 만일 처음에 잡아놓은 메모리 이상으로 요소들이 많아지면 resizing을 해야합니다. 즉 메모리를 더 할당해야 합니다. 그리고 추가적으로 할당된 메모리 또한 순차적이여야 합니다. 그럼으로 배열의 resizing은 상대적으로 시간이 오래걸리는 operation 입니다.
일반적으로 대부분의 언어에서는 배열의 메모리 pre-allocation과 resizing을 자동으로 실행해줍니다. 하지만 이러한 점을 알고 있어야 사이즈가 급격하게 자주 늘어날 확률이 있는 데이터는 array 말고 더 적합한 자료구조를 선택해야 한다는 것을 알 수 있는것입니다.
순차열적인 데이터를 저장할때
어떠한 특정 요소를 빠르게 읽어야 할때
데이터의 사이즈가 급변하게 자주 변하지 않을때
그리고 요소를 자주 삭제해야 하지 않을때
추후 js코드로 정리
Array나 list를 쓰기에 너무 간단한 데이터들을 표현할때.
Tuple이 list보다 더 가볍고 메모리더 적게 먹는다.
예를 들어, 좌표 데이터:
coordinations = [
(1, 2),
(3, 4),
(5, 6)
]
Set는 array나 list 처럼 순열 자료구조 (collection) 입니다.
하지만 set는 순서라는 개념이 존재하지 않습니다. Set의 특징은 다음과 같습니다.
추후 정리
enter image description here
5 in my_set
hash는 단방향 (one way) 암호화 입니다. 단방향이란 한번 암호화 하면 복호화가 안된다는 뜻입니다. 실제 값의 길이와 상관없이 hash 값을 일정한 길이를 가집니다. 그럼으로 Hash는 주로 임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 매핑할때 사용됩니다.
#### When To Use Set
- 중복된 값을 골라내야 할때
- 빠른 look up 을 해야 할때(비열이면 하나하나 접근해서 키를 비교 하지만 Set에서는 찾고자 하는값이 있을때 해시값을 구해서 바로 접근하면 가능하니까 )
- 그러면서 순서는 상관 없을때
# 5.Dicitonary/ HashMap/HashTable
Dictionary (다른 언어에서는 hashmap 이나 hash table이라고 하기도 함)는 Key-value 형태의 값을 저장할 수 있는 자료구조 입니다. 이름은 "정우성" 등 실제 데이터 값과 데이터를 설명하는 key의 대응 관계를 표현할때 유용합니다.
Dictionary의 특성은 다음과 같습니다.
- Set과 마찬가지로 특정 순서대로 데이터를 리턴하지 않는다.
- Key의 값은 중복될 수 없다. 만일 중복된 key 가 있으면 먼저 있던 key와 value를 대체한다.
- 수정 가능하다(mutable).
```js
추후정리
enter image description here
Stack과 Queue는 비슷한 구조인데 자료를 읽어들이는 순서가 틀립니다.
Stack은 LIFO(Last In First Out) 이라고 합니다. 마지막으로 저장한 데이터가 처음으로 읽힌다는 뜻입니다. 마치 설겆이 한 접시를 하나 하나 쌓아올리는걸 생각하시면 쉽습니다.
enter image description here
push
라고 합니다.pop
이라고 합니다. 다만 pop
은 읽어들임과 동시에 stack에서 삭제합니다.추후정리
### When to use stack
- 프로그램에서 함수 호출 기록을 stack으로 저장합니다. 그래서 StackOverflow 에러 라는것도 있는겁니다. 이 사이트도 stack overflow 이죠.
- Web browser 내역 혹등 내역인데 최신 내역이 먼저 나와야 하는 경우
### Queue
Queue는 Stack과 반대로 FIFO(First In First Out) 입니다. 즉 먼저 push 된게 먼저 pop 된다는 말입니다.
enter image description here
일반적인 queue 말고도 double ended queue, priority queue 등도 있습니다.
### 리스트를 사용한 Queue 구현 예제
```js
추후정리
Tree 자료구조는 데이터를 마치 나무(거꾸로된) 형태로 저장하는 자료 구조 입니다. Tree 자료구조는 여러 유형이 있지만 그 중 가장 기본은 binary tree(이진 트리) 자료구조 입니다. 이진 트리는 두개의 자식 노드를 가진 트리 형태입니다.
Node
: 트리 구조의 교점입니다. Node가 데이터를 가지고 있고 또한 자식 노드를 가지고 있습니다. 트리 자료구조는 노드를 기본으로 구성된다고 보시면 됩니다.Root Node
: 트리 구조의 가장 위 노드, 즉 시작점이 되는 노드 입니다.이진 트리는 앞서 언급한대로 각 노드가 최대 2개의 자식 노드를 가질 수 있습니다. 이 2개의 노드를 left node 그리고 right node라고 합니다. left node는 부모 node의 값 보다 적은 값이 저장되고 right node는 같거나 큰 값을 저장합니다.
예를 들어, [21, 28, 14, 32, 25, 18, 11, 30, 19, 15]
를 이진 트리로 저장하면 다음 그림과 같습니다.
이진 트리는 검색을 효율적으로 할 수 있습니다. 원하는 값을 찾을 때까지, 현재 node의 값이 원하는 값보다 크면 왼쪽으로, 작으면 오른쪽 으로 움직이면 됩니다.
그럼으로 일반 list는 검색이 O(N)인데에 비해 이진 트리는 O(log N) 이므로 리스트 보다 검색이 훨씬 효율 적입니다.