วันพฤหัสบดีที่ 17 กันยายน พ.ศ. 2552

DTS 10-15/09/09

เรื่องตารางแฮช
คือการเข้าถึงข้อมูลโดยตรง กำหนดให้ k เป็นคีย์ถูกจัดเก็บอยู่ใน ช่อง k ด้วยการทำแฮช ด้วยพื้นฐานการจัดเก็บในช่องที่h(k) โดยฟังก์ชั่น h เพื่อคำนวณหาช่องของคีย์โดยการจับคู่กับดอกภพสัมพันธ์ U ในตาราง T

การชนกับของข้อมูล
การแทรกในตาราง ที่จัดเก็บนั้นมีโอกาสที่คีย์ถูกสร้างจากฟังก์ชั้น อย่างไรก็ตามการเกิดการชนกันยังคงมีอย่างน้อย 1 ครั้ง

วิธีการสร้างฟังก์ชั่นแฮช
1. วิธีการหาร คือ การจับคู่คีย์ K ในช่องของ m โดยนำเศษที่เหลือของ k จากการหารด้วย m ด้วยฟังก์ชั่นคือ h(k) = mod m.
2. วิธีการคูณ ปรกอบด้วย 2 ขั้นตอน
ขั้นที่ 1 คูณด้วย k ด้วยค่าคงที่ h(k) = *m(kA mod 1)
เมื่อ " kA mod 1" หมายถึง เศษส่วนของ kA, นั้นคือ , kA-*kA
ประโยชน์ของวิธีนี้คือ ค่าของm จะไม่วิกฤติ และสามารถดำเนินการในครื่องคอมพิวเตอร์ส่วนมากได้
3. วิธีทั่วไป คือ Open Addressing ฟังก์ชั่นแฮช คือ h:V{0,1,.....m-1}-->{0,1,...,m-1}

เทคนิคลำดับของการตรวจสอบ
1. การตรวจสอบเชิงเสน
2. การตรวจสอบด้วยสมการกำลังสอง
3. การสร้างฟังก์ชั่นแฮชแบบสองท่า

DTS 09-15/09/09

เรื่อง sorting
คือการเรียงลำดับ เป็นการจัดให้เป็นระเบียบอย่างมีแบบแผน ซึ่งจะสามารถหาข้อมูลได้ง่ายขึ้น ราดเร็วขึ้น เช่น การค้นหาหมายเลขในสมุดโทรศัพท์ ซึ่งมีการเรียงลำดับตามชื่อ-นามสกุลของเจ้าของโทรศัพท์ จะสามารถหาหมายเลขโทรศัพท์ได้เร็วขึ้น

วิธีการเรียงลำดับ
1. การเรียงลำดับแบบภายใน การเรียงลำดับทั้งหมดต้องอยู่ในหน่วยความจำหลัก
2. การเรียงลำดับแบบภายนอก เป็นการเรียงลำดับขอ้มูลจะเก็บไว้ในหน่วยความจำสำรอง

การเรียงลำดับแบบเลือก ทำการเลือกข้อมูลมาเก็บไว้ในตำแหน่ง ข้อมูลนั้นควรจะอยู่ที่ละตัว โดยการค้นหาข้อมูลั้นจะเรียงจากน้อยไปหามาก

การเรียงลำดับแบบฟอง เป็นการเปรียบเทียบข้อมูลที่ในตำแหน่งอยู่ติดกัน ถ้าข้อมูลทั้งสองไม่อยู่ในตำแหน่งที่ถูกต้องให้สลับตำแหน่ง ข้อมูลมีการเรียงลำดับจากน้อยไปมาก

การเรียงลำดับแบบเร็ว ใช้เวลาน้อย เหมาะกับข้อมูลที่มีจำนวนมากต้องการความรวดเร็วในการทำงาน และกำหนดค่าหนึ่งเป็นค่าหลัก แล้วหาตำแหน่งที่ถูกต้องให้กับค่าหลักนี้ โดยแบ่งข้อมูลออกเป็นสองส่วน ส่วนแรกอยู่ตอนหน้าของข้อมูล ทั้งหมดจะมีค่าน้อยกว่าค่าหลักที่เป็นตัวแบ่ง

