490 likes | 765 Views
문병로 교수님 강의자료를 많이 인용하였습니다. Data Structure. S amsung C onvergence S oftware C ourse 방학 특강 2014. 6. 23 ( 월 ). 들어가기 전에. 단대가 다들 어떻게 되시나요 ? 인문대 / 사회대 / 경영대 / 자연대 / 공대 프로그래밍 , 얼마나 아시나요 ? 프로그래밍 해본 적 있다 / 없다 어떤 언어 ? 객체 지향 프로그래밍 / 자료 구조에 대해 아시나요 ? 객체 지향 프로그래밍에 대해 안다 / 모른다
E N D
문병로 교수님 강의자료를 많이 인용하였습니다. Data Structure Samsung Convergence Software Course 방학 특강 2014. 6. 23 (월)
들어가기 전에 • 단대가 다들 어떻게 되시나요? • 인문대/사회대/경영대/자연대/공대 • 프로그래밍, 얼마나 아시나요? • 프로그래밍 해본 적 있다/없다 • 어떤 언어? • 객체 지향 프로그래밍 / 자료 구조에 대해 아시나요? • 객체 지향 프로그래밍에 대해 안다/모른다 • Linked List, Stack, Queue, Tree에 대해 안다/모른다
저는… • 서울대학교 컴퓨터공학부 • 지능형 데이터 시스템 연구실 석박통합과정 • 데이터 마이닝, 추천, 텍스트 데이터 분석, 빅데이터 병렬 처리, 등등 • Interested in… • 사용자들이 남겨놓은 다양한 데이터들(SNS/리뷰 등 텍스트 기록, 상품구매 기록, 웹 서핑 기록, TV 시청 기록, 장소 체크인 기록, 등) • 이를 활용하여 사용자의 Preference를 예측하여 사용자들에게 다양한 Contents / Item / Service들을 추천하는 연구 • 이한빛, skcheon@europa.snu.ac.kr
저는… • 서울대학교 컴퓨터공학부 • 지능형 데이터 시스템 연구실 석박통합과정 • 데이터마이닝, 추천, 텍스트 데이터 분석, 빅데이터 병렬 처리, 등등 • Interested in… • 사용자들이 남겨놓은 다양한 데이터들(SNS/리뷰 등 텍스트 기록, 상품구매 기록, 웹 서핑 기록, TV 시청 기록, 장소 체크인 기록, 등) • 이를 활용하여 사용자의 Preference를 예측하여 사용자들에게 다양한 Contents / Item / Service들을 추천하는 연구 • 이한빛, skcheon@europa.snu.ac.kr
데이터, Data • 46 • 18.4 • “정도전” • true/false • “조재현”, “유동근”, “박영규” intcurr_ep_num = 46; double ratings = 18.4; String title = “정도전”; booleanlive_yn = true; String[ ] cast = {“조재현”, “유동근”, “박영규”}; 조금 더 높은 추상 단계의 데이터? 예를 들어, TV_Program?
데이터, Data • TV_program? • 정도전, 너포위, 마녀사냥, 아빠어디가, … • TV_program이 공통적으로 가지는 정보? 속성? • 프로그램이름, 방영시간, 장르, 출연진, 시청률, … • 이 정보/속성들을 이용해 할 수 있는 기능? • 방영시간 변경, 출연진 리스트 가져오기, …
데이터 구조, Data Structure • 앞에서 말한 개념적인 데이터를 담는 구체적인 구현. • Object-Oriented Programming (객체 지향 프로그래밍) • Abstraction (추상화)
Java의 경우에는… ClassTV_program { Stringpg_title; intpg_duration; String genre; double rating; public StringgetPg_title() { returnthis.pg_title; } public voidsetPg_title(Stringnew_title) { this.pg_title = new_title; } … } field method
객체 지향 프로그래밍, Object-oriented Programming TV Program 정도전 왕좌의 게임 마녀사냥 슈퍼맨이 돌아왔다
객체 지향 프로그래밍, Object-oriented Programming ClassTV_program { Stringpg_title; intpg_duration; String genre; double rating; public StringgetPg_title() { returnthis.pg_title; } public voidsetPg_title(Stringnew_title) { this.pg_title = new_title; } … } 개념(Concept) TV_program정도전= newTV_program( ); 객체(Object)
객체 지향 프로그래밍, Object-oriented Programming ClassTV_program { Stringpg_title; intpg_duration; String genre; double rating; public StringgetPg_title() { returnthis.pg_title; } public voidsetPg_title(Stringnew_title) { this.pg_title = new_title; } … } 개념(Concept) TV_program왕좌의게임= newTV_program( ) 객체(Object)
객체 지향 프로그래밍, Object-oriented Programming ClassTV_program { Stringpg_title; intpg_duration; String genre; double rating; public StringgetPg_title() { returnthis.pg_title; } public voidsetPg_title(Stringnew_title) { this.pg_title = new_title; } … } 개념(Concept) TV_program마녀사냥= newTV_program( ) 객체(Object)
객체만 만들면… TV_program정도전 = new TV_program( ); 정도전.setPg_name(“대하드라마,정도전”); 정도전.setPg_duration(1); 정도전.setGenre(“drama”); 정도전.setRating(18.4); TV_program정도전 = new TV_program(“정도전”, 1, “drama”, 18.4);
다시, 클래스 • 필드, field • 생성자, constructor • 메쏘드, method • Getter/Setter : 모든 필드 변수들에 대해 보통 구현됨 • 이외의 method들
Getter/setter public StringgetPg_title() { returnthis.pg_title; } public voidsetPg_title(Stringnew_title) { this.pg_title = new_title; } … (also for pg_duration, genre, rating) public doubleratingToPercent( ) { return (this.rating * 100); } } field ClassTV_program{ Stringpg_title; intpg_duration; Stringgenre; doublerating; TV_program( ) { this.pg_title = null; this.pg_duration = 1; this.genre = null; this.rating = 0.0; } TV_program( String title, intdur, String genre, double rating) { this.pg_title = title; this.pg_duration = dur; this.genre = genre; this.rating = rating; } constructor Other method
사용자 정의 데이터 타입 ClassEPG_schedule { int year; int month; intday; Stringdayofweek; TV_program[ ]program_list; … } ClassTV_program { Stringpg_title; intpg_duration; String genre; double rating; public StringgetPg_title() { returnthis.pg_title; } public voidsetPg_title(Stringnew_title) { this.pg_title = new_title; } … }
Java의 OOP적 기능들 • 상속, inheritance • 부모클래스와 자식클래스. 자식클래스는 부모클래스의 것들을 상속받아 재정의하지않고 사용하면서 자신만의 새로운 것들을 정의하여 사용 가능. • 오버로딩, overloading • 하나의 이름으로 된 함수들을 여러 타입의 파라미터들에대해 사용 가능. • 인터페이스, interface • 구현하는 함수들의 이름, 입력, 출력 형태만 적어놓고 이 인터페이스를 구현하는 클래스를 따로 두어 실제 구현을 함으로써 안의 구현을 몰라도 사용가능하도록캡슐화. • 등등 • 자세한 설명은 생략한다.
대표적인 데이터 구조 • Linked List, Stack, Tree, … • 데이터를 어떤 형태의 구조로 담을 것인가?
클래스로 정의하는 법만 잘 알면 된다. • 클래스의 필드, 메쏘드만 잘 정의할 수 있으면, Java에서 어떤 데이터 구조든 자기 입맛에 맞는 데이터 구조를 정의하여 사용이 가능하다. • 나중에 알게 될 진실.
Figure 5.1 a) A linked list of integers; b) insertion; c) deletion
Linked List • Each node contains • Data (item) • Link number, string, object, …
A naïve structure public class IntegerNode { public int item; public IntegerNode next; } • Not good information hiding • Not good data abstraction Example: IntegerNode n1 = new IntegerNode( ); IntegerNode n2 = new IntegerNode( ); n1.item = 5; n2.item = 9; n1.next = n2;
An Intermediate Version Example: IntegerNode n1 = new IntegerNode( ); IntegerNode n2 = new IntegerNode( ); n1.setItem(5); n2.setItem(9); n1.setNext(n2); public class IntegerNode { private int item; private IntegerNode next; public void setItem(int newItem) { item = newItem; } public int getItem( ) { return item; } public void setNext(IntegerNode nextNode) { next = nextNode; } public IntegerNode getNext( ) { return next; } }
Example: IntegerNode n1 = new IntegerNode(5, new IntegerNode(9)); AnImproved Version public class IntegerNode { private int item; private IntegerNode next; // constructors publicIntegerNode(int newItem) { item = newItem; next = null; } publicIntegerNode(int newItem, IntegerNode nextNode) { item = newItem; next = nextNode; } // setItem, getItem, setNext, getNext as before … } Example: IntegerNode n2 = new IntegerNode(9); IntegerNode n1 = new IntegerNode(5, n2);
Head Node • Linked lists usually have a head reference Node head = null; Node head = new Node(new Integer(5)); • Here, head is a simplereference variable
Displaying the Contents • Sequential display of the contents of the linked list referenced by head for (Node curr = head; curr != null; curr = curr.getNext( )) { System.out.println(curr.getItem( )); }
Deleting a Specified Node • Removing the node referencedby variable curr • The previous node of curr is referenced by prev prev.setNext(curr.getNext( )); In C,prev->next = curr->next; • Removing the 1st node head = curr.getNext( );
Inserting a Node In C, newNode = malloc(sizeof Node); newNode->item = 30; newNode->next = curr; prev.next = newNode; • Inserting a node between prevand curr newNode = new Node(new Integer(30)); newNode.setNext(curr); prev.setNext(newNode);
Stack • 도입을 위한 예 • “←” in keyboard input line • E.g., abcd←←efgh←←←ij←km← • abeik • 한 character를 읽어 ‘←’ 이 아니면 저장하고 ‘←’ 이면 최근에 저장된 character를 제거한다.
A Stack Example 최근에 쌓은 접시를 꺼낸다 Stack of cafeteria dishes
Stack Implementation public interfaceStackInterface { publicbooleanisEmpty( ); public void push(Object newItem); public Object pop( ); public voidpopAll ( ); public Object peek( ); }
Items[ ] top –1 0 1 2 3 4 … MAX_STACK–1 Array-Based Implementation public class StackArrayBased implements StackInterface { final int MAX_STACK = 50; private Object items[ ]; private int top; // index for stack top public StackArrayBased( ) { items = new Object[MAX_STACK]; top = –1; }
publicboolean isEmpty( ) { return (top < 0); } public boolean isFull ( ) { return (top == MAX_STACK–1); } public void push(Object newItem) { if (!isFull( )) items[++top] = newItem; else {exception 처리} }
publicObjectpop( ) { if (!isEmpty( )) return items[top--]; else {exception 처리} } public void popAll( ) { items = new Object[MAX_STACK]; top = –1; } public Object peek( ) { if (!isEmpty( )) return items[top]; else {exception 처리} } } // end class StackArrayBased
Reference-Based Implementation public class StackReferenceBased implements StackInterface{ private Node top; public StackReferenceBased( ) { top = null; }
5 publicboolean isEmpty( ) { return (top == null); } public void push(Object newItem) { top = new Node(newItem, top); } public Object pop( ) { if (!isEmpty( )) { Node temp = top; top = top.getNext( ); return temp.getItem( ); } else {exception 처리} }
public voidpopAll ( ) { top = null; } public Object peek( ) { if (!isEmpty( )) returntop.getItem( ); else {exception 처리} } } // end class StackReferenceBased
A family tree An organization chart
newItem newItem right left Reference-Based Implementation of Binary Tree public classTreeNode{ private Object item; privateTreeNodeleftChild; privateTreeNoderightChild; publicTreeNode(Object newItem) { item = newItem; leftChild = rightChild = null; } publicTreeNode(Object newItem, TreeNode left, TreeNode right) { item = newItem; leftChild = left; rightChild = right; }
• left public Object getItem( ) { return item; } publicvoidsetItem(Object newItem) { item = newItem; } publicTreeNodegetLeft( ) { returnleftChild; } public TreeNodegetRight( ) { returnrightChild; } publicsetLeft(TreeNode left) { leftChild = left; } publicsetRight(TreeNode right) { rightChild = right; } } // end TreeNode
Search in a Binary Search Tree search(root, searchKey) { if (root is empty) return “Not found!”; else if (searchKey == root’s key) returnroot; else if (searchKey < root’s key) returnsearch(root’s left child, searchKey); else returnsearch(root’s right child, searchKey); }
Insertion in a Binary Search Tree insert (root, newItem) { if (root is null) { newItem을 key로 가진 새 node를 매단다; } else if (newItem < root’s key) insert(root’s left child, newItem); else insert(root’s right child, newItem); }
사실 이 모든 것은 Java에 모두 아주 잘 구현이 되어 있습니다. • 컴퓨터 공학에서 자료구조를 배우는 이유: Object-Oriented Programming을 배우기에 가장 좋은 주제. • 사실 이론이 아닌 실제 구현을 해보는 것이 목적. • Java구현에 대해 조금이나마 아셨기를 바라며!