Data Structures<br />  원저자: timmac<br />  발표자: 심준현<br />
목   차<br /><ul><li>효율적인 자료구조의 필요성
 Simple Data Structures
 Arrays
(Doubly) Linked Lists
Queues
Stacks
Trees
Binary Trees
Priority Queues
Hash Tables</li></li></ul><li>효율적인 자료구조의 필요성<br />VS<br />비효율적인 자료구조 -> 높은 Overhead -> 성능 저하<br />문제 상황에 적합한 자료구조를 선택하는 것이...
Simple Data Structures<br /><ul><li>흔히 우리가 ‘변수’라고 부르는 것들
 char, int, float, double, 각종 포인터, etc.
복잡한 자료구조의 element로서 사용</li></ul>(C: typedef, C++: template, Java: generic)<br />
Arrays<br /><ul><li>같은 Type의 데이터들을 연속된 메모리 공간에 저장한 것
자체적으로 행렬, 벡터의 의미를 가짐
장점: Random Access가 가능
단점: 할당 시 크기가 고정됨</li></ul>원소 추가/삭제 시 번거로움<br />
(Doubly) Linked Lists<br /><ul><li> [자료형+포인터], [포인터+자료형+포인터]
가장 보편적으로 사용되는 자료구조 중 하나</li></ul> (Stack, Queue 등의 자료구조 구현에 사용)<br />
(Doubly) Linked Lists<br /><ul><li>장점: 물리적 연속성에 따른 제약이 없음</li></ul>-> Insert, Delete 시 Complexity가 O(1)로 고정<br /><ul><li>단...
(Doubly) Linked Lists<br /><ul><li>변형</li></ul>Skip List<br />XOR-Linked List<br /><ul><li>그밖에 Hash Linking, Sentinel Node...
Queues<br /><ul><li>FIFO: ‘먼저 들어온 것이 먼저 나간다’
은행의 메커니즘과 유사</li></ul>번호표를 뽑는다: 맨 뒤에 삽입 (Enqueue)<br />업무를 처리한다: 맨 앞에서부터 추출 (Dequeue)<br />
Queues<br /><ul><li>그래프의 BFS(너비 우선 탐색)에 사용됨</li></ul>-> TopCoder문제에서 가장 흔히 사용되는 케이스<br /><ul><li> “최단 거리”, “최소한의 움직임”등이 요구...
 Java API, .NET Framework 등 대부분의 표준 라이브러리에서 제공
대회에서 자주 출제되는 문제 유형!</li></li></ul><li>Queues<br /><ul><li>예제: 50x50 그리드에서 최단경로 찾기
 State 노드에xy좌표, 움직인 횟수를 기록
노드단위로 Enqueue/Dequeue
한번에 Queue에 들어갈 수 있는 노드 수의 최대값 < 50 x 50 = 2500</li></li></ul><li>Queues<br />State 노드<br />배열 기반 Queue<br />Enqueue<br />D...
Queues<br /><ul><li>메인 코드</li></li></ul><li>Stacks<br /><ul><li> Queue와 반대되는 개념의 자료구조
 LIFO: ‘마지막에 들어온 것이 먼저 나간다’
시스템 자체에서 Stack을 사용</li></ul> 서브루틴 종료 시 리턴 주소가 ‘pop’되는 구조 <br />-> Nested Call이 가능<br /><ul><li> DFS(깊이 우선 탐색)에 사용</li></ul...
Stacks<br />1       2       3<br />4       5<br />6       7<br />
Stacks<br />1       2       3<br />4       5<br />8       9<br />
Upcoming SlideShare
Loading in...5
×

Data Structures

736

Published on