การเรียงลำดับแบบแทรก เป็นการเพิ่มสมาชิกใหม่เข้าไปในเซต ที่มีสมาชิกทุกตัวเรียงกันอยู่แล้ว ทำให้เซตใหม่ได้มีสมาชิกทุกตัวเรียงลำดับด้วย วิธีการเรียงลำดับจะเริ่มจากการเปรียบเทียบในตำแหน่งที่1และ2 หรือข้อมูลในตำแหน่งสุดท้ายและรองสุดท้าย และต้องจัดข้อมูลที่มีค่าน้อยในตำแหน่งก่อนข้อมูลที่มีค่ามาก ถ้าเรียงจากมากไปน้อยจะจัดให้ข้อมูลที่มีค่ามากอยูในตำแหน่งก่อน

การเรียงลำดับแบบฐาน เป็นการพิจารณาข้อมูลทีละหลัก โดยเริ่มจากข้อมูลที่มีค่าน้อยที่สุดก่อน นั้นคือข้อมูลที่เป็นจำนวนเต็มในหลักหน่วยก่อน และจัดเรียงเข้ามาทีละตัวแล้วนำไปเก็บไว้เป็นกลุ่ม ในรอบต่อไปนำข้อมูลทั้งหมดมาจัดเรียงในหลักหน่วยก่อนแล้วจึงไปทำหลักสิบตอไป

วันพุธที่ 9 กันยายน พ.ศ. 2552

DTS 08-08/09/09

เรื่องกราฟ

กราฟ (Graph) เป็นโครงสร้างข้อมูลแบบไม่ใช่เชิงเส้น อีกชนิดหนึ่ง กราฟเป็นโครงสร้างข้อมูลที่มีการนำไปใช้ในงานที่เกี่ยวข้องกับการแก้ปัญหาที่ค่อนข้างซับซ้อนเช่น การวางข่าย งานคอมพิวเตอร์ การวิเคราะห์เส้นทางวิกฤติ และปัญหาเส้นทางที่สั้นที่สุด

นิยามของกราฟ
กราฟ เป็นโครงสร้างข้อมูลแบบไม่ใช่เชิงเส้นที่ประกอบ ด้วยกลุ่มของสิ่งสองสิ่งคือ
(1) โหนด (Nodes) หรือ เวอร์เทกซ์(Vertexes)
(2) เส้นเชื่อมระหว่างโหนด เรียก เอ็จ (Edges)กราฟที่มีเอ็จเชื่อมระหว่างโหนดสองโหนดถ้าเอ็จไม่มีลำดับ ความสัมพันธ์จะเรียกกราฟนั้นว่ากราฟแบบไม่มีทิศทาง (Undirected Graphs)และถ้ากราฟนั้นมีเอ็จที่มีลำดับความสัมพันธ์หรือมีทิศทางกำกับด้วยเรียกกราฟนั้นว่า กราฟแบบมีทิศทาง(Directed Graphs)
บางครั้งเรียกว่า ไดกราฟ (Digraph)ถ้าต้องการอ้างถึงเอ็จแต่ละเส้นสามารถเขียนชื่อเอ็จกำกับไว้ก็ได้

โดยทั่ว ๆ ไปการเขียนกราฟเพื่อแสดงให้เห็นความสัมพันธ์ ของสิ่งที่เราสนใจแทนโหนดด้วย จุด (pointes) หรือวงกลม (circles)ที่มีชื่อหรือข้อมูลกำกับ เพื่อบอกความแตกต่างของแต่ละโหนดและเอ็จแทนด้วยเส้นหรือเส้นโค้งเชื่อมต่อระหว่างโหนดสองโหนดถ้าเป็นกราฟแบบมีทิศทางเส้นหรือเส้นโค้งต้องมีหัวลูกศรกำกับทิศทางของความสัมพันธ์ด้วย

