งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

แถวคอย (Queue). © S. Prasitjutrakul 200614/07/57 2 หัวข้อ  นิยามแถวคอย และอินเตอร์เฟส Queue  การสร้างแถวคอยด้วยอาเรย์  ตัวอย่างการใช้งานแถวคอย  ที่พักข้อมูล.

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "แถวคอย (Queue). © S. Prasitjutrakul 200614/07/57 2 หัวข้อ  นิยามแถวคอย และอินเตอร์เฟส Queue  การสร้างแถวคอยด้วยอาเรย์  ตัวอย่างการใช้งานแถวคอย  ที่พักข้อมูล."— ใบสำเนางานนำเสนอ:

1 แถวคอย (Queue)

2 © S. Prasitjutrakul /07/57 2 หัวข้อ  นิยามแถวคอย และอินเตอร์เฟส Queue  การสร้างแถวคอยด้วยอาเรย์  ตัวอย่างการใช้งานแถวคอย  ที่พักข้อมูล  การเรียงลำดับแบบฐาน  การค้นคำตอบตามแนวกว้าง  การหาวิถีสั้นสุด

3 © S. Prasitjutrakul /07/57 3 การเพิ่ม/ลบข้อมูลในแถวคอย ข้อมูล เข้าก่อน ออกก่อน (First-In First-Out)ข้อมูล เข้าก่อน ออกก่อน (First-In First-Out) ACBAX enqueue dequeue

4 © S. Prasitjutrakul /07/57 4 แถวคอย : Queue public interface Queue { public boolean isEmpty(); public int size(); public void enqueue(Object e); public Object peek(); public Object dequeue(); } A B C * * D E * * *ABC**DE*** ABCDE

5 © S. Prasitjutrakul /07/57 5 Queue คล้าย List Queue คือ list ที่เราเพิ่มปลายด้านหนึ่ง และลบที่ปลายอีกด้านQueue คือ list ที่เราเพิ่มปลายด้านหนึ่ง และลบที่ปลายอีกด้าน สร้าง queue ด้วย list แบบง่าย ๆสร้าง queue ด้วย list แบบง่าย ๆ public class ArrayListQueue implements Queue { private List list = new ArrayList(10); public boolean isEmpty() {return list.isEmpty();} public int size() {return list.size();} public void enqueue(Object e) {list.add(e);} public Object peek() { if (isEmpty()) throw new NoSuchElementException(); return list.get(0); } public Object dequeue() { Object e = peek(); list.remove(0); return e; } } enqueue เพิ่มท้าย list ใช้เวลา O(1) แต่ dequeue ลบหัว list ใช้เวลา O(n)

6 © S. Prasitjutrakul /07/57 6 ArrayQueue : สร้าง Queue ด้วยอาเรย์ เพิ่มที่ท้ายคิว ลบที่หัวคิวเพิ่มที่ท้ายคิว ลบที่หัวคิว ให้หัวคิวอยู่ที่ index 0 เสมอให้หัวคิวอยู่ที่ index 0 เสมอ ตอนลบต้องใช้เวลา  (n)ตอนลบต้องใช้เวลา  (n) elementDatasizeQueue q; A3BC q.enqueue("C"); B2C q.dequeue(); (n)(n) (n)(n) A2B q.enqueue("B"); A1 q.enqueue("A"); 0 q = new ArrayQueue(4);

7 © S. Prasitjutrakul /07/57 7 ArrayQueue : ตำแหน่งหัวคิวเปลี่ยนได้ จำ index ของหัวคิวจำ index ของหัวคิว ลบ : อย่าย้ายข้อมูล แต่ใช้วิธีการเลื่อนตำแหน่งหัวคิวลบ : อย่าย้ายข้อมูล แต่ใช้วิธีการเลื่อนตำแหน่งหัวคิว  (1) elementDatasizeQueue q;front A3BC q.enqueue("C"); 02BC q.dequeue(); 11C 2A2B q.enqueue("B"); 0

