560 likes | 1.43k Views
Chapter 7 Algorithm and Growth of Functions. 1. Algorithm. ขั้นตอนวิธี( algorithm ) หมายถึง กระบวนการต่างๆ ที่เป็นลำดับขั้นตอน ในการแก้ปัญหา โดยมีขั้นตอนที่จำกัดและแน่นอน ตัวอย่าง : กำหนดลำดับ { a i }= a 1 ,…, a n โดย a i N , จงหาค่าสมาชิกในลำดับที่มีค่ามากที่สุด
E N D
Algorithm ขั้นตอนวิธี(algorithm) หมายถึง กระบวนการต่างๆ ที่เป็นลำดับขั้นตอน ในการแก้ปัญหา โดยมีขั้นตอนที่จำกัดและแน่นอน ตัวอย่าง:กำหนดลำดับ {ai}=a1,…,anโดย aiN, จงหาค่าสมาชิกในลำดับที่มีค่ามากที่สุด ขั้นตอนวิธี ทำได้โดย: • กำหนดค่าของตัวแปรชั่วคราวv (ตัวแปร v นี้ใช้เก็บค่าที่มากที่สุดของสมาชิกตั้งแต่ตัวแรกจนถึงตัวปัจจุบัน) ให้กับค่าของสมาชิกa1 • พิจารณาค่าของสมาชิกตัวต่อไปในลำดับ แทนด้วยai • ถ้าai>v, ดังนั้น กำหนดค่าตัวแปรvใหม่ให้เท่ากับค่าai • ทำซ้ำขั้นที่ 2. และ 3. จนกระทั่งไม่มีสมาชิกในลำดับเหลือแล้ว จากนั้นจึงส่งค่าตัวแปรvกลับไปเป็นคำตอบที่ต้องการ
Executing the Max algorithm • เมื่อเขียนขั้นตอนวิธีที่ใช้แก้ปัญหาเรียบร้อยแล้ว สามารถตรวจสอบขั้นตอนผลลัพธ์ที่ได้ โดยการเขียนผลลัพธ์ที่ได้จากแต่ละขั้นตอนลงในกระดาษ • กำหนด {ai}=7,12,3,15,8 จงหาสมาชิกที่มีค่าที่มากที่สุด… • ให้v = a1 = 7 • พิจารณาไปที่สมาชิกตำแหน่งถัดไป: a2 = 12 • a2>v หรือไม่? ถ้าใช่, กำหนดค่าตัวแปรv = 12 • พิจารณาไปที่สมาชิกตำแหน่งถัดไป : a3 = 3 • 3>12 หรือไม่? ไม่ใช่, ดังนั้นค่าของตัวแปรvยังคงเป็นค่าเดิม…. • 15>12 หรือไม่? ใช่, กำหนดค่าตัวแปรv=15 ทำเช่นนี้ไปจนครบทุกตัว …
Algorithm Characteristics Some important general features of algorithms: • Input. Information or data that comes in. • Output. Information or data that goes out. • Definiteness. Algorithm is precisely defined. • Correctness.Outputs correctly relate to inputs. • Finiteness. Won’t take forever to describe or run. • Effectiveness. Individual steps are all do-able. • Generality. Works for many possible inputs. • Efficiency.Takes little time & memory to run.
Pseudocode • เป็นการอธิบาย algorithm โดยเขียนเป็นคำสั่งต่างๆ เพื่ออธิบายได้ละเอียดขึ้น ภาษาเทียมนี้ไม่ใช่ภาษา computer แต่มีรูปแบบค่อนข้างคล้ายคลึงกับบางภาษาทำให้เขียนเป็น Program Computer ได้ง่ายขึ้น • โครงสร้างการเขียน algorithm ใช้ตัวเลขกำกับ(หรืออาจละไว้)ในแต่ละระดับการทำงาน และใช้การเยื้องหน้า แสดงการทำงานลำดับถัดไปภายในระดับเดียวกัน
procedurename(argument: type) variable:=expression {informal statement} beginstatementsend {comment} ifconditionthenstatement [elsestatement] for variable:=initial value to final valuestatement whileconditionstatement returnexpression Pseudocode Language STATEMENTS
คำสั่งที่พบใช้บ่อย 1. Assignment statement กำหนดค่า ตัวแปร:=นิพจน์ เป็นการคำนวณค่าจากนิพจน์ ผลลัพธ์ที่ได้เก็บไว้ภายใต้ชื่อตัวแปรด้านซ้าย 2. Condition Statement เงื่อนไขทางเลือก IF เงื่อนไขตรรกะ THEN true-block ELSE false-block เป็นการเช็คเงื่อนไข ถ้า จริง พิจารณา Then ทำ true block แต่ถ้าเงื่อนไข เท็จ พิจารณา Else ทำ false block
คำสั่งที่พบใช้บ่อย 3. Repetition statement การทำงานซ้ำๆ หรือ เป็นการวน Loop WHILE (condition) repeat - block เป็นการทำซ้ำที่ไม่รู้ว่าทำกี่รอบ แต่มีเงื่อนไขในการหยุดวน ถ้าเงื่อนไขเป็น จริง ทำภายใน loop (repeat-block) ถ้าเงื่อนไขเป็น เท็จ ออกจาก loop FORค่าเริ่มต้น TOค่าสิ้นสุด repeat - block เป็นการทำซ้ำที่ทราบจำนวนรอบในการวนซ้ำแน่นอน
Max procedure in pseudocode proceduremax(a1, a2, …, an: integers) v:=a1{กำหนดตัวแปร v ไว้ใช้เก็บค่ามากที่สุด} fori:= 2 ton {พิจารณาสมาชิกตัวถัดไปที่เหลืออยู่} ifai > vthen v:=ai {พบค่าที่มากกว่าตัวแปร v ?} {เมื่อวนลูปครบถึงสมาชิกตัวสุดท้ายแล้ว ค่าของตัวแปรv คือค่าของสมาชิกที่มีค่ามากที่สุด} returnv
Example task • ขั้นตอนวิธีในการค้นหาข้อมูลในรายการ(List) • กำหนดรายการL ที่มีสมาชิกnตัวซึ่งถูกเรียงลำดับไว้เรียบร้อยแล้ว • กำหนดค่าสมาชิกที่ต้องการค้นหาสมมติเป็นตัวแปรx • พิจารณาว่ามีสมาชิกxอยู่ในรายการหรือไม่ • ถ้าสมาชิกxอยู่ในรายการให้คืนค่าตำแหน่ง(index)ของ x ที่อยู่ในรายการ • จงหาขั้นตอนวิธีที่มีประสิทธิภาพในการแก้ปัญหานี้
Search alg. #1: Linear Search procedurelinear search(x: integer, a1, a2, …, an: distinct integers)i:= 1 {เริ่มที่ตำแหน่งแรกในรายการ}while (i n x ai) {ในขณะที่ยังค้นไม่หมดและยังไม่พบ}i:=i + 1 {เลื่อนไปยังตำแหน่งถัดไป}ifi n then location:=i{ค้นพบค่าที่ต้องการ}elselocation:= 0 {ไม่พบค่าที่ต้องการ}return location {หากค้นพบคืนค่าตำแหน่งที่พบ หรือ หากค้นไม่พบ คืนค่า 0}
Search alg. #2: Binary Search • แนวคิด: ในแต่ละขั้นตอน จะเริ่มต้นด้วยการหาจุดกึ่งกลางก่อน เพื่อตัดครึ่งส่วนที่ไม่เกี่ยวข้องออกไป ทำเช่นนี้ไปจนกระทั่งจุดเริ่มต้นมากกว่าจุดสุดท้าย(พิจารณาสมาชิกหมดทุกตัวแล้ว) <x <x <x >x
Search alg. #2: Binary Search procedurebinary search(x:integer, a1, a2, …, an: distinct integers)i:= 1 {กำหนดจุดปลายช่วงการค้นหาด้านซ้ายมือ}j:=n{กำหนดจุดปลายช่วงการค้นหาด้านขวามือ}while i<j begin{ในขณะที่ช่วงการค้นหายังมีสมาชิก >1 ตัว}m:=(i+j)/2 {คำนวณหาจุดกลาง}ifx>amtheni := m+1 else j := mendifx = aithenlocation:=ielselocation:= 0returnlocation
สมาชิกที่อยู่กึ่งกลางสมาชิกที่อยู่กึ่งกลาง Algorithm Examples ต้องการค้นหาตัวอักษร‘k’ ช่วงของการค้นหา a c d f g h k l m o p r s u v x z
สมาชิกที่อยู่กึ่งกลางสมาชิกที่อยู่กึ่งกลาง Algorithm Examples ต้องการค้นหาตัวอักษร ‘k’ ช่วงของการค้นหา a c d f g h k l m o p r s u v x z
สมาชิกที่อยู่กึ่งกลางสมาชิกที่อยู่กึ่งกลาง Algorithm Examples ต้องการค้นหาตัวอักษร ‘k’ ช่วงของการค้นหา a c d f g h k l m o p r s u v x z
สมาชิกที่อยู่กึ่งกลางสมาชิกที่อยู่กึ่งกลาง Algorithm Examples ต้องการค้นหาตัวอักษร ‘k’ ช่วงของการค้นหา a c d f g h k l mo p r s u v x z
สมาชิกที่อยู่กึ่งกลางสมาชิกที่อยู่กึ่งกลาง Algorithm Examples ต้องการค้นหาตัวอักษร ‘k’ ช่วงของการค้นหา a c d f g h k l mo p r s u v x z ค้นพบตัว kที่ต้องการ!
Time Complexity • สิ่งที่เราสนใจในการวิเคราะห์ขั้นตอนวิธี(Algorithm) คือประสิทธิภาพของขั้นตอนวิธี ซึ่งพิจารณาจาก: 1. เวลา(time)ที่ใช้ในการทำงานขั้นตอนวิธีนั้น 2. พื้นที่หน่วยความจำ(memory space)ที่ขั้นตอนวิธีนั้นใช้ โดยในบทนี้จะพิจารณาประสิทธิภาพของขั้นตอนวิธีจากการคำนวณหาฟังก์ชั่นความซับซ้อนของเวลา(Time complexity)
Time Complexity • เวลาที่ใช้ในการทำงานของขั้นตอนวิธี จะพิจารณาจากการประมาณจำนวนครั้งของการดำเนินการ(number of operations)ที่กระทำต่อข้อมูลเข้าจำนวน nตัว โดยการดำเนินการหลักที่ใช้ในขั้นตอนวิธีได้แก่ • Assignment(:=) • Comparison(=, ≠,<, >, ≤, ≥) • Arithmetic operation(+, -, ×, ÷) • Logical operations (and, or, not) • กำหนดให้f(n)แทนฟังก์ชั่นของเวลาที่ใช้ในการทำงานของขั้นตอนวิธีเมื่อมีข้อมูลเข้าขนาดnตัวซึ่งเราจะเรียกf(n)ว่าฟังก์ชั่นความซับซ้อนของเวลา(time complexity)ของขั้นตอนวิธี
Orders of Growth ในการวิเคราะห์เวลาที่ขั้นตอนวิธีใช้ เราจะพิจารณาจากกรณีที่แย่ที่สุด(worst case)หรือกรณีที่ขั้นตอนวิธีนั้นใช้เวลาในการทำงานอย่างมากที่สุด กับข้อมูลเข้าขนาด n ตัว ก่อนอื่นจึงต้องพิจารณาฟังก์ชั่นของเวลาและประมาณการว่าฟังก์ชั่นนั้นมีการเติบโตเร็วเพียงใด เพราะเราจะกล่าวว่าขั้นตอนวิธีหนึ่งมีประสิทธิภาพมากกว่าอีกขั้นตอนวิธีหนึ่ง หากว่าขั้นตอนวิธีนั้น มีฟังก์ชั่นของเวลาในการทำงาน(ในกรณีที่แย่ที่สุด)เป็นอันดับการเติบโตที่ต่ำกว่า ถ้าฟังก์ชั่นf(n) โตเร็วกว่าg(n), ดังนั้นf(n) จะค่อยๆมีค่ามากกว่าg(n) ที่ค่าใดค่าหนึ่ง (เมื่อ n มีค่ามากเพียงพอ) การพิจารณาการเติบโตของฟังก์ชั่นนี้ ใช้ประโยชน์ในการแสดงว่า การออกแบบโปรแกรมแบบหนึ่งดีกว่า(มีประสิทธิภาพดีกว่าคือ ใช้เวลาและหน่วยความจำน้อยกว่า) หรือแย่กว่าอีกแบบหนึ่งได้ 21
ขนาดของข้อมูลเข้า โปรแกรม A โปรแกรม B n 10n+12 n2+1 1 22 2 112 101 10 100 1,012 10,001 1,000 10,012 1,000,001 100,000 1,000,012 10,000,000,001 Orders of Growth - Motivation • สมมติโปรแกรมฐานข้อมูล A ใช้เวลาfA(n)=10n+12 ไมโครวินาที ในการประมวลผลข้อมูลnเรคคอร์ด ในขณะที่โปรแกรม Bใช้เวลา fB(n)=n2+1 ไมโครวินาที ในการประมวลผลข้อมูลnเรคคอร์ด • ท่านจะเลือกใช้โปรแกรมใดเพื่อให้เกิดการใช้เวลาที่น้อยที่สุด A
Visualizing Orders of Growth จากกราฟจะเห็นว่าเมื่อค่า n เพิ่มมากขึ้น ฟังก์ชั่นที่ โตเร็วกว่าจะค่อยๆมีค่า มากกว่าอีกฟังก์ชั่นหนึ่ง fA(n)=10n+12 Value of function fB(n)=n2+1 Increasing n 23
สังเกตว่า 10n+12 มีค่า ไม่น้อยกว่าn เมื่อ n>0 และไม่น้อยกว่า 11nสำหรับทุกๆค่าของ n ที่ n มีน้อยกว่า12 แต่น้อยกว่า 11nเมื่อ n มีค่ามากกว่า 12 Big-O example, graphically cn =11n nk=12 10n+12 10n+12O(n) Value of function n Increasing n 24
Concept of order of growth กล่าวได้ว่าfA(n)=10n+12เป็นอันดับอย่างมากที่สุด n (at mostorder n), หรือO(n) fB(n)=n2+1เป็นอันดับอย่างมากที่สุด n2, หรือO(n2) ฟังก์ชั่นใดๆที่เป็นอันดับ O(n2) เป็นฟังก์ชั่นที่โตเร็วกว่าฟังก์ชั่นใดๆที่มีอันดับ O(n) เมื่อมีจำนวนข้อมูลมากขึ้นฟังก์ชั่นที่มีอันดับ n2จะใช้เวลาในการประมวลผลมากกว่า 25
Example อัลกอริธึมAและBมีtime complexities fและgตามลำดับ โดยกำหนดให้ f(n) = 3 n2 - 3n + 1 และg(n)=n2 จงหาว่าอัลกอริธึมใดเร็วกว่า Solutionขั้นแรก หาค่าของnที่ทำให้f(n)=g(n) ดังนั้น 3 n2 - 3n + 1 = n2 2 n2 - 3n + 1 = 0 (2n - 1)(n - 1) = 0 n = 1/2 หรือn = 1
Example n นำค่าn ที่มีค่ามากกว่ามาพิจารณา นั่นคือn > 1, สมมติให้n = 2 ดังนั้น f(2) = 3(2)2 - 3(2) + 1 = 7 และ g(2) = 22 = 4 ดังนั้นg(n) < f(n) สำหรับทุกค่าn > 1 ดังนั้นg(n)ใช้เวลาน้อยกว่า จึงกล่าวได้ว่าอัลกอริธึมBเร็วกว่า(มีประสิทธิภาพดีกว่า)
The Growth of Functions การเติบโตของฟังก์ชันมักอธิบายในรูปของ big-O notation กำหนดให้ f และ g เป็นฟังก์ชันจาก RR จะกล่าวได้ว่า f(n) เป็น O(g(n))ถ้ามีค่าคงที่ cและkที่ทำให้|f(n)| c |g(n)| เมื่อไรก็ตามที่n k หรือกล่าวได้ว่า“fเป็นอันดับอย่างมากที่สุด(at most order) g”, หรือ“fเป็น O(g)”, “f=O(g)” หรือหมายถึง fO(g) นั่นเอง big-O notationใช้เพื่อแสดงขอบบนของการเติบโตของฟังก์ชันf(n)เมื่อnมีค่ามากขึ้นเรื่อยๆ โดยระบุขอบเขตนี้ด้วยฟังก์ชันg(n)ซึ่งมักจะเขียนในรูปแบบที่ง่ายกว่า f(n) เช่น 2n+5O(n) เมื่อทำการวิเคราะห์ฟังก์ชันความซับซ้อนf(n)และg(n)มักจะมีค่าเป็นบวก ดังนั้น สามารถนิยามbig-Oอย่างง่ายได้ดังนี้ f(n) cg(n)เมื่อไรก็ตามที่ n k 28
The Growth of Functions ถ้าต้องการแสดงว่า f(n)เป็นO(g(n)),ทำได้โดยการหาค่าคงที่ c และkใดๆ หนึ่งคู่ที่สอดคล้องกับนิยาม โดยค่าคงที่ c, k ที่ทำให้นิยามเป็นจริงนั้นอาจจะมีได้หลายค่า เพราะค่าใดๆที่มากกว่าค่า cและ/หรือค่า kก็จะทำให้นิยามของ big-Oยังคงเป็นจริงด้วยเช่นกัน f (n) Value of function k f (n) = O ( g ( n )) c g (n) f(n) c*g(n) , เมื่อ n k n 29
จงแสดงว่า n2 + 10 nO(n2) • ทำได้โดยหาค่าc,k: n>k:n2+10n cn2 • เพราะ n2+10nn2+n2เมื่อ n 10 นั่นคือ • n2 + 10n 2n2สำหรับทุกค่า n 10 จึงได้ว่าc = 2 , k = 10 1400 1200 1000 n2 + 10n 800 Value of function 600 2 n2 400 200 n 0 0 10 20 30 k =10
Does 5n+2 O(n)? Yes Proof: จากนิยามของ Big Oh, ต้องมีค่าc>0 และจำนวนเต็มk>0 ซึ่งทำให้ 5n+2 cnสำหรับทุกๆค่าn k ในการพิสูจน์สามารถเลือกค่าcและk ได้หลายค่า เช่น ถ้าเลือกค่าk=1ดังนั้น 5(1)+2 c = 7 หรือ ถ้าเลือกค่าc=6ดังนั้น 5n+26nดังนั้นn2 นั่นคือ k=2 ไม่ว่ากรณีใดข้างต้น เราสามารถหาค่าc>0 และk>0 ซึ่งทำให้ 5n+2 cnสำหรับทุกๆค่าn k ดังนั้นจึงเป็นไปตามนิยามของ Big Oh จึงสรุปได้ว่า 5n+2 O(n)
Does n2 O(n)? No พิสูจน์โดยวิธีขัดแย้ง(Prove by contradiction) โดยสมมติให้n2 O(n) จากนิยามของ Big Oh, ต้องมีค่าc>0 และจำนวนเต็มk>0 ซึ่งทำให้ 0 n2 cnสำหรับทุกๆค่าn k n2 cnเป็นเท็จเมื่อn ค่ามากกว่า max{c, k}, จึงเกิดการขัดแย้งกับสมมติฐานที่ตั้งไว้ในตอนต้น ดังนั้นไม่มีค่าคงที่c>0 ซึ่งทำให้n2 cnจริงตามเงื่อนไข สำหรับทุกๆค่าn k, ดังนั้น n2 O(n)
Example • จงแสดงว่าf(n) = 7n2เป็น O(n3) เมื่อn 7 จะได้ว่า: 7n2 n3 ดังนั้น เมื่อc = 1 และk = 7: f(n) cn3โดยที่n k • f(n) เป็นO(n3) ข้อสังเกต: ถ้า f(n) เป็นO(n2) แล้วf(n) เป็นO(n3) เพราะฟังก์ชันn3โตเร็วกว่าn2, ดังนั้นn3โตเร็วกว่าf(n) 33
Useful Rules for Big-O c>0, O(cf)=O(f+c)=O(f - c)=O(f)Example: 23*log n เป็นO(log n) ถ้าf1(n)เป็นO(g1(n))และf2(n)เป็นO(g2(n)), ดังนั้น(f1 + f2)(n)เป็นO(max(g1(n), g2(n))) Example: อันดับ(order)ของn2+nคือ?n2มีอันดับเป็นO(n2) , nมีอันดับเป็นO(n)ดังนั้นn2+nมีอันดับO(max(n2,n))นั่นคือn2+nมีอันดับO(n2) สำหรับฟังก์ชันพหุนาม (polynomial)ใดๆ f(n) = aknk + ak-1nk-1 + … + a0, เมื่อ a0, a1, …, akเป็นจำนวนจริง, ฟังก์ชันf(n) มีอันดับเป็น O(nk) Example: อันดับ(order)ของ4n3 + 2n2 + n + 5 คือO(n3) 34
Useful Rules for Big-O • ถ้า f1(n) เป็น O(g(n)) และ f2(n) is O(g(n)), ดังนั้น (f1 + f2)(n) เป็น O(g(n)) Example: อันดับ(order)ของn2+ 3n2+1 คือ?n2เป็น O(n2)3n2 + 1 เป็น O(n2)ดังนั้น n2+ 3n2+1 เป็น O(n2) • ถ้า f1(n) เป็น O(g1(n)) และ f2(n) is O(g2(n)), ดังนั้น(f1f2)(n) เป็น O(g1(n) g2(n)) Example: อันดับ(order)ของ(3n+1)*(2n+log n) คือ?3n+1 เป็น O(n)2n+log n เป็น O(n)(3n+1)*(2n+log n) เป็น O(n*n)=O(n2)
The Growth of Functions ตัวอย่าง:จงแสดงว่า f(x) = x2 + 2x + 1 เป็น O(x2) เมื่อ x 1 จะได้ว่า: x2 + 2x + 1 x2 + 2x2 + x2 x2 + 2x + 1 4x2 ดังนั้น เมื่อ c = 4 และ k = 1 โดยนิยาม f(x) cx2โดยที่ x k • f(x) เป็น O(x2)# ตัวอย่าง: จงใช้ big-O ประมาณค่าของผลบวกของจำนวนเต็มบวก n ตัวแรก วิธีทำ ผลบวกจำนวนเต็มบวก n ตัวแรก เขียนแทนด้วย 1 + 2 + … + n 1 + 2 + … + n = n ( n + 1 ) / 2 ดังนั้น 1 + 2 + … + n = n2 /2 + n/2 n2 /2 + n2 /2 = n2 | 1 + 2 + … + n | | n2| เมื่อ C = 1 ,k = 1 โดยนิยาม จะได้ 1 + 2 + … + n เป็น O(n2 ) 36
Example ตัวอย่าง จงใช้ big- O ประมาณค่า f(n) = n! วิธีทำ n! = 1.2.3 …n เมื่อ n 1 n! = 1.2.3 …n n.n…n = nn ดังนั้น | n! || nn | เมื่อ C = 1 ,k = 1 โดยนิยาม จะได้ n! = O(nn) ตัวอย่าง จงใช้ big- O ประมาณค่า f(n)= log(n!) จาก n! nn ดังนั้น log n! log nn= n log n | log n! | | n log n | เมื่อ C = 1 ,k = 1 โดยนิยาม ดังนั้น log n! = O(n log n)
Example ตัวอย่างจาก n < 2n เมื่อ n เป็นจำนวนเต็มบวก(สามารถพิสูจน์ได้โดยใช้อุปนัยเชิงคณิตศาสตร์) จะได้ว่า | n | < | 2n | ดังนั้น n = O(2n) โดย k = C= 1 log n < n (เมื่อใส่ log ฐาน 2 ) | log n | | n | จะได้ log n = O(n) โดย k=C=1
Example จงประมาณค่า Big-O ของฟังก์ชัน f(n) =3n log(n!) + (n2 +3)log n เมื่อ n เป็นจำนวนเต็มบวก วิธีทำ จะต้องพิจารณา ค่า Big-O ของ 3n log(n!) และ (n2 +3)log n เนื่องจาก log n! คือ O( nlog n) และแสดงได้ว่า 3n คือ O(n) จากทฤษฎี จะได้ว่า 3n log n! คือ O((n log n)n) = O(n2 log n) พิจารณา (n2 +3 ) log n เนื่องจาก | n2 +3 || n2 |+| 3 | | n2 |+| n2 | = 2| n2 | เมื่อ n 2 ดังนั้น n2 +3 คือ O(n2) จากทฤษฎีจะได้ว่า (n2 +3 ) log n คือ O(n2 log n) จากทฤษฎี จะได้ว่า f(n) คือ O(n2 log n)
Example จงประมาณค่า Big-O ของฟังก์ชัน f(x) =(x + 1)log (x2 +1 ) + 3x2 วิธีทำ จะต้องพิจารณา ค่า Big-O ของ (x + 1)log (x2 +1)และ 3x2 หา Big-O ของ (x + 1)log (x2 +1) จะแสดงได้ว่า x + 1 คือ O(x) และเมื่อ x 2 จะได้ว่า x2 + 1 2 x2 log (x2 +1) log (2x2) = log 2 + log (x2) = log 2 + 2 log (x) 3 log (x) เนื่องจาก log 2 log (x) เมื่อ x 2 | log (x2 +1) | 3 | log x | ดังนั้น log (x2 +1) คือ O(log x) จากทฤษฎี จะได้ว่า (x + 1)log (x2 +1) คือ O(x log x) เนื่องจาก 3 x2 เป็น O(x2) จากทฤษฎี จะได้ว่า f(x) = O(max( x log x, x2)) = O(x2) เนื่องจาก เมื่อ x 1 จะได้ว่า x log x x2
Complexity Examples จงหาฟังก์ชั่นความซับซ้อนของเวลาของขั้นตอนวิธี: : 1. fori = 1 to ndo 1.1 forj = 1 to ndo 1.1.1 A(i,j):=x วิธีทำลูปด้านในที่บรรทัด 1.1 ทำ n รอบและลูปด้านนอกที่บรรทัด 1. ทำ n รอบเช่นกัน ดังนั้น Time Complexityf(n) = n2 ดังนั้น การเติบโตของf(n)เป็นอันดับอย่างมากที่สุด O(n2)หรือf(n)เป็น O(n2)
Complexity Examples จงหาฟังก์ชั่นความซับซ้อนของเวลาของขั้นตอนวิธี: 1. i := 1 2. p := 1 3. forj = 1 to ndo 3.1 p := p × i 3.2 i := i + 1 วิธีทำมีการกำหนดค่า(assignment statements) ที่บรรทัด1. และ 2. การวนลูปในบรรทัดที่ 3. ทำจำนวนnรอบ แต่ละรอบทำการกำหนดค่า 2 ครั้ง และทำ การคำนวณ(arithmetic operations)2 ครั้งในบรรทัดที่ 3.1 และ 3.2 • Time complexityf(n) = 4n + 2 • ดังนั้น การเติบโตของf(n)เป็นอันดับอย่างมากที่สุด O(n)หรือ f(n)เป็น O(n)
Complexity Examples ขั้นตอนวิธีต่อไปนี้ใช้หาส่วนต่างที่มากที่สุด ระหว่าง จำนวนสองจำนวนในชุดข้อมูลเข้า procedure max_diff1(a1, a2, …, an: integers) m := 0 for i := 1 to n-1 for j := i + 1 to n if |ai – aj| > m then m := |ai – aj| {m เป็นส่วนต่างที่มากที่สุด ระหว่าง จำนวนสองจำนวนในชุดข้อมูลเข้า} Time complexityf(n): n-1 + n-2 + n-3 + … + 1 = (n – 1)n/2 = 0.5n2 – 0.5n ดังนั้น การเติบโตของf(n) เป็นอันดับอย่างมากที่สุด O(n2)หรือf(n) เป็น O(n2) 43
Complexity Examples อัลกอริธึมอีกแบบหนึ่งที่ใช้แก้ปัญหาเดียวกัน: procedure max_diff2(a1, a2, …, an: integers) min := a1 max := a1 for i := 2 to n if ai < min then min := ai else if ai > max then max := ai m := max - min Time complexity f(n): 2 +2(n – 1)+2 = 2n+2 ดังนั้น การเติบโตของf(n) เป็นอันดับอย่างมากที่สุด O(n)หรือf(n) เป็น O(n) 44
Efficiency of search algorithms • Linear search: (sequential search) : • Best case : First element is the required element: O(1) • Worst case: Last element or element not present : O(n) • Average case: N/2 : After dropping the multiplicative constant (1/2) : O(n)
Binary search algorithm • Search requires the following steps: 1. Inspect the middle item of an array of size N. 2. Inspect the middle of an array of size N/2 3. Inspect the middle item of an array of size N/power(2,2) and so on until N/power(2,k) = 1. • This implies k = log2N • k is the number of partitions. • Best case : O(1) • Worst case : O(log2N) • Average Case : O(log2N)/2 = O(log2N)
Growth-rate Functions ฟังก์ชัน g(n) ที่ใช้บ่อยๆ เรียงตามลำดับการเติบโตจากช้าที่สุดไปถึงเร็วที่สุด เมื่อจำนวนข้อมูลเข้ามี nตัว: • O(1) – constant time, the time is independent of n, e.g. array look-up • O(log n) – logarithmic time, usually the log is base 2, e.g. binary search • O(n) – linear time, Time requirement increases directly with the size of the problem. e.g. linear search • O(n*log n) – Algorithms that divide the problems into subproblems and solve them.e.g. efficient sorting algorithms e.g. merge sort • O(n2) – quadratic time, Algorithms that use two nested loops are examples. e.g. selection sort, bubble sort • O(nk) – polynomial (where k is some constant) • O(2n) – exponential time, very slow! • Order of growth of some common functions O(1) < O(log n) < O(n) < O(n * log n) < O(n2) < O(n3) < O(2n)