การท่องไปในกราฟ
การท่องไปในกราฟ (graph traversal) คือกระบวนการเข้าไปเยือนโหนดในกราฟ โดยมีหลักในการทำงานคือ แต่ละโหนดจะถูกเยือนเพียงครั้งเดียว สำหรับการท่องไปในทรีเพื่อเยือนแต่ละโหนดนั้นจะมีเส้นทางเดียว
แต่ในกราฟระหว่างโหนดอาจจะมีหลายเส้นทาง ดังนั้นเพื่อป้องกันการท่องไปในเส้นทางที่ซ้ำเดิมจึงจำเป็นต้องทำเครื่องหมายบริเวณที่ได้เยือนเสร็จเรียบร้อยแล้วเพื่อไม่ให้เข้าไปเยือนอีก

สำหรับเทคนิคการท่องไป ในกราฟมี 2 แบบดังนี้

1. การท่องแบบกว้าง (Breadth First Traversal)
วิธีนี้ทำโดยเลือกโหนดที่เป็นจุดเริ่มต้น ต่อมาให้เยือนโหนดอื่นที่ใกล้กันกับโหนดเริ่มต้นทีละระดับจนกระทั่งเยือนหมดทุกโหนดในกราฟ

2. การท่องแบบลึก (Depth First Traversal)
การทำงานคล้ายกับการท่องทีละระดับของทรี โดยกำหนดเริ่มต้นที่โหนดแรกและเยือนโหนดถัดไปตาม
แนววิถีนั้นจนกระทั่งนำไปสู่ปลายวิถีนั้น จากนั้นย้อนกลับ (backtrack) ตามแนววิถีเดิมนั้น จนกระทั่ง
สามารถดำเนินการต่อเนื่องเข้าสู่แนววิถีอื่น ๆ เพื่อเยือนโหนดอื่น ๆ ต่อไปจนครบทุกโหนด

กราฟ มีน้ำหนัก หมายถึง กราฟที่ทุกเอดจ์ มีค่าน้ำหนักกำกับ ซึ่งค่าน้ำหนักอาจสื่อถึงระยะทาง เวลา ค่าใช้จ่าย เป็นต้น นิยมนำไปใช้แก้ปัญหาหลัก ๆ 2 ปัญหา คือ

1. การสร้างต้นไม้ทอดข้ามน้อยที่สุด(Minimum Spanning Trees :MST)
1. เรียงลำดับเอดจ์ ตามน้ำหนัก
2. สร้างป่าที่ประกอบด้วยต้นไม้ว่างที่มีแต่โหนด และไม่มีเส้นเชื่อม
3. เลือกเอดจ์ที่มีน้ำหนักน้อยที่สุดและยังไม่เคยถูกเลือกเลย ถ้ามีน้ำหนักซ้ำกันหลายค่าให้สุ่มมา 1 เส้น
4. พิจารณาเอดจ์ที่จะเลือก ถ้านำมาประกอบในต้นไม้ทอดข้ามน้อยที่สุดแล้วเกิด วงรอบ ให้ตัดทิ้งนอกนั้นให้นำมาประกอบเป็นเอดจ์ในต้นไม้ทอดข้ามน้อยที่สุด
5. ตรวจสอบเอดจ์ที่ต้องอ่านในกราฟ ถ้ายังอ่านไม่หมดให้ไปทำข้อ 3
6. เลือกเอดจ์ที่เหลือและมีน้ำหนักน้อยที่สุดมา
7. เลือกเอดจ์ที่เหลือและมีน้ำหนักน้อยที่สุด ตามตัวอย่าง คือ edges (5,7) จากนั้นให้ตัดทิ้งไม่นำมาเชื่อมต่อต้นไม้ในป่า เนื่องจากทำให้เกิดวงรอบ
8. เลือกเอดจ์ที่เหลือและมีน้ำหนักน้อยที่สุด ตามตัวอย่าง คือ edges (1,4) จากนั้นให้ตัดทิ้งไม่นำมาเชื่อมต่อต้นไม้ในป่า เนื่องจากทำให้เกิดวงรอบ
9. เลือกเอดจ์ที่เหลือและมีน้ำหนักน้อยที่สุดมา ตามตัวอย่าง คือ edges(3,5) นำมาเชื่อมต่อต้นไม่ในป่า เนื่องจากเป็นเอดจ์สุดท้าย

