List ADTs BY PANTHAREE S. Abstract Data Types (ADTs) เป็ นชนิ ดข้อมูลที่สร้างขึ้นโดยผูเ้ ขียนโปรแกรม (user defined data type) สร้างโดยใช้ structure ที่มีในภาษา imperative เพื่อให้ชนิ ดข้อมูลนี้ ใช้งานได้อย่างปลอดภัย ควรมีลกั ษณะ รายละเอียดของการเก็บข้อมูลต้องไม่มีความสาคัญต่อการใช้งานชนิ ดข้อมูล ข้อมูลภายในจะไม่ถก ู อ้างถึงได้โดยตรง แต่ผา่ นทาง operations ที่กาหนดไว้ Build-in type ก็คือ ADTs นัน ่ เอง Abstract Data Types (ADTs) ภาษาที่สร้าง ADT ได้ตอ้ งมีกลไก 2 อย่าง คือ Encapsulation เพื่อนาข้อมูลกับ operations มาผูกติดกันเป็ นหน่ วยหนึ่ ง Information hiding เพื่อกาหนดขอบเขตในการอ้างถึงข้อมูลหรื อ operations ของชนิ ด ข้อมูลหนึ่ง ๆ ข้อดี ง่ายต่อการจัดการโครงสร้างของโปรแกรม แก้ไขเปลี่ยนแปลงได้สะดวก คอมไพล์แยกส่ วนได้ สามารถเปลี่ยนการแทนข้อมูลได้ โดยไม่มีผลกระทบต่อผูใ้ ช้ Reliability โดยการซ่ อนการแทนข้อมูล ผูใ้ ช้ไม่สามารถเข้าถึงข้อมูลในวัตถุได้โดยตรง The List ADT General List of form A1 , A2 , A3 , . . . , AN (Size = N) Null List the special list of Size=0 Opreation on collection and List PrintList MakeEmpty Find : return the position of the first occurrence of a key Insert : insert a key into a list Delete : delete a key in a list FindKth : return the element in some position Example If the list is 34 , 12 , 52 , 16 , 12 Find(52) return 3 Insert(X,3) insert after 3 34 , 12 , 52 , X , 16 , 12 insert before 3 34 , 12 , X , 52 , 16 , 12 Delete(3) 34 , 12 , 52 , X , 16 , 12 34 , 12 , X , 16 , 12 Next Previous Simple Array Implementation of Lists Using for loop to implement PrintList Return array element address to implement FindKth Insert and Delete are expensive Insert shift all element after the position down Delete shift all element after the position up Running time of insertion and deletion is slow and the list size must be know in advance Simple arrays are generally used to implement lists Linked Lists Improve the linear cost of insertion and deletion The list is not stored contiguously A1 A1 A2 800 1000 A2 800 712 A3 712 A5 A4 A3 992 A4 692 992 A5 692 O Deletion from a Linked List Delete command can be executed in one pointer change A1 A2 A3 A4 A5 Insertion into a linked list Insert command require obtaining a new cell from the system by using a new cell and the executing two pointer maneuvers. A1 A2 A3 3 X 1 2 A4 A5 Doubly Linked Lists It is convenient to traverse lists backward. Memory overhead A1 A2 × A3 A4 A5 √ Circularly Linked Lists To have the last cell keep a pointer back to the first. A1 A2 A3 A4 A5 Index ที่เป็ นไปได้ ของ add(index,e) คือ ? ตั้งแต่ 0 จนถึง size +1 ตั้งแต่ 0 จนถึง size ตั้งแต่ 0 จนถึง size – 1 เป็ นจานวนไม่ติดลบ Index ที่สง่ ให้ remove มีคา่ เท่าใดได้ บ้าง ? ตั้งแต่ 0 จนถึง size ตั้งแต่ 0 จนถึง size – 1 ตั้งแต่ 0 จนถึง size +1 เป็ นจานวนไม่ติดลบ indexOf(e) ไว้ ทาอะไร ? ค้นว่า e มีในรายการหรื อไม่ ค้นว่าที่ตาแหน่ง e เก็บอะไร ค้นว่า e เก็บที่ใดในรายการ ย้าย e ไปไว้ทา้ ยรายการ ถ้ ารายการเก็บ e ไว้ หลายตัว indexOf(e) คืนอะไร ? คืนตาแหน่งทางซ้ายสุ ดที่พบ e คืนตาแหน่งทางขวาสุ ดที่พบ e คืนตาแหน่งใดก็ได้ที่พบ e คืนทุกตาแหน่งที่พบ e Singly Linked List : Method ใดใช้ เวลา O(n) size() isEmpty() add(e) add(i,e) remove(e) set(i,e) get(i) Circulary Linked List จะเขียน Code เพื่อทา Method ทางซ้ ายอย่างไร ? …..removeFirst() A. header.next == header …..removeLast() B. removeNode(header.prev) …..addFirst() C. removeNode(header.next) …..addLast() D. removeNode(header) …..isEmpty() E. addBefore(header.next) F. addBefore(header.prev) G. addBefore(header)