8 © S. Prasitjutrakul /07/57 8 ArrayQueue public class ArrayQueue implements Queue { private Object[] elementData; private int size; private int front; public ArrayQueue(int cap) { elementData = new Object[cap]; size = front = 0; } public boolean isEmpty() { return size == 0; } public int size() { return size; }...

9 © S. Prasitjutrakul /07/57 9 public class ArrayQueue implements Queue { private Object[] elementData; private int size; private int front;... public void enqueue(Object e) { //... ขยายอาเรย์ ถ้าเต็ม elementData[front + size] = e; size++; } public Object peek() { if (isEmpty()) throw new NoSuchElementException(); return elementData[front]; } public Object dequeue() { Object e = peek(); elementData[front++] = null; size--; return e; }... enqueue, peek, dequeue elementDatasize 2BC front 1 1C2

10 © S. Prasitjutrakul /07/57 10 มองอาเรย์เป็นวงวน ถ้าตัวท้ายคิวอยู่ท้ายอาเรย์ เติมตัวใหม่ไม่ได้ถ้าตัวท้ายคิวอยู่ท้ายอาเรย์ เติมตัวใหม่ไม่ได้ มองอาเรย์ให้เป็นแบบวงวน จะใช้เนื้อที่ได้เต็มที่มองอาเรย์ให้เป็นแบบวงวน จะใช้เนื้อที่ได้เต็มที่ XYZ elementDatasize 3 front X Y Z q.enqueue("A"); X Y Z A AXYZ elementDatasize 4 front 5 b = (front + size) % elementData.length; elementData[b] = e; size++;

11 © S. Prasitjutrakul /07/57 11 public class ArrayQueue implements Queue {... public void enqueue(Object e) { if (size == elementData.length) { Object[] a = new Object[2 * elementData.length]; for (int i = 0, j = front; i < size; i++, j = (j+1)%elementData.length) a[i] = elementData[j]; front = 0; elementData = a; } int b = (front + size) % elementData.length; elementData[b] = e; size++; } ArrayQueue : enqueue ABCD CDAB elementDatasize 4 front 2 ABCDX 50

12 © S. Prasitjutrakul /07/57 12 public Object dequeue() { Object e = peek(); elementData[front] = null; front = (front + 1) % elementData.length; size--; return e; } ArrayQueue : dequeue CDAB elementDatasize 4 front 3 CDA 30

13 © S. Prasitjutrakul /07/57 13 ตัวอย่างการใช้ queue เป็นที่พักข้อมูลเป็นที่พักข้อมูล การเรียงลำดับแบบฐานการเรียงลำดับแบบฐาน การค้นคำตอบตามแนวกว้างการค้นคำตอบตามแนวกว้าง การหาวิถีสั้นสุดการหาวิถีสั้นสุด......

14 © S. Prasitjutrakul /07/57 14 การใช้แถวคอยเป็นที่พักข้อมูล ผู้ผลิตข้อมูลผู้ใช้ข้อมูล ผู้ใช้ mouse events ระบบปฏิบัติการ ผู้ใช้ keyboard events ระบบปฏิบัติการ โปรแกรม งานพิมพ์เครื่องพิมพ์ โปรแกรม ข้อมูลฮาร์ดดิกส์ โปรแกรม threadsjvm network packetsrouter

15 © S. Prasitjutrakul /07/57 15 Radix Sort เรียงเรียบร้อย

16 © S. Prasitjutrakul /07/57 16 ปัญหาคูณสามหารสอง ให้จำนวนเต็ม v ให้จำนวนเต็ม v เริ่มด้วย 1 จะต้องทำการ x3 และหรือ /2 ( ปัดเศษทิ้ง ) อย่างไร จึงมีค่าเท่ากับ v เริ่มด้วย 1 จะต้องทำการ x3 และหรือ /2 ( ปัดเศษทิ้ง ) อย่างไร จึงมีค่าเท่ากับ v เช่น เช่น –v = 10 = 1x3x3x3x3/2/2/2 –v = 31 = 1x3x3x3x3x3/2/2/2/2/2x3x3/2 แก้ปัญหานี้อย่างไร ? แก้ปัญหานี้อย่างไร ? ขอเสนอวิธีลุยทุกรูปแบบ ขอเสนอวิธีลุยทุกรูปแบบ

17 © S. Prasitjutrakul /07/57 17 การค้นตามแนวกว้าง /2 3 = 1  3  3  3 / 2  3 6 ต้องการหา 39

18 © S. Prasitjutrakul /07/57 18 ปมต่าง ๆ ระหว่างการค้น class Node { int value; Node prev; Node(int v, Node p) { this.value = v; this.prev = p; } public boolean equals(Object o) { if (!(o instanceof Node)) return false; return this.value == ((Node) o).value; } } 3 19 /2 3 value prev สอง nodes เท่ากันก็เมื่อ values ทั้งสองเท่ากัน

19 © S. Prasitjutrakul /07/57 19 ใช้ Set และ Queue ใช้ queue เก็บเฉพาะ nodes ที่ยังไม่แตกกิ่ง ใช้ queue เก็บเฉพาะ nodes ที่ยังไม่แตกกิ่ง ใช้ set เก็บทุก nodes ที่เคยผลิต ใช้ set เก็บทุก nodes ที่เคยผลิต

20 © S. Prasitjutrakul /07/57 20 ตัวโปรแกรม public static void bfsM3D2(int target) { Set set = new ArraySet(100); Queue q = new ArrayQueue(100); Node v = new Node(1,null); // เริ่มด้วย 1 q.enqueue(v); set.add(v); while( !q.isEmpty() ) { v = (Node) q.dequeue(); if (v.value == target) break; Node v1 = new Node(v.value/2, v); // ลองหารสอง ( ปัดเศษ ) Node v2 = new Node(v.value*3, v); // ลองคูณสาม if (!set.contains(v1)) {q.enqueue(v1); set.add(v1);} if (!set.contains(v2)) {q.enqueue(v2); set.add(v2);} } if (v.value == target) showSolution(v); }

21 © S. Prasitjutrakul /07/57 21 การแสดงผลลัพธ์ static void showSolution(Node v) { if (v.prev != null) { showSolution(v.prev); System.out.print((v.prev.value / 2 == v.value) ? "/ 2" : " " 3"); } else { System.out.print("1 "); } }  3 / 2  3 1

22 © S. Prasitjutrakul /07/57 22 การหาวิถีสั้นสุด

23 © S. Prasitjutrakul /07/ การใช้แถวคอยในการหาวิถีสั้นสุด ใช้แถวคอยเก็บตำแหน่งของช่องที่รอขยาย class Pos { int row, col; Pos(int r, int c) {row = r; col = c;} }

24 © S. Prasitjutrakul /07/57 24 โปรแกรมหาวิถีสั้นสุด static void findPath(int[][] map, Pos source, Pos target) { map[source.row][source.col] = 0; // ต้นทาง map[target.row][target.col] = -1; // ปลายทาง Queue q = new ArrayQueue(map.length); q.enqueue(source); while (!q.isEmpty()) { Pos p = (Pos) q.dequeue(); if (p.row == target.row && p.col == target.col) break; expand(map, q, p.row + 1, p.col, map[p.row][p.col]+1); expand(map, q, p.row - 1, p.col, map[p.row][p.col]+1); expand(map, q, p.row, p.col + 1, map[p.row][p.col]+1); expand(map, q, p.row, p.col - 1, map[p.row][p.col]+1); } } static void expand(int[][] map, Queue q,int r,int c,int k){ if (r<0 || r>=map.length || c<0 || c>=map[r].length || map[r][c] != 0) return; map[r][c] = k; q.enqueue(new Pos(r, c)); }

25 © S. Prasitjutrakul /07/57 25 สรุป  ประยุกต์แถวคอยในการแก้ปัญหาหลากหลาย  การดำเนินการหลัก : enqueue / dequeue / peek  สร้างแถวคอยได้ง่ายด้วยอาเรย์ (มองแบบวงวน)  ถ้าจองขนาดให้เพียงพอ การทำงานทุกครั้งเป็น  (1)


ดาวน์โหลด ppt แถวคอย (Queue). © S. Prasitjutrakul 200614/07/57 2 หัวข้อ  นิยามแถวคอย และอินเตอร์เฟส Queue  การสร้างแถวคอยด้วยอาเรย์  ตัวอย่างการใช้งานแถวคอย  ที่พักข้อมูล.

งานนำเสนอที่คล้ายกัน


Ads by Google