자료구조 시간에 배운 내용. 프로젝트를 하다보면서 개발을 하다보면서 하나하나 어렴풋해진 이러한 자료구조를 주기적으로 볼 수 있게끔 블로그에 정리해두어야 할 필요가 있겠다고 생각했다. 

우선 첫 번째가 리스트(List)이다. 

리스트의 정의는 "도표 또는 목록을 추상화 한 것" 

(추상화 이런 단어가 썩 내키지 않지만, 이미 정의에서 조차 추상화라는 단어는 좋지 않은 것 같다.)

간단히 말하면 "그냥 자료를 나열해 놓은 것"이라고 정리하고 싶다. 


리스트를 표현하는 자체는 크게 배열과 연결 리스트라고 한다. 

리스트를 배열로 표현할 때의 장점과 단점, 연결 리스트로 표현할 때의 장점과 단점을 알아야 할 것같다. 

한 가지 확실한 것은 배열이 좋다, 연결 리스트가 좋다라고 단정 할 수 없다는 것이다.


리스트를 배열로 표현 했을 때

장점 : 

(1) 검색이 쉽고 빠르다. 

단점 : 

(1) 삽입, 삭제가 용이하지 않다. 

(2) 자료의 크기를 가늠할 수 없어 충분히 크게 잡으면 메모리의 낭비를 초래할 수있다.


리스트를 연결리스트로 표현 했을 때

장점 : 

(1) 삽입, 삭제가 용이하다.

(2) 자료를 동적인 메모리 공간에 할당하므로 메모리의 낭비를 줄일 수 있다.

단점 : 

(1) 단 번에 접근하여 검색 할 수 없다. 처음부터 원하는 데이터가 나올 때까지 연결고리를 이용해 찾아들어야 간다.


왜 그런지에 대해서 그림으로 설명 할 필요가 있겠다. 


[배열]

검색이 쉽고 빠르다

우선 배열은 배열의 각 원소가 정해진 크기를 가진다. 

간단하게 말해서 물리적으로 동일한 주소크기만큼을 가지고 있다.

그래서 인덱스를 통해서 단 한방에 접근이 가능하다. => 결국 D 라는 데이터에 접근하기 위해서는 [3]로 바로 접근이 가능하다는 얘기다.

무척이나 빠르다는 말!





삽입삭제가 쉽지 않다.?

다음과 같은 경우에 Z라는 값을 배열로 구성된 리스트에 삽입하기 위해서는 해당 자리에 값을 넣고 

기존의 있던 3~5까지를 한 번 뒤로 밀어야 한다. 

X는 3이라는 인덱스를 갖게 되고 D는 4, E는 5,  F는 6
한 번 삽입하는데 시간과 자원의 낭비라고 생각하지 않는가?








[연결리스트]

검색이 오래 걸린다?

연결리스트는 구조가 그 값을 가지는 데이터와 연결 될 주소값을 가지는 데이터로 구성되는 노드(Node) 형태로 존재한다. 

여기서 한 가지 알고 가야될 꺼는 다음의 데이터로 연결되는 주소들이 일정하지 않고 그 값을 알 수 없다는 것이다.

D를 검색하기 위해서는 A부터 시작해서 B를 지나 C를 지나 D에 도달해야만 된다는 것이다!

이 것은 단번에 접근가능한 배열에 비해 심한 낭비 일 수 있다. 



삽입 삭제가 빠르다?
N이라는 값을 B다음에 삽입하고 싶으면 다음과 같이 하면 된다.

기존에 연결되어있던 B->C의 연결을 끊고 B->N으로 연결하고, N->C로 연결하면 끝이다. 

C라는 값을 삭제하고 싶으면 다음과 같이 하면 된다.

기존에 연결되어 있던 B->C와 C->D를 끊고 B->D로 연결해버리면 된다. C++과 같은 경우에 할당된 C의 값을 가진 노드를 할당해제해주면된다.


너무 간편하다. 배열처럼 원하는 자리에 넣고 원소들의 값을 뒤로 밀거나 앞으로 땡길 필요가 없다.



 

'자료구조' 카테고리의 다른 글

트리(Tree)  (0) 2015.07.01
위상정렬  (0) 2015.07.01
정렬에 관해서  (0) 2015.04.03
트리 순회_동적할당소스코드  (0) 2015.03.31
트리의 순회  (1) 2015.03.25
Posted by slender ankles
,