860 likes | 1.09k Views
บทที่ 1 บทนำ. วัตถุประสงค์คือ ความสามารถในการออกแบบอัลกอริทึมที่มีประสิทธิภาพในการแก้ไขปัญหาที่ได้รับ ซึ่งสามารถนำไปเขียนเป็นโปรแกรมคอมพิวเตอร์ ได้ ความสามารถ ในการออกแบบนี้จะเรียนและถ่ายทอดกันอย่างไร?
E N D
วัตถุประสงค์คือ ความสามารถในการออกแบบอัลกอริทึมที่มีประสิทธิภาพในการแก้ไขปัญหาที่ได้รับ ซึ่งสามารถนำไปเขียนเป็นโปรแกรมคอมพิวเตอร์ได้ • ความสามารถในการออกแบบนี้จะเรียนและถ่ายทอดกันอย่างไร? • วิธีหนึ่งก็คือการยกตัวอย่างกลวิธีมาตรฐานต่างๆ ที่นักคอมพิวเตอร์เขาใช้กันอยู่ในการแก้ไขปัญหา พร้อมทั้งยกตัวอย่างปัญหาและอัลกอริทึมเพื่อแก้ไขปัญหาเหล่านั้น
ประเด็นสำคัญ คือ ไม่มีสูตรสำเร็จในการออกแบบ ดังนั้นปัญหาหนึ่งๆ จะมีขั้นตอนวิธีแก้ไขอยู่หลายแบบ จึงจำเป็นอย่างยิ่งที่เราจะต้องมีความรู้ในการวิเคราะห์เพื่อเปรียบเทียบข้อดีข้อเสียของแต่ละวิธีที่ออกแบบขึ้นได้ ดังนั้นสิ่งที่จะศึกษากันจะประกอบด้วย • การศึกษาลักษณะปัญหา • การออกแบบอัลกอริทึม • การวิเคราะห์อัลกอริทึม
ทุกๆโปรแกรม เบื้องหลังการทำงานก็คือ อัลกอริทึม ไม่มาเป็นโปรแกรมง่ายๆ จนไปถึงโปรแกรมยากๆ
วงจรการออกแบบอัลกอริทึมวงจรการออกแบบอัลกอริทึม เริ่มต้น มีปัญหา หาทางแก้ไข ยอมรับได้ ? Y จบ
เริ่มต้น มีปัญหา หาทางแก้ไข N ยอมรับได้ ? Y หมดหวัง N ปรับข้อกำหนดของปัญหา Y จบ
ได้แต่ฝากความคิดของฉันเอาไว้เผื่อวันไหนเธอผ่านมาเห็นที่เดียวกันนี้ เธอจะนึกขึ้นได้ว่า เคยมีคนนึงยืนข้างเธอ อยู่ตรงนี้เสมอตลอดมา ได้, แต่, ฝาก, ความ, คิด, ของ, ฉัน, เอา, ไว้, เผื่อ, วัน, ไหน, เธอ, ผ่าน, มา, เห็น, ที่, เดียว, กัน, นี้, เธอ, จะ, นึก, ขึ้น, ได้, ว่า, เคย, มี, คน, นึง, ยืน, ข้าง, เธอ, อยู่, ตรง, นี้, เสมอ, ตลอดมา
ข้อกำหนดของปัญหา • ลักษณะของข้อมูลขาเข้า (input) • ผลลัพธ์ที่ต้องการ
ต.ย. : ปัญหาตัวหมู่มาก (majority problem) problem • Input : ข้อมูลจำนวน n ตัว • Output : คืนค่า TRUE เมื่อมีข้อมูลที่มีค่าซ้ำกันเกิน : นอกจากนั้น คืนค่า FALSE Problem instance Input instance
อัลกอริทึม (Algorithm) • ลำดับการทำงานเชิงคำนวณซึ่งแปลงตัวอย่างข้อมูลขาเข้าของปัญหา ไปเป็นผลลัพธ์ที่ต้องการ • ขั้นตอนวิธีหารแก้ไขปัญหาด้วยคอมพิวเตอร์
บรรยายโดยการเขียนบรรยาย อัลกอริทึมการหารากที่ 3
ตัวหมู่มาก : นับแต่และตัว แบบ brute force นับ 1 มี 2 ตัว นับ 4 มี 1 ตัว True นับ 3 มี 4 ตัว นับ 1 มี 2 ตัว นับ 4 มี 1 ตัว hasMajority(d[1..n]) { for (i = 1; i <= n; i++) { c = 0; for (j = 1; j <= n; j++) if (d[i]==d[j]) c++ if (c > n/2) return TRUE } return FALSE } นับ 7 มี 1 ตัว นับ 3 มี 2 ตัว นับ 1 มี 2 ตัว False นับ 2 มี 1 ตัว
อัลกอริทึม • ต้องหาผลลัพธ์ที่ถูกต้อง ในเวลาอันจำกัด ให้กับข้อมูลขาเข้าทุกรูปแบบของปัญหา • เราต้องการอัลกอริทึม • ทำงานถูกต้อง • ทำงานได้รวดเร็วมีประสิทธิภาพ • ใช้หน่วยความจำน้อยๆ • ทำความเข้าใจง่าย
กลวิธีการออกแบบอัลกอริทึมกลวิธีการออกแบบอัลกอริทึม Brute force Divide and Conquer Dynamic Programming Greedy Algorithm State-Space Search Randomized Algorithm Approximation Algorithm ………
การวิเคราะห์อัลกอริทึมการวิเคราะห์อัลกอริทึม
ตัวหมู่มาก : sort + นับ เรียงลำดับ TRUE นับ 1 มี 2 ตัว นับ 3 มี 4 ตัว hasMajority( d[1..n] ) { sort(d); c = 0; i = 1; for (j = 1; j <= n; j++) { if (d[i]==d[j]) { if (++c > n/2) return TRUE } else { i = j; c = 1 } } return FALSE }
ตัวหมู่มาก : sort + นับตัวกลาง นับ 3 มี 4 ตัว นับ 3 มี 2 ตัว hasMajority( d[1..n] ) { sort(d); c = 0; i = ; for (j = 1; j <= n; j++) if (d[i]==d[j]) c++ if (c > n/2) return TRUE return FALSE }
ตัวหมู่มาก: sort + นับตัวตรงกลาง hasMajority( d[1..n]){ sort(d); c = 0; i = for ( j = i; j >=1 AND d[i]==d[j]; j--) c++ for (j = i+1; j<=n AND d[i]==d[j]; j++) c++ if (c> n/2) return TRUE return FALSE }
การวิเคราะห์เวลาการทำงานการวิเคราะห์เวลาการทำงาน • Experimental Analysis • แปลงอัลกอริทึมเป็นโปรแกรม • สั่งทำงานกับข้อมูลขาเข้าหลายๆ แบบ • จับเวลา วาดกราฟ หาความสัมพันธ์ของเวลากับปริมาณข้อมูล
การวิเคราะห์เวลาการทำงานการวิเคราะห์เวลาการทำงาน • Mathematical Analysis • วิเคราะห์หาความสัมพันธ์ของจำนวนคำสั่งที่ทำงานกับปริมาณข้อมูลที่ได้รับ
การปรับข้อกำหนด เริ่มต้น มีปัญหา หาทางแก้ไข N ยอมรับได้ ? Y หมดหวัง N ปรับข้อกำหนดของปัญหา Y จบ