550 likes | 701 Views
บทที่ 2 ความรู้เบื้องต้น ( Introduction ). By Juthawut Chantharamalee. หลักนามธรรม( Abstraction).
E N D
บทที่ 2 ความรู้เบื้องต้น (Introduction) By JuthawutChantharamalee วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
หลักนามธรรม(Abstraction) หลักนามธรรม ถือเป็นหลักการที่สำคัญหลักการหนึ่ง โดยคำว่า “นามธรรม Abstract”จะทำให้ทุกสิ่งในโลกแห่งความเป็นจริงดูง่ายดายขึ้น ด้วยการพิจารณาบางสิ่งแยกออกจากความเป็นจริงของสิ่งเหล่านั้นโดยอธิบายว่าสิ่งๆนั้นทำอะไร ไม่ต้องมุ่งเน้นในรายละเอียดว่าต้องทำงานอย่างไร ดังนั้นการคิดด้วยหลักนามธรรมนี้ จึงทำให้เราสามารถคิดวิธีการแก้ปัญหาด้วยการตัดทอนสิ่งที่ซับซ้อน หรือรายละเอียดปลีกย่อยที่ไม่จำเป็นออกไปได้ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
อัลกอริทึมกับความเป็นนามธรรมโดยธรรมชาติ (The Abstract Nature of Algorithm) อัลกอริทึมคือขั้นตอนวิธีที่ใช้สำหรับแก้ปัญหา โดยสามารถสื่อออกมาในรูปแบบของภาษาพูดหรือภาษาธรรมชาติ (Natural Language) และหากมีการนำไปใช้เพื่อแก้ปัญหาทางคอมพิวเตอร์ ก็จะสื่ออกมาในรูปแบบของประโยคภาษาอังกฤษที่มีความใกล้เคียงกับชุดคำสั่งโปรแกรมที่เรียกว่าชูโดโค้ดที่ใช้เป็นตัวกลางสื่อสารอัลกอริทึมนั้นๆ วิชาโปรแกรมประยุกต์ด้านการจัดการสำนักงานอัตโนมัติ รหัส 4122602
ในความเป็นจริง อัลกอริทึมมีความเป็นนามธรรมอยู่ในตัวโดยธรรมชาติอยู่แล้ว อัลกอริทึมสามารถทำให้เป็นรูปธรรมได้ด้วยการผ่าน “ตัวแทน Representation” เพื่อนำเสนออัลกอริทึมเหล่านั้นดังนั้นความสำคัญอยู่ที่ว่า ควรแยกความแตกต่างระหว่างอัลกอริทึมและตัวแทนออกจากกันเช่น เรื่องราวในนวนิยาย (Strory) หนังสือ (Book) นามธรรมหรือแนวคิด ตัวแทนทางกายภาพ วิชาโปรแกรมประยุกต์ด้านการจัดการสำนักงานอัตโนมัติ รหัส 4122602
ดังนั้น อัลกอริทึม ก็คือกระบวนการที่นำไปใช้สร้างโปรแกรมเพื่อทำงานและแก้ปัญหาตามที่เราต้องการ ในขณะที่ตัวแทนก็คือโปรแกรมที่ได้รับการพัฒนาขึ้นจากอัลกอริทึมนั้น หรือกล่าวอีกนัยหนึ่งก็คือ โปรแกรมก็คือตัวแทนของอัลกอริทึม และเมื่อโปรแกรมได้รับการพัฒนาขั้นมาภายในโปรแกรมก็จะประกอบไปด้วยหลายๆ โปรเซสด้วยกัน ตัวแทนอัลกอริทึม(Program) กิจกรรมที่เอ็กซีคิวต์อัลกอริทึมนั้น (Process) วิชาโปรแกรมประยุกต์ด้านการจัดการสำนักงานอัตโนมัติ รหัส 4122602
3.ซูโดโค้ดไม่ขึ้นกับภาษาคอมพิวเตอร์ภาษาใดภาษาหนึ่ง แต่สามารถแปลงเป็นภาษาคอมพิวเตอร์ เช่น ภาษา PASCAL, C หรือ C++ ได้ง่าย 4.การเขียนซูโดโค้ดจะเขียนมุ่งเน้นประโยคกิจกรรมที่ใช้ในการเอ็กซีคิวต์โปรแกรมเป็นสำคัญ โดยสามารถสร้างประโยคคำสั่งเรียงลำดับ (Sequence) กำหนดทางเลือก (Selection) และการทำงานเป็นรอบ (Iteration) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
อัลกอริทึมที่ 2.1 ตัวอย่างซูโดโค้ดการอ่านข้อมูลในไฟล์เพื่อพิมพ์รายงานจากตัวอย่างอัลกอริทึมที่ 2.1 ที่นำเสนอในรูปแบบของชูโดโค้ดนั้น จะทำการอธิบายในแต่ละหัวข้อดังรายละเอียดต่อไปนี้ • Algorithm sample (pageNumber) • This algorithm reads a flie and prints a report. • pre pageNumber passed by reference • post Report Printed • pageNumber contains number of pages in report • Return Number of lines printed • loop (not end of file) • 1 read file • 2 if (full page) • 1 increment page number • 2 write page number • 3 end if • 4 write report line • 5 increment line count • 2 end loop • 3 Return line count • end sample วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
ส่วนหัวของอัลกอริทึม (Algorithm Header) แต่ละอัลกอริทึมจำเป็นต้องเริ่มต้นด้วยส่วนหัว หรือมักเรียกทับศัพท์ว่า เฮดเดอร์ (Header) ที่มีไว้เพื่อกำหนดชื่ออัลกอริทึม นอกจากนี้ยังใช้อธิบายรายละเอียดเกี่ยวกับพารามิเตอร์ (Parameters) รวมถึงเงื่อนไขก่อน (Preconditions) เงื่อนไนหลัง (Postconditions) สิ่งเหล่านี้ถือว่าเป็นสิ่งสำคัญ เพราะว่าโปรแกรมเมอร์จะรับทราบข้อมูลรายละเอียดภายในอัลกอริทึมนี้จากเฮดเดอร์และนำอัลกอริทึมไปประยุกต์ใช้เพื่อเขียนการโปรแกรมต่อไป วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
จุดประสงค์ เงื่อนไข และการรีเทิร์นค่า(Purpose, Conditions and Return สำหรับประโยคสั่นๆ ที่อธิบายถัดจากบรรทัดชื่อของอัลกอริทึมก็คือจุดประสงค์ของอัลกอริทึม ที่มีไว้เพื่ออธิบายในเรื่องทั่วไปของการประมวลผลในอัลกอริทึมนั้น แต่ไม่ได้หมายความว่าให้อธิบายรายละเอียดทั้งหมดของกระบวนการว่ามีการทำงานอย่างไร จุดมุ่งหมายของอัลกอริทึมที่ 2.1 คงไม่ใช่การแสดงสถานะไฟล์ที่เปิดใช้งาน หรือจะต้องพิมพ์รายงานอย่างไร แต่จุดประสงค์แท้จริงของอัลกอริทึมก็คือ ต้องการอ่านไฟล์เพื่อนำมาพิมพ์รายงานเท่านั้น วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ส่วนบรรทัดถัดไป จะแสดงเงื่อนไขก่อน (Preconditions) ซึ่งใช้ชื่อย่อว่า Pre โดยอัลกอริทึมที่ 2.1 นั้นมีการกำหนดให้ PageNumberเป็นค่าเริ่มต้นของเงื่อนไขก่อน ดังนั้นเมื่อมีการเรียกใช้งานอัลกอริทึม sample จึงต้องพารามิเตอร์เลขหน้า (pageNumber) มาด้วย โดยพารามิเตอร์pageNumber ถูกกำหนดให้ส่งผ่านค่าแบบ passed by reference แต่อย่างไรก็ตาม ในกรณีที่ไม่มีเงื่อนไขก่อน ก็สามารถเขียนให้อยู่ในรูปแบบดังต่อไปนี้ Pre nothing วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
และถ้าในกรณีที่มีอินพุตพารามิเตอร?หลายๆ ตัว เงื่อนไขก่อนก็จะแสดงรายะเอียดของพารามิเตอร์ในแต่ละตัวด้วย โดยพิจารณาจากตัวอย่างต่อไปนี้ คืออัลกอริทึมการค้นหาข้อมูลในอาร์เรย์อย่างง่าย ซึ่งมีกำหนดรายละเอียดในเฮดเดอร์ดังต่อไปนี้ Algorithm search (list, argument, location) Search array for specific item and return index location. pre list contains data array to be searched argument contains data to be located in list post location contains matching index -or- undetermined if not found Return true if found, false if not found วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ลำดับประโยคคำสั่ง (Statement Numbers) ประโยคคำสั่งจะมีลำดับกำกับไว้ ซึ่งจะใช้เลขทศนิยม ด้วยการลำดับหมายเลขเพิ่มขึ้นที่ละหนึ่งภายในโครงสร้างของบล็อกนั้นๆ ซึ่งเทคนิคดังกล่าวจะทำให้ง่ายต่อการอ่านและอ้างอิงประโยคคำสั่ง เช่น จากตัวอย่างอัลกอริทึมที่ 2.1 เลขลำดับ 1.1 ก็คือประโยคคำสั่ง read file ในขณะที่เลขลำดับ 1.2.2 คือประโยคคำสั่ง write page heading และการใช้เทคนิคเลขลำดับนี้เอง จึงทำให้สามารถอ้างอิงประโยคคำสั่งที่ต้องการเฉพาะได้ รวมถึงทำให้ประโยคคำสั่งเหล่านั้นง่ายต่อการอ่าน วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ตัวแปร (Variables) ในความเป็นจริงเราได้ไม่จำเป็นต้องกำหนดตัวแปรทุกตัวที่ใช้งานในอัลกอริทึมก็ได้ ด้วยการกำหนดชื่อที่สามารถสื่อความหมายได้เข้าใจในตัวข้อมูลเอง หรือที่เรียกว่า Intelligent Data Names อย่างไรก็ตาม ก็มีกฎเกณฑ์การตั้งชื่อตัวแปรเพื่อใช้งานในอัลกอริทึมอยู่ 3 ประการด้วยกันคือ1. หากเป็นไปได้ไม่ควรตั้งชื่อเป็นตัวอักขระตัวเดียว เช่น A, B, C 2. ไม่ควรใช้คำทั่วไปที่มีความหมายเฉพาะ (Generic Names) มาตั้งเป็นชื่อตัวแปร เช่น count, sum, total, row, column, file เป็นต้น 3. หากจำเป็นต้องใช้คำย่อก็ควรตั้งชื่อให้สื่อความหมายให้ดี เช่น คำย่อ stdCntใช้แทน StudentCount วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
การสร้างประโยคคำสั่ง (Statement Constructs) สำหรับการสร้างประโยคคำสั่ง โดยเฉพาะชุดคำสั่งสำหรับการโปรแกรมเชิงโครงสร้าง จะมีรูปแบบการสร้างเพียง 3 รูปแบบเท่านั้น ซึ่งประกอบด้วยประโยคคำสั่งต่างๆ ต่อไปนี้ 1. แบบเรียงลำดับ (Sequence) 2. แบบเลือกทำงาน (Selection) 3. แบบทำงานซ้ำ (Repetition/Loop) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
Start Condition T F Statement 1 Statement 2 Statement 1 Statement 2 Statement 3 Stop (a) แบบเรียงลำดับ (Sequence) (b) แบบเลือกการทำงาน (Selection) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
F F Condition Statement 1 T Condition Statement 1 T (a) แบบทำงานซ้ำด้วย DoWhile Loop (b) แบบทำงานซ้ำด้วย Repeat…Until Loop วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
อัลกอริทึมที่ 2.2 ตัวอย่างอัลกอริทึมการหาส่วนเบี่ยงเบนมาตรฐานจากค่าเฉลี่ย โดยสังเกตอัลกอริทึมนี้ดีๆ จะพบว่าไม่มีพารามิเตอร์ ไม่มีคำอธิบาย และไม่มีการประกาศค่าตัวแปรใดๆ โดยชนิดของตัวแปรและจุดประสงค์ได้ถูกกำหนดไว้อย่างเรยบง่ายบนชื่อที่สามารถสื่อความหมายในตัวเอง • Algorithm deviation • pre nothing • post average and numbers with their deviation printed • loop (not end of file) • 1 read number into array • 2 add number to total • 3 increment count • 2 end loop • 3. set average to total / count • 4 print average • 5 Loop (not and of array) • 1 set devFromAve to array element - average • 2. print array element and devFromAve • 6. loop • end deviation วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
ความรู้เกี่ยวกับข้อมูลและนามธรรม (The Abstract Data Types) การเขียนโปรแกรมในอดีต เป็นการเขียนโปรแกรมในรูปแบบไม่มีโครงสร้าง หรือที่เรียกว่าการเขียนโปรแกรมแบบสปาเก็ตตี (Spaghetti code) และการเขียนโปรแกรมจะมีรูปแบบการเขียนที่เชื่อมโยงกระโดดไปมาดูยุ่งเหยิงพันกันไปกันมาอย่างเช่นเส้นสปาเก็ตตีที่เสริร์ฟอยู่บนจานนั้นเอง และต่อมาในราวปี ค.ศ. 1970 ก็ได้มีการพัฒนาหลักการการเขียนโปรแกรมเชิงโครงสร้างขึ้นมา และด้วยเทคนิคดังกล่าว จึงทำให้การเขียนโปรแกรมดูเป็นระบบ ระเบียบ ตรวจสอบง่าย ซึ่งก็คือแนวคิดการโปรแกรมแบบโมดูล (Modular Programming) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ข้อมูลเชิงเดี่ยวและเชิงประกอบ (Atomic and Composite Data) ข้อมูลเชิงเดี่ยว (Atomic Data) คือข้อมูลที่ประกอบด้วยค่าเดียวที่ไม่สามารถแบ่งข้อมูลนี้ออกไปเพื่อสื่อความหมายได้อีก เช่น เลขจำนวนเต็ม 4562 ก็คือค่าเลขจำนวนเต็มเพียงค่าหนึ่งเท่านั้น สำหรับสิ่งที่อยู่ตรงกันข้ามคือข้อมูลเชิงประกอบ (Composite Data) โดยข้อมูลประกอบนั้นสามารถทำการแตกออกเป็นฟิลด์ย่อย (Subfields) และสิ่งที่แตกออกไปมีความหมายด้วย เช่น หมายเลขโทรศัพท์ที่เป็นตัวเลขส่วนๆ ได้คือ ตัวเลข 3 ตัวแรกที่รหัสจังหวัด ส่วนที่เหลือคือเบอร์หมายเลข วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ชนิดของข้อมูล (Data Type) ชนิดของข้อมูลประกอบด้วย 2 ส่วนด้วยกันคือ กลุ่มของข้อมูล (Data)และโอเปอเรชัน (Operations) ที่สามารถปฏิบัติการบนข้อมูลได้ เช่น ชนิดของข้อมูลแบบจำนวนเต็ม (Integer) ซึ่งก็คือเลขจำนวนเต็มในช่วงต่างๆ สิ่งเหล่านี้คือกลุ่มของข้อมูล ในขณะที่โอเปอเรชันที่ใช้จัดการกับกลุ่มข้อมูลเลขจำนวนเต็มเหล่านี้ก็คือ การบวก (+), การลบ (-), การคูณ (*), การหาร (/) และรวมถึงโอเปอเรชันอื่นๆ ที่ต้องการนำมาใช้งาน วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
โครงสร้างข้อมูล (Data Structure) โครงสร้างข้อมูล คือ การรวมกันของข้อมูลเชิงเดี่ยวและข้อมูลเชิงประกอบเข้าด้วยกันเป็นกลุ่มพร้อมกับการกำหนดความสัมพันธ์ คำว่า “โครงสร้าง (Structure)” มีความหมายว่า กลุ่มข้อมูลที่บรรจุเข้าด้วยกัน ถ้ามีการรวมกันของข้อมูลในโครงสร้างแล้ว เราก็สามารถกำหนดความสัมพันธ์ให้กับข้อมูลเหล่านั้นให้เป็นไปตามกฎที่ตั้งขึ้นได้ และด้วยภาษาโปรแกรม ส่วนใหญ่แล้วมักสนับสนุนโครงสร้างข้อมูลหลายรูปแบบด้วยกัน รวมถึงโปรแกรมในยุคใหม่ที่อนุญาตให้โปรแกรมเมอร์สามารถสร้างโครงสร้างข้อมูลใหม่ๆ เพื่อใช้งานกับแอปพลิเคชันตามต้องการได้ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
รูปที่ 2.4 รายละเอียดโครงสร้างข้อมูลแบบอาร์เรย์และเรคอร์ด อาร์เรย์ (Array) อาร์เรย์ (Array) ชุดข้อมูลต้องเป็นค่าชนิดใดชนิดหนึ่ง ซึ่งหมายความว่า ชุดข้อมูลจะต้องเป็นชนิดเดียวกัน (Homogeneous) โดยชนิดของข้อมูลสามารถอธิบายลักษณะตัวข้อมูลได้โดยตรง เป็นการรวมกันของชุดข้อมูลที่มีความแตกต่างกันลงในโครงสร้างหนึ่ง ด้วยการใช้คีย์ระบุตำแหน่ง ลำดับตำแหน่งมีความสัมพันธ์กับข้อมูลที่จัดเก็บ เช่น อาร์เรย์ที่ใช้จัดเก็บข้อมูลของเดือน คือมกราคมถึงธันวาคม ดังนั้นลำดับตำแหน่งเดือนกับข้อมูลที่จัดเก็บภายในจะสัมพันธ์กัน เช่น ลำดับที่ 2 คือเดือนกุมภาพันธ์ เป็นต้น ไม่มีความสัมพันธ์ เนื่องจากลำดับตำแหน่งก่อนหรือหลังภายในเรคอร์ดจะไม่มีความสัมพันธ์ใดๆ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
รูปที่ 2.5 โครงสร้างข้อมูลชนิดต่างๆ (a) แมทริกซ์ (b) ลิสต์แบบเชิงเส้น (d) กราฟ (c) ทรี วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
ชนิดข้อมูลนามธรรม (Abstract Data Type : ADT) ADT เป็นการเขียนเขียนโค้ดเพื่ออ่านไฟล์ และนำไปจัดเก็บไว้ในไลบรารี (Library) เพื่อให้โปรแกรมเมอร์ทั่วไปสามารถนำไปใช้งานได้ และหนึ่งในวัตถุประสงค์หลักตามหลักวิศวกรรมซอฟต์แวร์ (Software Engineering) ก็คือการเขียนชุดคำสั่งที่สามารถนำกลับมาใช้ได้อีก (Reusable Code) จึงเป็นที่มาของการซ่อนรายละเอียด (Encapsulate) หรือการรวบรวมข้อมูลย่อยต่างๆ เข้าด้วยกันกับเมธอด เพื่อใช้จัดการกับข้อมูลด้วยการแยกออกมาเป็นโมดูลโปรแกรมหรือคลาสออกต่างหาก วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ดังนั้นโปรแกรมใหม่ๆ ที่เขียนขึ้นจึงสามารถนำเมธอดนี้มาใช้งานได้ทันที โดยไม่ต้องมุ่งรายละเอียดเกี่ยวกับการสร้างแต่อย่างใด และด้วยการรวบรวมกันของข้อมูลเข้าด้วยกันกับเมธอดเหล่านี้จึงเรียกว่า ชนิดข้อมูลนามธรรม หรือ ADT นั้นเอง โดยแบ่งเป็น 2 รูปแบบด้วยกันคือ 1. รูปแบบเชิงลอจิคัล (Logical Form) เป็นการนิยามข้อมูลด้วย ADT โดยไม่ยึดติดกับซอฟต์แวร์หรือฮาร์ดแวร์ที่ใช้งาน ถือเป็นพื้นฐานการออกแบบและพัฒนาโปรแกรม 2. รูปแบบเชิงฟิสิคัล (Physical Form) เป็นขั้นการนำไปใช้งาน หรือการนำ ADT มาสร้างด้วยโครงสร้างข้อมูล วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
รูปที่ 2.6 แสดงความสัมพันธ์ระหว่างชนิดข้อมูลเชิงลอจิคัลและฟิสิคัล Data Type ADT: Type Operations Data Item: Logical Form Data Structure: Storage Space Subroutines Data Item: Physical Form วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
การวัดผลอัลกอริทึม (Measuring Algorithm) อัลกอริทึมที่ออกแบบเพื่อนำไปใช้แก้ปัญหาบนงานๆ หนึ่งนั้น โปรแกรมเมอร์จำเป็นต้องมีความเข้าใจหลักพื้นฐานเกี่ยวกับการวัดผลอัลกอริทึม เพื่อจะได้นำอัลกอริทึม เพื่อจะได้นำอัลกอริทึมที่มีประสิทธิภาพไปใช้แก้ปัญหาได้อย่างเหมะสม ดังนั้นเป็นสิ่งที่แน่นอนและยากต่อการปฏิเสธ ก็คือ ปริมาณข้อมูลที่อินพุตเข้ามาในระบบย่อมส่งผลต่อความเร็วในการประมวลผล วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
รูปที่ 2.7 ตัวอย่างตารางแสดงขนาดข้อมูลที่อินพุตกับเวลาที่ใช้ในการทำงาน ขนาดของอินพุต (Input Size) เวลาที่ใช้ในการทำงานเพื่อจัดเรียงชุดตัวเลข (Running Time) 10 ตัว 2 วินาที 100 ตัว 2.1 วินาที 1,000 ตัว 1 นาที 10,000 ตัว 15 นาที จากรูปที่ 2.7 เป็นตัวอย่างตารางแสดงปริมาณข้อมูลที่อินพุตกับเวลาที่ใช้ในการทำงานเพื่อจัดเรียงชุดตัวเลข จะเห็นได้ว่า เวลาที่ใช้ในการทำงาน (Running Time) ของคอมพิวเตอร์จะแปรผันตามขนาดข้องข้อมูลที่อินพุตเข้าไป ดังนั้นขนาดของอินพุต (Input Size) จึงเป็นสิ่งจำเป็นที่เราต้องนำมาพิจารณามากที่สุด เนื่องจากมีผลต่อเวลาที่ใช้ในการประมวลผลนั้นเอง วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
เราสามารถกำหนดได้ว่า เวลาในการทำงาน T อัลกอริทึม แทนด้วยฟังก์ชัน T(n) ที่มีข้อมูลอินพุตเข้ามาจำนวน n ตัว และจากตารางดังรูปที่ 2.8 สามารถนำมาเขียนให้อยู่ในรูปแบบฟังก์ชัน T ไดดังนี้ T(10) = 2 วินาที T(100) = 2.1 วินาที T(1,000) = 1 นาที T(10,000) = 15 นาที จะสังเกตไดว่าเมื่อจำนวนอินพุตมีขนาดเพิ่มขึ้น ค่า T(n) ก็จะเพิ่มขึ้นในอัตราส่วนที่สัมพันธ์กับ n ดังนั้นจึงกล่าวได้ว่า T(n) คือ อันดับของขนาด n (Order of Magnitude) ซึ่งสามารถแทนด้วยสัญลักษณ์บิ๊กโอคือ T(n) = O(n) โดยที่โปแกรมจะใช้เวลาในการทำงานมากน้อยขึ้นอยู่กับขนาดของอินพุต ดังนั้น T(n) = จำนวนเวลาที่ใช้ในการทำงานเพื่อจัดเรียงชุดข้อมูล n ตัว วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
รูปที่ 2.8 กราฟเปรียบเทียบเวลาในการทำงานในกรณี Worst-case, Average-case, และ Best-case เราสามารถวัดฟังก์ชัน T(n) ได้ในกรณีเลวร้ายที่สุด กรณีดีที่สุด หรือกรณีเฉลี่ย หรืออาจวัดได้ทุกกรณี แต่อย่างไรก็ตาม กรณีดีที่สุด (Best-case) ของอัลกอริทึมนั้นไม่ใช้ประเด็นใหญ่ ซึ่งมักไม่ก่อให้เกิดประโยชน์ต่อข้อมูลใดๆ ส่วนกรณีเฉลี่ย (Average-case) จะคำนวณยาก ในขณะโดยทั่วไป T(n) มักพบบ่อยครั้งกรณีเลยร้ายสุด (Worst-case) ดังนั้นการวัดผลอัลกอริทึมจึงมักพิจารณาความซุบซ้อนด้านเวลากรณีเลวร้ายเท่านั้น Time (T) Worst-case Best-case Input (n) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
เกณฑ์เปรียบเทียบเพื่อวัดผลอัลกอริทึมว่าอัลกอริทึมไหนดีกว่ากันอย่างไร อัลกอริทึมที่ดีจะประกอบด้วยคุณสมบัติต่างๆ ดังต่อไปนี้ 1. อัลกอริทึมที่ดีต้องมีความถูกต้อง (Correctness) 2. อัลกอริทึมที่ดีต้องง่ายต่อการอ่าน (Readability) 3. อัลกอริทึมที่ดีต้องสามรถปรับปรุงในอนาคตได้ (Ease of Modification) 4. อัลกอริทึมที่ดีต้องสามารถนำกลับมาใช้ใหม่ได้ (Reusability) 5. อัลกอริทึมที่ดีต้องมีประสิทธิภาพ (Efficiency) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
อัลกอริทึมที่มีประสิทธิภาพจะเกี่ยวข้องกับปัจจัยต่อไปนี้อัลกอริทึมที่มีประสิทธิภาพจะเกี่ยวข้องกับปัจจัยต่อไปนี้ 1. เวลาที่ใช้ในการทำงาน (Running Time) 2. หน่วยความจำที่ใช้ (Memory Requirement) 3. เวลาที่ใช้ในการคอมไพล์โปรแกรม (Compile Time) 4. เวลาที่ใช้ในการติดต่อสื่อสาร (Communication Time) แน่นอนว่า ความเร็วในการทำงานย่อมขึ้นอยู่กับขนาดอินพุติที่เข้ามา โดยกำหนดให้ปัจจัยอื่นๆ คงที่ ดังนั้นจึงสรุปได้ว่า เวลาในการทำงานเป็นฟังก์ชันของอินพุต วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ประสิทธิภาพของอัลกอริทึม (Algorithm Efficiency) การพิจารณาประสิทธิภาพของอัลกอริทึมจากฟังก์ชั่นที่ให้มา ด้วยการพิจารณาจากจำนวนอิลิเมนต์ (Elements) ที่ถูกโปรเซส หรือจากจำนวนรอบการทำงานของตัวดำเนินการนั้นๆ โดยประสิทธิของอัลกอริทึม เราจะแทนด้วยฟังก์ชันดังนี้ และหากฟังก์ชันนั้นเป็นฟังก์ชันแบบเชิงเส้น (Linear) ไม่มีการทำงานในลักษณะลูป (Loop) ประสิทธิภาพของฟังก์ชันนี้ก็คือจำนวนชุดคำสั่งที่บรรจุอยู่ภายในทั้งหมด f(n) = efficiency วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ลูปแบบเชิงเส้น (Linear Loop) ลักษณะการทำงานภายในลูปเชิงเส้น จะมีการเพิ่มค่าหรือลดค่าภายในลูปคงที่ จนกระทั่งครบจำนวนรอบที่กำหนดไว้ โดยจากตัวอย่างโปรแกรมวงจรลูปต่อไปนี้จะเป็นการเพิ่มค่าลูป (i++) ด้วยการเพิ่มค่าทีละหนึ่งในแต่ละรอบจนกว่าจะครบรอบตามที่กำหนด For (i = 0. i < 1000; i++) application code วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ลูปแบบลอการิธมิค (Logarithmic Loop) ลักษณะการทำงานภายในลอการิธมิค จะมีการเพิ่มค่าหรือลดค่าสองเท่าด้วยการคูณ (เพิ่มค่าสองเท่า) หรือการหาร (ลดค่าสองเท่า) จากตัวอย่างต่อไปนี้ กรณีทั้งสอง ผลที่ได้ก็คือแต่ละรอบของค่า I จะมีค่าเพิ่มเป็นสองเท่าจากลูปที่คูณกัน และลดลงครึ่งหนึ่งจากลูปการหาร Multiply Loops For (i = 1. i <= 1000; i*=2) application code Divide Loops For (i = 1000 i >= 1 ; i /=2) application code วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ลูปแบบซ้อน (Nested Loop) ลักษณะการทำงานของลูปแบบซ้อน ก็คือภายในลูปจะมีลูปซ้อนอีกลูปหนึ่ง สำหรับในกรณีวิเคราะห์ลูปซ้อนลูป จะต้องพิจารณาว่ามีจำนวนรอบการทำงานของลูปเท่าไรจนกระทั่งเสร็จสิ้น ยอดรวมที่ได้ก็คือผลคูณทั้งสิ้นของจำนวนรอบของลูปชั้นใน (inner Loops) กับจำนวนลูปชั้นนอก (Outer Loop) โดยผลก็คือ ลูปแบบซ้อนสามารถแบ่งเป็น 3 รูปแบบย่อยด้วยกันดังนี้ Iterations = outer loop iterations x inner loop iterations วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ลูปแบบซ้อนชนิดลอการิธมิคเชิงเส้น (Linear Logarithm) ให้พิจารณาชุดคำสั่งภายในลูปชั้นใน ซึ่งมีการเพิ่มค่าเป็นสองเท่าด้วยการคูณกัน ในขณะที่ลูปชั้นนอกจะเป็นแบบเชิงเส้นที่มีการเพิ่มค่าทีละหนึ่งในลักษณะคงที่ ดังนั้นจำนวนรอบของลูปชั้นในก็คือ log10 นั้นเอง แต่ลูปชั้นในถูกควบคุมโดยลูปชั้นนอกอีกชั้นหนึ่ง ดังนั้นสูตรที่ได้จะต้องคูณด้วยจำนวนรอบของลูปชั้นนอกด้วย 10 ก็จะได้ 10log10 เมื่อเขียนฟังก์ชั่นจะได้ for (i = 0 ; i < 10 ; i++) for (j = 1 ; j <= 10 ; j *= 2) application code f(n) = n log n วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ลูปแบบซ้อนชนิดกำลังสอง (Quadratic) ลักษณะการทำงานของลูปชนิดนี้ แต่ละลูปจะทำการเอ็กซีคิวต์ในจำนวนรอบที่เท่ากัน จากตัวอย่างจะเห็นได้ว่า ลูปชั้นนอกจะทำงาน 10 รอบ ในขณะที่แต่ละรอบการทำงานของลูปชั้นในการทำงานจำนวน 10 รอบเช่นกัน ดังนั้นคำตอบที่ได้ก็คือ 100 ซึ่งได้มาจาก 10x10 ผลลัพธ์จากการคูณด้วยกันระหว่างลูปชั้นในและลูปชั้นนอก ก็จะได้สูตรตามฟังก์ชันดังนี้ for (i = 0 ; i < 10 ; i++) for (j = 0 ; j < 10 ; j++) application code f(n) = n2 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ลูปแบบซ้อนกำลังสองชนิดขึ้นต่อกัน (Dependent Quadratic) ลักษณะการทำงานของลูปชนิดนี้ จำนวนรอบการทำงานของลูปชั้นในจะขึ้นอยู่กับลูปชั้นนอก และจากตัวอย่างจะเห็นได้ว่าลูป j ซึ่งเป็นลูปชั้นใน จะมีรอบการทำงานที่ขึ้นอยู่กับ iซึ่งเป็นลูปชั้นนอก โดยจำนวนรอบการทำงานในชุดคำสั่งของลูปชั้นในคำนวณได้ดังนี้ for (i = 0 ; i < 10 ; i++) for (j = 0 ; j < i; j++) application code 1 + 2 + 3 + . . . + 9 + 10 = 55 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
เมื่อดำเนินการคำนวณค่าเฉลี่ยของรอบการทำงานภายในลูปชั้นใน ก็จะมีค่าเท่ากับ 5.5 (55/10) ซึ่งผลที่ได้ก็จะมีค่าตรงกับจำนวนรอบ (10) บวกด้วย 1 หารด้วย 2 สำหรับจำนวนรอบการทำงานทั้งหมด ก็คือผลคูณระหว่างรอบการทำงานภายในลูปชั้นในกับรอบการทำงานของลูปชั้นนอกที่เป็นไปได้ตามลูปซ้อนกำลังสองที่ขึ้นต่อกัน ก็จะได้สูตรดังนี้ n+1 2 n+1 f(n) = 2 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
สัญลักษณ์บิ๊กโอ (Big-O Notation) ในการวัดประสิทธิภาพของอัลกอริทึม หากยึดหลักเวลาการทำงานเป็นสำคัญ คงเป็นเรื่องยากมากที่จะทำให้เห็นถึงความแตกต่างในเงื่อนเวลา โดยเฉพาะคอมพิวเตอร์ในปัจจุบันมีการประมวลผลที่รวดเร็วมากสามารถประมวลผลชุดคำสั่งได้มากถึง 1 ล้านคำสั่งภายในหนึ่งวินาที ดังนั้นหากวิเคราะห์อัลกอริทึมสองอัลกอริทึมบนโปรแกรมเดียวกัน เนื่องจากสองอัลกอริทึมทำงานด้วยความเร็วทั้งคู่ จนกระทั้งไม่สามรถแยกแยะให้เห็นถึงความแตกต่างในด้านเวลาได้เลย เพราะจะเป็นสิ่งที่วัดยาก และไม่น่าจะนำมาใช้เป็นเกณฑ์วัดผลอัลกอริทึมเพื่อหาประสิทธิภาพแต่อย่างใด วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ดังนั้นปัจจัยหลักที่จะนำมาใช้เป็นเกณฑ์เพื่อวัดประสิทธิภาพของอัลกอริทึมนั้น จะพิจารณาจาก อัตราการเติบโตของฟังก์ชัน (Growth Rates) ด้วยการพิจารณาปัจจัยของขนาดเป็นสำคัญ ดังนั้นเกณฑ์การวัดประสิทธิภาพของอัลกอริทึม นี้ก็คือ ฟังก์ชันบิ๊กโอ (Big-O) ที่มาจากคำว่า Order of Magnitude โดยอัตราการเติบโตของฟังก์ชั่นที่แสดงในรูปที่ 2.11 จะเห็นว่าฟังก์ชันลอการิทึมมีอัตราการเติบโตต่ำที่สุด ในขณะที่ฟังก์ชันเอ็กซ์โพเนนเซียลและแฟคตอเรียลมีอัตราการเติบโตสูงสุด และถือว่าสินเปลืองที่สุด วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
รูปที่ 2.11 ตารางแสดงความแตกต่างของอัตราการเติบโตในแต่ละฟังก์ชัน O(f(n)) f(50) f(50) O(log n ) 5.64 6.64 O(n) 50 100 O(n log n ) 282 664 O(n2) 2500 10,000 O(n3) 12,500 100,000 O(2n) 1,126 x 1015 1.27 x 1030 O(n!) 3.0 x 1064 9.3 x 10157 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
อัลกอริทึม 2.3 ซูโดโค้ดการคำนวณคะแนนเฉลี่ย การวัดประสิทธิภาพจึงเกี่ยวข้องกับฟังก์ชันของจำนวนข้อมูล (f(n)) ซึ่งอาจเขียนแทนด้วย T(n)= O(f(n)) ที่ใช้เป็นฟังก์ชันแสดงการเปลี่ยนแปลงของเวลาในการทำงานว่าคิดเป็นสัดส่วนเท่าไรกับจำนวนอินพุต ให้พิจารณารายละเอียดจากอัลกอริทึมที่ 2.3 ต่อไปนี้ ที่ว่าด้วยการคำนวณ T(n) ด้วยการถอดรหัสคำสั่งในอัลกอริทึมเพื่อหาเวลาในการปฏิบัติงานของชุดคำสั่งที่แสดงไว้ดังรูปที่ 2.12 • set sum to zero • set i to zero • dowhilei < n • 1 add 1 to i • 2 add score(i) to sum • enddo • compute mean = sum / n วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
รูปที่ 2.12 ตารางแสดงเวลาในการปฏิบัติงานของชุดคำสั่งในอัลกอริทึมที่ 2.3 เลขลำดับคำสั่ง เวลาในการทำงาน คำอธิบาย 1 1 ถูกทำงาน 1 ครั้ง 2 1 ถูกทำงาน 1 ครั้ง 3 n + 1 ถูกทำงาน n+1 ครั้ง เนื่องจากต้องมีการเปรียบเทียบตัวแปร iกับตัวแปร n เพิ่มอีก 1 ครั้ง เพื่อให้หลุดจากลูป 3.1 n ถูกทำงาน nครั้ง 3.2 n ถูกทำงาน nครั้ง 4 - ไม่ได้นำมาคิด เนื่องจากเป็นตัวปิดลูป dowhile 5 1 ถูกทำงาน nครั้ง รวม 3n + 4 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
รูปที่ 2.15 ตารางแสดงเวลาในการปฏิบัติงานของชุดคำสั่งในอัลกอริทึมที่ 2.3 ประสิทธิภาพของฟังก์ชัน (Efficiency) บิ๊กโอO(f(n)) จำนวนรอบการทำงาน(Iteration) เวลาที่ใช้ในการทำงานโดยประมาณ (Running time) อัลกอริทึม(Logarithmic) O(log n ) 14 ระดับไมโครวินาที เชิงเส้น (Linear) O(n) 10,000 ระดับวินาที ลอการิทึมเชิงเส้น (Linear Logarithmic) O(n log n ) 140,000 ระดับวินาที กำลังสอง (Quadratic) O(n2) 10,0002 ระดับนาที โพลีโนเมียล(Polynomial) O(n3) 10,000k ระดับชั่วโมง เอ็กซ์โพเนนเซียล(Exponentail) O(2n) 210,000 มากจนยากต่อการระบุได้ชัดเจน แฟคตอเรียล(Factorial) O(n!) 10,000! มากจนยากต่อการระบุได้ชัดเจน วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
รูปที่ 2.16 กราฟแสดงความสัมพันธ์ระหว่างจำนวนข้อมูลกับเวลาในการทำงานของฟังก์ชันต่างๆ (Big-O Range) O(n) n3 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
จึงสรุปได้ว่า ควรเลือกอัลกอริทึมที่มีอัตราการเติบโตต่ำที่สุดเมื่อปริมาณอินพุตของข้อมูลจำนวนมาก เช่น อัลกอริทึม O(n) แทนที่จะเลือก O(n2) ดังนั้นแนวทางในการวัดผลประสิทธิภาพของอัลกอริทึมจะวัดจาก 1. ขนาดของอินพุต 2. ให้ละเลยค่าคงที่ที่อยู่ในสภาพแวดล้อมนั้น 3. สนใจเฉพาะกรณีเลวร้ายสุดเท่านั้น (Worst-case) 4. มองข้ามขนาดของอินพุตที่มีจำนวนน้อยๆ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
ตัวอย่างการวิเคราะห์บิ๊กโอ (Big-O Analysis Example) การบวกของแมทริกซ์(Add Square Matrices) การนำสองแมทริกซ์มาบวกกันนี้ จะดำเนินการด้วยการนำอิลิเมนต์ที่ตรงกันระหว่างแมทริกซ์แรกกับแมทริกซ์ที่สองมารวมกัน โดยผลลัพธ์ที่ได้จะเก็บไว้ในแมทริกซ์ที่สาม หลักการดังกล่าวจะเป็นไปตามวิธีการดังรูปที่ 2.17 ในขณะที่อัลกอริทึมที่ 2.4 คือซูโดโค้ดที่แสดงถึงการบวกของแมทริกซ์นี้ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
รูปที่ 2.17 แสดงวิธีการบวกแมทริกซ์ 4 2 1 6 1 7 10 3 6 + = 0 -3 4 3 2 -1 3 -1 3 5 6 2 4 6 2 9 12 4 • Algorithm addMatrix (matrix1, matrix1, size, matrix3) • Add matrix1 to matrix2 and place results in matrix3 • pre matrix1 and matrix2 have data • size is number of columns or rows in matrix • post matrices added-result in matrax3 • loop (not end of row) • 1 loop (not end of column) • 1 add matrix1 and matrix2 cells • 2 store sum in matrix3 • 2 end loop • end loop • end addMatrix อัลกอริทึมที่ 2.4 การบวกของสองแมทริกซ์ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202