2. การหาเส้นทางที่สั้นที่สุด(Shortest path)
2.1 เริ่มต้นให้เซต S มีเพียงโหนดเดียว คือโหนดที่เป็นจุดเริ่มต้น
2.2 คำนวณหาระยะทางจาก โหนดที่เป็นจุดเริ่มต้น ไปยังโหนดทุกโหนดในกราฟ โดยยอมให้ใช้โหนด ในเซต S เป็นทางผ่านได้ ถ้ามีมากกว่า 1 ทาง ให้เลือกทางที่สั้นที่สุด นำไปใส่ใน D ของแต่ละโหนด
2.3 เลือกโหนด W ที่ห่างจากโหนดเริ่มต้นน้อยที่สุดไปไว้ใน S

การคำนวณหาระยะทางสั้นที่สุด จากโหนดต้นทางคือโหนด 1
ไปยังโหนดใด ๆ มีวิธีคำนวณดังนี้
1) เริ่มต้นโหนดที่เป็นจุดเริ่มต้น คือ โหนด 1 ไปไว้ที่เซต Sจากนั้นนำค่าน้ำหนักบนเอดจ์ (1,2) เอดจ์ (1,4) เอดจ์ (1,5)และ เอดจ์ (1,6) ไปเขียนในตารางสำหรับ โหนด 3 ไม่ได้ เชื่อมต่อกับโหนดที่ 1 ดังนั้นจึงใช้ค่าอินฟินีตี้ (Infinity) แทน แสดงในตารางที่ปรากฏในบรรทัดIter= Initial

2) เลือก W ที่มีระยะทางสั้นที่สุด คือ โหนด 2 ไปไว้ที่เซต Sคำนวณ ระยะทางใหม่ ระยะทางสั้นที่สุด จากโหนด 1 ไปโหนดอื่น ๆ เท่าเดิม ยกเว้นโหนด 3 ซึ่งขณะนี้มีวิถีกับโหนด 1 ดังนี้ (1,2,3) ระยะทางที่ได้มาจากน้ำหนักบนเอจน์เป็น (1,2) และ เอดจ์ (2,3)รวมกันคือ 70 จึงเขียนค่า 70 แทนค่าอินฟินีตีเดิม

3) เลือก W ที่มีระยะทางสั้นที่สุดคือโหนด 5 ไปไว้ที่เซต Sคำนวณหาระยะทางใหม่ปรากฏว่าถึงแม้จะมี
โหนด 5 อยู่ในวิถีเส้นทางใหม่ แต่ระยะทางจากวิถีเดิมสั้นกว่า จึงคงค่าเดิมไว้ดังแสดงในตาราง

4) เลือก W ที่มีระยะทางสั้นที่สุดคือโหนด 4 ไปไว้ที่เซต Sคำนวณหาระยะทางใหม่ปรากฏว่า มีวิถีจากโหนด 1 ไปโหนด3 รวม 2 วิถีดังนี้
วิถีที่ 1 คือ (1,2 และ3) มีค่าน้ำหนัก = 30+40 =70
วิถีที่ 2 คือ (1,4 และ3) มีค่าน้ำหนัก = 50+10 =60
เลือกน้ำหนักจากวิถีที่สั้นที่สุด คือ 60 ไปเขียนแทนค่าเดิม

5) เลือก W ที่มีระยะทางสั้นที่สุดคือโหนด 3 ไปไว้ที่เซต Sคำนวณหาระยะทางใหม่ปรากฏว่า มีวิถีจากโหนด 1 ไปโหนด3