190 likes | 342 Views
Application of Linked Lists. สร้างพหุนามตัวแปรเดียว (Single Variable Polynomial) ใช้ในการจัดเรียงข้อมูล (Sorting) โดยใช้เวลาเป็นเชิงเส้น (Linear time) ใช้ในการจัดเก็บรายชื่อวิชาที่เคยลงทะเบียนเรียนของนักศึกษาในมหาวิทยาลัย. N. f(X) = ∑ A i X i. i=0.
E N D
Application of Linked Lists • สร้างพหุนามตัวแปรเดียว (Single Variable Polynomial) • ใช้ในการจัดเรียงข้อมูล (Sorting) โดยใช้เวลาเป็นเชิงเส้น (Linear time) • ใช้ในการจัดเก็บรายชื่อวิชาที่เคยลงทะเบียนเรียนของนักศึกษาในมหาวิทยาลัย Week 06b - Linked Lists Application
N f(X) = ∑ AiXi i=0 โครงสร้างข้อมูลชนิดพหุนาม (Polynomial ADT) พหุนามตัวแปรเดียว (Single Variable Polynomial) • Ai ว่าเป็นสัมประสิทธิ์ (Co-efficient) ของเทอม • i เป็นกำลังหรือดีกรี (Degree) ของเทอม • ค่าดีกรีของพหุนามเท่ากับค่าดีกรีของเทอมที่มีดีกรีสูงสุด เช่น 8X3 + 35X2 + X + 24 Week 06b - Linked Lists Application
Polynomial ADT • นิยาม Abstract Data Type สำหรับพหุนาม (Polynomial) ตัวแปรเดียวได้โดยใช้ลิสต์ทั้งที่สร้างขึ้นจากอาร์เรย์ (Array) และจากลิงค์ลิสต์ (Linked List) • ถ้าค่าสัมประสิทธิ์ (Coefficient) ส่วนใหญ่ไม่เป็น 0 (เทอมส่วนใหญ่อยู่ครบ) เราสามารถสร้างพหุนามดังกล่าวขึ้นโดยใช้อาร์เรย์ได้ง่าย • สามารถสร้างขั้นตอนในการทำการดำเนินการ (Operations) ต่างๆบนพหุนามเหล่านี้ได้ เช่น การบวก (addition), การคูณ (multiplication) Week 06b - Linked Lists Application
การประกาศ Polynomial ADT ที่สร้างขึ้นจากอาร์เรย์ • ประกาศเป็นโครงสร้างแบบ Structure • ประกอบด้วยอาร์เรย์ของสัมประสิทธิ์ของแต่ละเทอม • ดัชนี (Index) ของอาร์เรย์จะแสดงกำลังหรือดีกรีของเทอมนั้นๆ Week 06b - Linked Lists Application
การประกาศ Polynomial ADT ที่สร้างขึ้นจากอาร์เรย์ การเก็บพหุนามลงอาร์เรย์ • อาร์เรย์ของสัมประสิทธิ์ของแต่ละเทอม • ดัชนี (Index) ของอาร์เรย์จะแสดงกำลังหรือดีกรีของเทอมนั้นๆ ตัวอย่าง8X3 + 35X2 + X + 24 Week 06b - Linked Lists Application
การประกาศ Polynomial ADT ที่สร้างขึ้นจากอาร์เรย์ 23X4 + 14X2 + X + 6 X 0 23 0 14 1 6 X5 + 2X4 + 34X3 + 17X X 1 0 2 34 0 17 Week 06b - Linked Lists Application
การประกาศ Polynomial ADT ที่สร้างขึ้นจากอาร์เรย์ • พหุนามที่สร้างด้วยอาร์เรย์ไม่สามารถมีดีกรีต่ำกว่า 0 ได้ เนื่องจากข้อจำกัดจากช่วงของค่าดัชนีของอาร์เรย์ • ออบเจกต์พหุนามอาจเก็บค่าดีกรีของเทอมสูงสุด ซึ่งเป็นดีกรีของพหุนามเอาไว้ด้วย เพื่อให้สะดวกต่อการดำเนินการต่างๆ • เราต้องทราบขนาดของอาร์เรย์ของสัมประสิทธ์เพื่อจะได้ทราบค่าดีกรีสูงสุดที่สามารถบรรจุลงในอาร์เรย์ Week 06b - Linked Lists Application
Structure ของพหุนามที่เก็บโดยใช้อาร์เรย์ • maxDegree เป็นดีกรีสูงสุดของพหุนามที่สามารถบรรจุลงในอาร์เรย์นี้ได้ ซึ่งเป็นตัวกำหนดขนาดของอาร์เรย์ที่ต้องการ • coefficientArray [] เป็นอาร์เรย์ที่ใช้เก็บสัมประสิทธิ์ โดยจองเนื้อที่ไว้เท่ากับ maxDegree+1 • highestPower เป็นค่ากำลังหรือดีกรีของเทอมที่มีดีกรีสูงที่สุด ซึ่งถือเป็นดีกรีของพหุนามที่เก็บอยู่ Week 06b - Linked Lists Application
Structure ของพหุนามที่เก็บโดยใช้อาร์เรย์ Struct Polynomial { int CoefficientArray[ MaxDegree+1]; int HighestPower; } Polynomial int CoefficientArray[MaxDegree+1] int HighestPower Week 06b - Linked Lists Application
การกำหนดค่าเริ่มต้นของ Polynomial ให้เป็นศูนย์ • ให้ค่าในอาร์เรย์ CoefficientArray ทั้งหมดเป็น 0 • ให้ค่าดีกรีสูงสุดของพหุนาม HighestPower เป็น 0 Algorithm makeZeroPolynomial(polyterm) maxDegree – the highest possible degree of polynomial polyterm –pointer to the polynomial structure i – index to current member of array Begin for(int i = 0; i <= maxDegree; i++) (Set CoefficientArray[i] of polyTerm to 0) (Set HighestPower to 0) End Week 06b - Linked Lists Application
ขั้นตอนการบวกพหุนาม • รับข้อมูลชนิด Polynomial เข้ามา 3 ตัว • poly1,poly2 สำหรับบวกเข้าด้วยกัน • polySum เอาไว้เก็บค่าพหุนามผลลัพธ์ • ค่าดีกรีของพหุนามผลลัพธ์จะเท่ากับค่าสูงสุดของระหว่างดีกรี (Highest Power) ของพหุนามทั้งสอง • การบวกพหุนาม ทำได้โดยการบวกค่าสัมประสิทธิ์ของเทอมที่มีดีกรีเท่ากันเข้าด้วยกัน Week 06b - Linked Lists Application
ขั้นตอนการบวกพหุนาม Algorithm addPolynomial(poly1, poly2, polySum) maxDegree – the highest possible degree of polynomial poly1,poly2 – polynomial terms to be added together polySum – resulted polynomial i – index to current member of array Begin (Call Procedure MakeZeroPolynomial(polySum)) (HighestPower of polySum = maximum between HighestPower of poly1 and HighestPower of poly2) for(i=(HighestPower of polySum); i>=0; i--) { (CoefficientArray[i] of polySum) = (CoefficientArray[i] of poly1) + (CoefficientArray[i] of poly2) } End Week 06b - Linked Lists Application
575 10 3 45 620 114 17 0 การสร้าง Polynomial จาก Linked List • เพื่อลด Running Time สำหรับการคูณพหุนามที่เทอมส่วนใหญ่ของพหุนามหายไปเนื่องจากค่าสัมประสิทธิ์ (Coefficient) เป็น 0 แต่ละโหนดของ Linked List แทนเทอมของพหุนามแต่ละเทอม โดยมีองค์ประกอบของข้อมูล 2 ตัว • ค่าแรกของโหนดเป็นค่าสัมประสิทธิ์ (Coefficient) ของเทอม • ค่าที่สองของโหนดเป็นค่ากำลังหรือดีกรี (Degree) ของเทอม 575X620 + 10X114 + 3X17 + 45 NULL Week 06b - Linked Lists Application
coeff exponent การประกาศ Polynomial ADT ที่สร้างขึ้นจาก Linked List Structure PolyNode { int coeff; int exponent; PolyNode* next; } next Week 06b - Linked Lists Application
1 68 26 33 7 1 12 34 1 0 10 1 การสร้าง Polynomial จาก Linked List 68X34 + 26X12 + 7X + 33 NULL X10 + X NULL Week 06b - Linked Lists Application
Radix Sort ทำการจัดเรียง (Sorting) เลขฐาน 10 • สร้าง Bucket จำนวนน้อยกว่า หรือเท่ากับจำนวนข้อมูลที่ต้องการเรียง โดยปกติแล้วจะมีขนาดเท่ากับค่าฐานของเลขที่ต้องการ Sort • ข้อมูลที่เก็บอยู่ในแต่ละ Bucket จะเก็บอยู่ในรูปของ List • การจัดเรียง (Sorting) แต่ละรอบจะแยกข้อมูลออกพิจารณาทีละหลัก • เรียงโดยเริ่มพิจารณาจากหลักที่มีค่านัยสำคัญต่ำสุด (Less significant digit) ไปยังหลักที่มีค่านัยสำคัญสูงสุด (Most significant digit) • พิจารณาข้อมูลที่ละหลัก โดยข้อมูลที่มีค่าของหลักนั้นๆเหมือนกัน ให้นำไปไว้ใน list เดียวกัน • จำนวนรอบในการจัดเรียงเท่ากับจำนวนหลักของข้อมูล Week 06b - Linked Lists Application
ข้อมูล Inputเป็น 64, 8, 216, 512, 27, 729, 0, 1, 343, 125 พิจารณาหลักหน่วย 0 1 512 343 64 125 216 27 8 729 อ่านข้อมูลออกมาจากทีละ Bucket ตามลำดับ จะได้เป็น 0, 1, 512, 343, 64, 125, 216, 27, 8, 729 Week 06b - Linked Lists Application
ข้อมูลจากรอบที่ผ่านมา0, 1, 512, 343, 64, 125, 216, 27, 8, 729พิจารณาหลักสิบ 8 729 1 216 27 0 512 125 343 64 อ่านข้อมูลออกมาจากทีละ Bucket ตามลำดับ จะได้เป็น 0, 1, 8, 512, 216, 125, 27, 729, 343, 64 Week 06b - Linked Lists Application
ข้อมูลจากรอบที่ผ่านมา0, 1, 8, 512, 216, 125, 27, 729, 343, 64พิจารณาหลักร้อย 64 27 8 1 125 216 343 512 729 0 อ่านข้อมูลออกมาจากทีละ Bucket ตามลำดับ จะได้เป็น 0, 1, 8, 27, 64, 125, 216, 343, 512, 729 Week 06b - Linked Lists Application