2011/1/4 NPC seminar slide

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
736
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Data Structures"

  1. 1. Data Structures<br /> 원저자: timmac<br /> 발표자: 심준현<br />
  2. 2. 목 차<br /><ul><li>효율적인 자료구조의 필요성
  3. 3. Simple Data Structures
  4. 4. Arrays
  5. 5. (Doubly) Linked Lists
  6. 6. Queues
  7. 7. Stacks
  8. 8. Trees
  9. 9. Binary Trees
  10. 10. Priority Queues
  11. 11. Hash Tables</li></li></ul><li>효율적인 자료구조의 필요성<br />VS<br />비효율적인 자료구조 -> 높은 Overhead -> 성능 저하<br />문제 상황에 적합한 자료구조를 선택하는 것이 중요!<br />
  12. 12. Simple Data Structures<br /><ul><li>흔히 우리가 ‘변수’라고 부르는 것들
  13. 13. char, int, float, double, 각종 포인터, etc.
  14. 14. 복잡한 자료구조의 element로서 사용</li></ul>(C: typedef, C++: template, Java: generic)<br />
  15. 15. Arrays<br /><ul><li>같은 Type의 데이터들을 연속된 메모리 공간에 저장한 것
  16. 16. 자체적으로 행렬, 벡터의 의미를 가짐
  17. 17. 장점: Random Access가 가능
  18. 18. 단점: 할당 시 크기가 고정됨</li></ul>원소 추가/삭제 시 번거로움<br />
  19. 19. (Doubly) Linked Lists<br /><ul><li> [자료형+포인터], [포인터+자료형+포인터]
  20. 20. 가장 보편적으로 사용되는 자료구조 중 하나</li></ul> (Stack, Queue 등의 자료구조 구현에 사용)<br />
  21. 21. (Doubly) Linked Lists<br /><ul><li>장점: 물리적 연속성에 따른 제약이 없음</li></ul>-> Insert, Delete 시 Complexity가 O(1)로 고정<br /><ul><li>단점: Random Access가 불가능</li></ul>-> Search 시 항상 O(n)의 Complexity 발생<br /><ul><li> 보완책: Move-To-Front Heuristic,</li></ul> (Temporal Locality를 이용)<br /> Node Indexing<br />
  22. 22. (Doubly) Linked Lists<br /><ul><li>변형</li></ul>Skip List<br />XOR-Linked List<br /><ul><li>그밖에 Hash Linking, Sentinel Nodes 등 </li></ul>다양한 기법이 사용됨<br />
  23. 23. Queues<br /><ul><li>FIFO: ‘먼저 들어온 것이 먼저 나간다’
  24. 24. 은행의 메커니즘과 유사</li></ul>번호표를 뽑는다: 맨 뒤에 삽입 (Enqueue)<br />업무를 처리한다: 맨 앞에서부터 추출 (Dequeue)<br />
  25. 25. Queues<br /><ul><li>그래프의 BFS(너비 우선 탐색)에 사용됨</li></ul>-> TopCoder문제에서 가장 흔히 사용되는 케이스<br /><ul><li> “최단 거리”, “최소한의 움직임”등이 요구되는 문제에 사용하기 적합
  26. 26. Java API, .NET Framework 등 대부분의 표준 라이브러리에서 제공
  27. 27. 대회에서 자주 출제되는 문제 유형!</li></li></ul><li>Queues<br /><ul><li>예제: 50x50 그리드에서 최단경로 찾기
  28. 28. State 노드에xy좌표, 움직인 횟수를 기록
  29. 29. 노드단위로 Enqueue/Dequeue
  30. 30. 한번에 Queue에 들어갈 수 있는 노드 수의 최대값 < 50 x 50 = 2500</li></li></ul><li>Queues<br />State 노드<br />배열 기반 Queue<br />Enqueue<br />Dequeue<br />IsNotEmpty함수<br />
  31. 31. Queues<br /><ul><li>메인 코드</li></li></ul><li>Stacks<br /><ul><li> Queue와 반대되는 개념의 자료구조
  32. 32. LIFO: ‘마지막에 들어온 것이 먼저 나간다’
  33. 33. 시스템 자체에서 Stack을 사용</li></ul> 서브루틴 종료 시 리턴 주소가 ‘pop’되는 구조 <br />-> Nested Call이 가능<br /><ul><li> DFS(깊이 우선 탐색)에 사용</li></ul> (트리 순회, XML 문서의 특정 노드 탐색 등)<br /><ul><li> ‘백트래킹’이 가능</li></li></ul><li>Stacks<br />1 2 3<br />4 5<br />6 7<br />
  34. 34. Stacks<br />1 2 3<br />4 5<br />6 7<br />
  35. 35. Stacks<br />1 2 3<br />4 5<br />8 9<br />
  36. 36. Stacks<br />1 2 3<br />4 5<br />8 9<br />
  37. 37. Stacks<br />1 2 3<br />4 5<br />
  38. 38. Stacks<br />1 2 3<br />
  39. 39. Stacks<br />1 2 3<br />
  40. 40. Stacks<br /><ul><li>프로그래밍 예제: Soma (SRM 198)</li></ul>1 1 1 1 1 1 0 1 1<br />1 0 0 0 1 0 1 1 0<br />1 1 0 2 2 0 1 2<br />1 0 1 1 1 1 0 1<br /><ul><li>위의 조각들을 사용해서 총 27개의 Cube로 구성된 모양을 만드는 방법의 수</li></ul>(단, 조각의 대칭성을 이용한 경우는 Count 시 제외)<br />
  41. 41. Stacks<br /><ul><li>실행 결과 예시</li></ul>1. 정육면체<br />{"333", <br /> "333", <br />"333"} <br />Returns: 11520<br />2. 크리스탈<br />{"345", <br /> "234", <br />"123"} <br />Returns: 2800<br />3. 탑<br />{"67", <br />"77"} <br />Returns: 1520<br />4. 교수대<br />{"020", <br /> "010", <br />"010", <br />"020", <br />"343", <br />"353"} <br />Returns: 42<br />
  42. 42. Trees<br /><ul><li>하나 이상의 데이터 노드로 이루어진 자료구조
  43. 43. Root와 Child로 구성
  44. 44. 대표적인 예: XML 등 태그 기반 언어</li></ul>글쓰기 개요(Outline), 파일 시스템<br /><quiz><br /><question><br /><answer><br />
  45. 45. Trees<br /><ul><li>프로그래밍 예제: Permission Tree (SRM 218)
  46. 46. folders라는 String 배열의 원소에 다음을 저장:</li></ul> “[상위폴더번호] [접근허가자1],[접근허가자2]…”<br /><ul><li>예시</li></ul>folders = {“0 Admin”,<br /> “0 Joe,Phil”,<br /> “0 Joe” }<br />0 (Admin)<br />1 (Joe, Phil)<br />2 (Joe)<br />
  47. 47. Trees<br />1) Admin은 폴더번호 0, 부모 번호 0이므로 당연히 홈 폴더가 0<br />2) Phil은 1만 접근 가능하므로 홈 폴더가 1<br />3) Joe는 1, 2에 모두 접근 가능하므로 홈 폴더가 0<br />0 (Admin)<br />1 (Joe, Phil)<br />2 (Joe)<br /><ul><li>사용자 입력: {“Admin”, “Joe”, “Phil”}
  48. 48. 이 때사용자 각각의 Home Folder 번호를 리턴</li></ul> (접근 권한이 없을 경우 -1을 리턴)<br /><ul><li>결과: { 0, 0, 1 }</li></li></ul><li>Trees<br />상위 폴더가 반드시 먼저 나와야 할 필요는 없음을 보여주는 사례<br /><ul><li> More Examples</li></ul>Example 1)<br />{"0 Admin", <br />"0 Bob,Joe,Bob", <br />"0 Joe"} <br />{"Joe", "Bob"} <br />Returns: { 0, 1 }<br />Example 2)<br />{"0 Admin"} <br />{"Peter", "Paul", Mary"} <br />Returns: { -1, -1, -1 }<br />Example 3)<br />{"0 Admin", <br />"2 John", <br />"0 Peter,John", <br />"0 Tim", "1 John"} <br />{"John"} <br />Returns: { 2 }<br />한 폴더 내에서 이름이 반복될 수 있음을 보여주는 사례<br />
  49. 49. Binary Trees<br /><ul><li>한 노드에 최대 2개의 Child만을 갖는 트리구조
  50. 50. 왼쪽 노드의Key 값이 부모 노드보다 작고</li></ul>오른쪽 노드의Key 값은 부모 노드보다 크다<br /><ul><li>단순대소비교로 순회 가능</li></ul>-> 배열에 비해 검색, Insertion 성능이 우수<br />
  51. 51. Priority Queues<br /><ul><li> BFS로 돌아와서…
  52. 52. 최소 움직임 -> 최소 시간
  53. 53. 아래로 이동– 2분 </li></ul>오른쪽으로 이동 – 3분<br />왼쪽으로 이동 – 5분 … How?<br /><ul><li>순서가 아닌 다른 값을 기준으로 할 때 – Priority Queue</li></li></ul><li>Priority Queues<br /><ul><li>실생활의 예: 일반 승객과 VIP 승객
  54. 54. 구현: Max-heap 또는 Min-heap</li></ul> (루트의 값이 항상 트리의 최대/최소값)<br /><ul><li>장점
  55. 55. 배열로 간단히 구현할 수 있음</li></ul>(0이 Root, k+1, k+2가 k의 <br /> Child 노드)<br /><ul><li> 좌우 깊이 차이가 1 이하</li></ul> (Complete Tree)<br />
  56. 56. Priority Queues<br /><ul><li>추출</li></ul> 1) 루트 노드 제거<br /> 2) 가장 오른쪽 하단 노드를 루트 노드로 지정<br /> 3) 왼쪽 Child와 비교-Swap을 반복<br /><ul><li>삽입</li></ul> 1) 다음 Leaf 노드에 추가<br /> 2) 부모 노드와 비교-Swap을 반복<br />Binary Min-heap<br />
  57. 57. Hash Tables<br /><ul><li>데이터를 조작하여 생성한 Key 값으로 분류
  58. 58. 일반적인 Hash 함수: 상/하위 n bits, mod 연산 값
  59. 59. 실생활의 예: 사전, 도서분류번호 등
  60. 60. Hash Bucket – 같은 Key를 갖는 데이터의 집합
  61. 61. Bucket 당 데이터 수가 균일할수록 우수</li></li></ul><li>Hash Tables<br /><ul><li>문제에서 사용되는 경우</li></ul> 1) 주 이름 – CA -> California, 충남 -> 충청남도<br /> 2) LongPipe문제<br />일정 길이의 파이프를 38개의 서로 다른 파이프를 연결하여 만들 때 필요한 파이프의 최소 개수<br /> (Continued)<br />
  62. 62. Hash Tables<br /><ul><li>LongPipe문제 해결 순서</li></ul> 1) 파이프를 19개씩 두 그룹으로 분류<br /> 2) 각 그룹 내에서 만들어낼 수 있는 <br />모든 (파이프개수,길이)의 조합을 계산<br /> 3) 특정 길이에 대한 최소 파이프개수를 연결하는 <br /> Hash Table 생성<br /> 4) 그룹 1의 개수와 (총 길이-그룹1의 길이)를 갖는 그룹 2의 파이프 개수를 Matching하여 최소값 계산<br />
  63. 63. Conclusion<br /><ul><li>자료구조는 숙련된 프로그래머가 반드시 갖추어야 할 도구
  64. 64. 대부분의 언어에서 표준 라이브러리를 통해 제공됨</li></ul>-> 잘 쓰기만 하면 된다!<br /><ul><li>문제는 언제, 무엇을, 어떻게?
  65. 65. 자료구조에 대한 이해를 바탕으로 응용이 가능</li>

×