22
리리리 리리 리리 리리리 리리리리리 .

리스트

Embed Size (px)

Citation preview

Page 1: 리스트

리스트대충 쓰는 컴퓨터 자료규ㅜ조 .

Page 2: 리스트

리스트• 리스트 , 목록 , 명단 , 일람표

Page 3: 리스트

리스트• 우리가 생활에서 사용하는 리스트와 동일 !

• 무엇인가를 순차적으로 나타낼 수 있다 !

• 순서 번호를 통해 해당 순서에 있는 정보를 가져온다 .

• 사실상 모든 자료구조의 끝판왕 .• 탐색이 지랄 맞아서 그렇지 ..

Page 4: 리스트

표현 방법• 리스트는 두가지방법으로 표현가능 .

• 연속된표현• 필요한 방의 갯수를 미리 예약후 채워나가는 방식 .• 예약을 받으면 방의 갯수를 바꿀 수 없다 .

• 연결된표현• 방이 필요할때 마다 방을 잡는방식 .• 그런데 방 문에는 다음 방의 호수가 적혀 있다 .

Page 5: 리스트

A C D Z D E B K P

연속된 표현 방법

A C D Z B

연결된 표현 방법

Page 6: 리스트

뭐가 더 좋은거지 ?• 각각마다 장단점이 존재• 그 장단점을 다음장에서 알아보자

Page 7: 리스트

연속된 표현 (cont)• 직접적으로 데이터를 찾는게 가능 .

• 사실상 적고 보니 장점이 별로 없다 .• 물론 컴퓨터 입장에서는 얻는 장점이 더있지만…

• 문제는 데이터를 중간에 삭제하거나 , 중간에 넣으면…• 또 예약된 방이 더 이상 남아 있지 않다면…

Page 8: 리스트

연속된 표현 (cont)

A C D Z D E B K P

직접적으로 데이터를 찾아보자 !

3 번째 방에는 누가 있나요 ?

네 . 3 번째 방에는 D 가 있습니다 !

Page 9: 리스트

연속된 표현 (cont)

A C D Z D E B K P

데이터를 중간에서 빼보자 !

5 번째 사람이 방에서 나왔어요 !네 ? 그럼 뒷사람들은…

나머지 입주자들 ..궁시렁궁시렁 옆방으로 한칸씩 옮겨야 되네 ..

A C D Z E B K P

Page 10: 리스트

연속된 표현 (cont)데이터를 중간에 넣어봅시다 !

5 번째에 Q 가 이사왔어요 ! 물론 .. 네 ? 그럼 뒷사람들은…

나머지 입주자들 ..궁시렁궁시렁 옆방으로 한칸씩 옮겨야 되네 ..

A C D Z D Q E B K P

A C D Z D E B K P

Page 11: 리스트

연속된 표현데이터를 또 넣어봅시다 .

1 번째에 N 이 이사왔어요 ! 엥 ? 자리가 없는데… .

시공사 ..이거 부지를 다시 사서 재계약 해야겠는걸 ..?

A C D Z D Q E B K P

Page 12: 리스트

연결된 표현 (cont)• 연속된 표현의 문제점인 추가 / 삭제의 문제점을 해결 !

• 뭐 이것도 쓸 장점이 마땅치 않다…• 하지만 .. 주소로 찾아가려면 계속 다음 주소를 봐야됨 !• 왜냐고 ? 새로 예약 받은 호실이 바로 다음 호실이라는 보장이 없음 !

• 중간에서 삽입 / 삭제를 하게되면 탐색은 필수가 된다 .• 해당 위치까지 찾아가야됨 .

Page 13: 리스트

연결된 표현 (cont)

A C D Z B

데이터를 중간에서 빼보자 !

2 번째 사람이 방에서 나왔어요 !

A D Z B

A D Z B

잘 있어요 ~!

참 쉽죠 ?

Page 14: 리스트

연결된 표현 (cont)데이터를 중간에서 넣어보자3 번째에 H 가 들어 갈께요 !

A C D Z B

H

A C D Z B

H

참 쉽죠 ?

Page 15: 리스트

연결된 표현하지만…3 번째에 무엇이 있나요 ?!

A C D Z B

A C D Z B

A C D Z B

ㅅㅂ…

Page 16: 리스트

결론 (cont)• 리스트는 두가지 종류가 있다 .

• 두가지 종류는 서로서로 트레이드 오프를 하게 된다 .

• 코딩시에 용도에 따라 골라 쓸것 !• 데이터는 변화가 거의 없음 -> 연속된 표현이 적합 .• 데이터의 변화가 심함 -> 연결된 표현이 적합 .

Page 17: 리스트

결론연속된 표현 연결된 표현

삽입 - 중간 O(n) O(n)

삽입 - 처음또는끝 O(n) O(1)

삭제 - 중간 O(n) O(n)

삭제 - 처음또는끝 O(n) O(1)

탐색 O(1) O(n)

Page 18: 리스트

번외 – 못다한 이야기• 리스트는 추상 자료형 (Abstract Data Type) 의 일종 !• ADT 는 자료형의 이름 , 연산 , 데이터로 이루어진다 .• https://ko.Wikipedia.org/wiki/%EC%B6%94%EC%83%81_%EC%9E%90%EB%A

3%8C%ED%98%95

• 연속된 표현의 경우 탐색성능이 연결된 표현보다 좋다 .• 탐색의 경우 처음 부터 재수 없으면 끝까지 뒤져봐야 되는데 , 요즘 CPU 의 경우 캐시 메모리가 장착이 되어 있다 . 캐시 메모리에는 보통 접근된 주변의 메모리 데이터를 같이 불러 온다 .( 공간적 지역성 )• https://ko.wikipedia.org/wiki/%EC%BA%90%EC%8B%9C#.EA.B3.B5.EA.B0.84.

EC.A0.81_.EC.A7.80.EC.97.AD.EC.84.B1

Page 19: 리스트

번외 – 못다한 이야기• 연속된 표현은 직접 접근 속도가 빠르다 .

• 메모리에 저장된 값을 여러번 이동 할 필요 없이 , 한번의 덧셈이나 뺄셈으로 가능하기 때문 .

• 연속된 표현의 경우 개선방법은 ?• 리스트의 맨뒤에서 일정 범위내로 추가 / 삭제가 빈번하다면 , 예상 크기보다 리스트를

20%~30% 크게 잡아준다 .• C++ std::vector 가 이 방식을 취함 .

• 왜 크기가 넘어가면 성능이 많이 떨어질까 ?• OS 한테 좀더 큰 방을 찾아줘 라고 요구하게되면 , OS 는 남은 연속된 메모리를 찾아야된다 . 또 , 새로 만들어진 공간으로 사람들이 모두 입주를 해야됨 .

Page 20: 리스트

번외 – 못다한 이야기• 그럼 OS 가 연속된 공간은 찾지 못했다면 ?• 요즘 OS 는 똑똑하다 . 메모리를 4KB 단위로 쪼개서 사용하기 때문에 상관없다 . 그리고 가상 메모리 있잖아 ?

• 연결된 표현의 성능 개선법 ?• 뒤에만 연결하는게 아니라 앞뒤로 연결해버린다 . 맨뒤는 앞이랑 , 맨앞은 앞이랑…

Begin End….

Page 21: 리스트

번외 – 못다한 이야기• 연결된 표현의 응용 .

• 사실 연결된 표현은 트리라던가 그래프 이런곳에서 응용이됨 .• 또한 , 저런 자료구조는 엄청 많은 데이터를 저장하기에 적합한 자료구조들이라 연결된 표현으로 인한 성능저하는 미미함 .• 데이터가 일정 크기를 넘어가면 캐시 적중률은 엄청 떨어진다 .

• 선형 메모리 공간에서의 연결된 표현 ?• 연결된 표현은 C 에서의 포인터로 나타낼 수 있다 .

• 리스트가 자료구조의 끝판왕 ?• 아니다 . 그냥 구현이 쉽고 , 탐색 구현도 쉬워서 .• 대신 효율이 죽어나게 떨어지지…

Page 22: 리스트

번외 – 못다한 이야기• 연결된 표현의 또 다른 문제점 .• 시스템 메모리가 몇기가씩하는 요즘은 그나마 덜하지만 , 물리 메모리에서는 연속되지 않지만 , 자잘한 데이터때문에 메모리 단편화가 발생• 마치 하드디스크를 오래쓰면 조각나서 조각모음을 돌려야 되는것처럼 .• 그렇다고 OS 가 시스템 메모리를 대상으로 조각모음을 하진 않음 .