Data Structures and Algorithms 2/2561

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
อสมการเชิงเส้นตัวแปรเดียว
Advertisements

Array ธนวัฒน์ แซ่ เอียบ. The concept of array อาเรย์ : กลุ่มของข้อมูลที่มีชนิดเดียวกันและถูก จัดเก็บเรียงลำดับต่อเนื่องกัน ตัวแปร x สามารถจัดเก็บค่ามากกว่า.
Practical with Flowchart
บทที่ 6 บทที่ 6 คำสั่งแก้ไขปัญหาแบบ เลือก (CONDITION)
บทที่ 5 การควบคุมทิศทางการทำงานของโปรแกรม
คณิตศาสตร์พื้นฐาน ค ชั้นมัธยมศึกษาปีที่ 3 โดย ครูชำนาญ ยันต์ทอง
Pushdown Automata : PDA
การเขียนโปรแกรมภาษาปาสคาล โดยใช้โครงสร้างหลักทั้ง 3 โครงสร้าง
กาญจนา ทองบุญนาค สาขาวิชาคอมพิวเตอร์ คณะวิทยาศาสตร์และเทคโนโลยี
หน่วยที่ 2 Introduction to Algorithm Analysis
หน่วยที่ 5 การเวียนเกิด
การวิเคราะห์ขั้นตอนวิธีการแก้ปัญหา
หลักการโปรแกรม 1 Lecture 8: การทำซ้ำ (while, do-while)
วิธีการเลือกซื้อ คอมพิวเตอร์. เนื้อหาในส่วนนี้จะให้รายระเอียดและขั้นตอน ในการเลือกซื้อ เครื่องคอมพิวเตอร์ เพื่อให้เราได้เครื่อง คอมพิวเตอร์ที่ตรงกับความ.
คำสั่งควบคุมการทำงาน
เกม คณิตคิดเร็ว.
stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
แนวข้อสอบ Final (จดด่วน)
IP-Addressing and Subneting
IP-Addressing and Subneting
การประยุกต์ Logic Gates ภาค 2
โครงสร้างข้อมูลและอัลกอริทึมเบื้องต้น
Complexity Lecturers : Boontee Kruatrachue Room no Kritawan Siriboon Room no. 913 Text : Data Structures & Algorithm.
แล้วทำการเรียงลำดับข้อมูลใหม่โดยเรียงจากน้อยไปหามาก
รายการ(List) [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
STACK สแตก(stack) เป็นโครงสร้างข้อมูลแบบเชิงเส้น ที่มีการใส่ข้อมูลเข้า และนำข้อมูลออกเพียงด้านเดียว ดังนั้น ข้อมูลที่เข้าไปอยู่ใน stack ก่อนจะออกจาก stack.
BC320 Introduction to Computer Programming
START INPUT R = 1 R = R Yes R*R <=2 No R = R PROCESS
Multistage Cluster Sampling
โครงสร้างภาษา C Arduino
บทที่ 1 ความรู้ทั่วไปเกี่ยวกับคอมพิวเตอร์
การบัญชีต้นทุนช่วง (Process Costing).
หน่วยการเรียนที่ 4 เรื่อง การควบคุมทิศทางการทำงาน
QUEUE คิวจะมีโครงสร้างแบบเชิงเส้นเหมือน stack แต่แตกต่างตรงที่ queue มีตัวชี้ 2 ตัวคือ หัว(Head) และหาง(Tail) โดยการใส่ข้อมูลเข้าและนำข้อมูลออก จะมีลักษณะ.
บทที่ 7 การเขียนโปรแกรม แบบวนรอบทำซ้ำ (Loop)
Control Statement เงื่อนไขคำสั่งในโปรแกรม ภาษา C
บทที่ 8 เงื่อนไขตัดสินใจ
Asst.Prof. Dr.Surasak Mungsing
Dr.Surasak Mungsing CSE 221/ICT221 การวิเคราะห์และออกแบบขั้นตอนวิธี Lecture 04: การวิเคราะห์หาความซับซ้อนด้านเวลา ในรูป.
รายวิชา ไมโครโปรเซสเซอร์ในงานอุตสาหกรรม
ชุดที่ 1 ไป เมนูรอง.
ขั้นตอนการออกแบบ ผังงาน (Flow Chart)
การเขียนโปรแกรมแบบวนซ้ำ: คำสั่ง while คำสั่ง do….while
Data storage II Introduction to Computer Science ( )
BC320 Introduction to Computer Programming
บทที่ 9 การทำซ้ำ (Loop).
ผู้ช่วยศาสตราจารย์จุฑาวุฒิ จันทรมาลี
คำสั่งวนรอบ (Loop).
การสร้างแบบสอบถาม และ การกำหนดเงื่อนไข.
Data storage II Introduction to Computer Science ( )
BASIC STATISTICS MEAN / MODE / MEDIAN / SD / CV.
หน่วยที่ 6 อะเรย์ของอักขระ
Algorithms Analysis Sanchai Yeewiyom
บทที่ 7 การประมวลผลอาร์เรย์
บทที่ 8 การแก้ไขข้อผิดพลาดโปรแกรม(Debugging)
การเปลี่ยนแปลงประมาณการทางบัญชี และข้อผิดพลาด
OPERATOR ภาษาปาสคาล (Pascal)
การวิเคราะห์และออกแบบขั้นตอนวิธี
ค่ารูรับแสง - F/Stop ค่ารูรับแสงที่มีค่าตัวเลขต่ำใกล้เคียง 1 มากเท่าไหร่ ค่าของรูรับแสงนั้นก็ยิ่งมีความกว้างมาก เพราะเราเปรียบเทียบค่าความสว่างที่ 1:1.
2 โครงสร้างข้อมูลแบบสแตก (STACK).
บทที่ 2 โครงสร้างข้อมูลแบบแถวลำดับหรืออาร์เรย์ (Array)
Chapter 3 : Array.
Array: One Dimension Programming I 9.
การเติบโตของฟังก์ชัน (Growth of Functions)
การเขียนโปรแกรมด้วยภาษาไพทอน การเขียนโปรแกรมแบบทางเลือก
โครงการถ่ายทอดเทคโนโลยีถนนรีไซเคิลเพื่อลดขยะพลาสติกใน 4 ภูมิภาค
Decision: Single and Double Selection (if and if-else statement)
Dr.Surasak Mungsing CSE 221/ICT221 การวิเคราะห์และออกแบบขั้นตอนวิธี Lecture 12: เทคนิคการออกแบบขั้นตอนวิธีตอนวิธี Dynamic.
Computer Game Programming
ใบสำเนางานนำเสนอ:

88621159 Data Structures and Algorithms 2/2561 Algorithm Analysis 88621159 Data Structures and Algorithms 2/2561

Complexity Analysis การวิเคราะห์ความซับซ้อนของอัลกอริทึม กระบวนการที่นำไปสู่การตัดสินใจว่าอัลกอริทึมไหนมีประสิทธิภาพมากกว่า Algorithm A Algorithm B

อยากรู้เวลาการทำงาน เขียนโปรแกรม สั่งทำงาน จับเวลา ตัวอย่าง อยากทราบ ผลต่าง ของคู่ข้อมูลใน Array ที่มีผลต่างมากที่สุด

Algorithm A หาผลต่างของทุกคู่ diff maxDiff Array Size=8 5 12 7 2 11 1 4 9 หาผลต่างของทุกคู่

Algorithm B หาผลต่าง max กับ min Max Min Array Size=8 5 12 7 2 11 1 4 9 หาผลต่าง max กับ min

เปรียบเทียบเวลาทำงาน เวลาการทํางานขึ้นกับหลายปัจจัย เช่น ภาษา, เครื่อง , ผู้เขียน, ...

Types of measurement Big-O Notation Big O Notation คือ ระยะเวลาที่แย่ที่สุด หรือพื้นที่ในหน่วยประมวลผลที่มากที่สุด ที่คอมพิวเตอร์ต้องจ่ายให้กับการ run อัลกอริทึมใดๆ

Worst Case Array Size=10 Jane John Kate Mike Lee Big Arm Mine Zen Top …. Big Arm Mine Zen Top Top

Type of Big O Notation Big O Notation จะเน้นที่เรื่องระยะเวลาในการประมวลผล และสนใจระยะเวลาที่แย่ที่สุด สัญลักษณ์ O(n) เมื่อ n คือ จำนวน input ที่เข้ามาในอัลกอริทึม

วัดอย่างไร เขียนอัลกอรทิม กําหนดตัวแปรที่แทนปริมาณข้อมูลเข้า หาคําสั่งตัวแทน วิเคราะห์จํานวนครั้งที่คําสั่งตวแทนทำงาน

O(1) or Constant การประกาศตัวแปร คำสั่ง conditional เช่น if, switch operator เช่น +, -, >, <, = ใช้เวลาคงที่ คือ 1 ครั้ง เรียกว่าเป็น constant

O(1) or Constant ไม่สนค่าคงที่ แต่จะนับแค่ statement ที่สำคัญ boolean F1(int n){ int x; x = 5 + (15*20); if(x > n) System.out.println(x); else System.out.println(n); } ไม่สนค่าคงที่ แต่จะนับแค่ statement ที่สำคัญ ไม่ว่า n จะมีขนาด 1, 1000, 1M+ หรือเท่าไหร่ก็ตาม ระยะเวลาที่ใช้ในการประมวลผลก็ยังไม่เปลี่ยนแปลง คือ เท่ากับ 1 เสมอ

O(n) or Linear Loop 1 ชั้น ระยะเวลาขึ้นอยู่กับจำนวน n ที่ใส่เข้ามา int F2(int n){ int sum=0; for(int i=0; i<n; i++) sum+=1; return sum; } Loop 1 ชั้น ระยะเวลาขึ้นอยู่กับจำนวน n ที่ใส่เข้ามา ซึ่งถ้าจำนวน n เพิ่มขึ้นสองเท่า ระยะเวลาที่ใช้ในการประมวลผลก็จะเพิ่มขึ้นสองเท่าด้วย

O(n2) or Quadratic 2-nested loop int F3(int n){ int sum=0; for(int i=0; i<n; i++) for(int j=0; j<n; j++) sum+=i+j; return sum; } 2-nested loop หากเพิ่มขนาด n เข้ามาสองเท่า จะทำให้ระยะเวลาเพิ่มขึ้น 4 เท่า

O(n3) or Cubic 3-nested loop int F4(int n){ int sum=0; for(int i=0; i<n; i++) for(int j=0; j<n; j++) for(int k=0; k<n; k++) sum+=i+j+k; return sum; } 3-nested loop หากเพิ่มขนาด 2 เข้ามาสองเท่า จะทำให้ระยะเวลาเพิ่มขึ้น 8 เท่า

O(log n) or Logarithmic int F5(int n){ for(int i=1; i<=n; i=i*2) sum+=1; return sum; } อัลกอริทึมที่ในการวนลูปแต่ละรอบ จะตัดจำนวนข้อมูลที่ไม่มีโอกาสเกิดขึ้นออกไปทีละครึ่งนึง เช่น อัลกอริทึม binary search

O(log n) or Logarithmic อัลกอริทึม binary search เป็นการ search หาข้อมูลใน Ordered Array (Array ที่ sort มาแล้ว) ไล่หาทีละช่วงไปเรื่อยๆ โดยเริ่มจากตรงกลาง 1 2 3 4 5 6 7 8 5

O(log n) or Logarithmic อัลกอริทึม binary search เป็นการ search หาข้อมูลใน Ordered Array (Array ที่ sort มาแล้ว) ไล่หาทีละช่วงไปเรื่อยๆ โดยเริ่มจากตรงกลาง หาก Array มีขนาด 1000 การหาครั้งแรกก็จะตัดข้อมูลที่ไม่ใช่ออกไปครึ่งนึง Worst case คือ เจอตัวสุดท้าย 1 2 3 4 5 6 7 8 5

O(log n) or Logarithmic การหา binary search ถ้าเริ่มด้วย n รอบต่อไปจะเหลือ n/2, n/4, n/8, … จนเหลือ 1 ตัวสุดท้าย คิดกลับ หากเริ่มที่ 1 รอบต่อไปเป็น 2, 4, 8, 16, .. นั่นคือ 2x ≈ n, x คือ จำนวนรอบ เปลี่ยนจาก exponential เป็น logarithm จะได้ x = log2n (โดยประมาณ) ดังนั้น Big O คือ O(log n)

O(n log n) or Linearithmic int F6(int n){ for(int i=1; i<=n; i=i*2) for(int j=1; j<=n; j++) sum+=i+j; return sum; } เป็นการวนลูปสองรอบ โดยลูปนึงวนแบบปกติ (n รอบ) อีกลูปนึงวนแบบตัดข้อมูลที่ไม่เกี่ยวข้องออกไปทีละครึ่งด้วย (log n)

O(2n) or Exponential // Fibonacci int fib(int n) { if (n <= 1) return n; else return fib(n - 2) + fib(n - 1); } การเพิ่มขนาดของ n แค่นิดเดียว ก็ทำให้ระยะเวลาในการประมวลผลเพิ่มขึ้นแบบมหาศาล

O(n!) or Factorial loop with recursive void nFacRuntimeFunc(int n) { for(int i=0; i<n; i++) { nFacRuntimeFunc(n-1); } loop with recursive Big O = O(n) * O(n-1) * O(n-2) * … * O(1) = O(n!)

Big O Complexity Chart

วิธีการคำนวณหา Big O ต้องการวัดอัลกอริทึมอย่างคร่าวๆ ซึ่งไม่จำเป็นต้องได้ตัวเลขที่ถูกต้อง 100%

Step การคำนวณหา Big O ไม่ต้องสนใจค่าคงที่ (constant) ตัดค่าคงที่ทิ้ง ถ้ามี nested loop จะเอา Big O แต่ละ loop มาคูณกัน ถ้าเป็น loop ที่อยู่ระดับเดียวกัน (หรือเรียงต่อกัน ไม่ได้เป็น nested) ให้เอา Big O มาบวกกัน ถ้ารวมกันหมดแล้ว Big O มีหลาย term ให้เราสนใจเฉพาะ ตัวที่เลวร้ายมากที่สุด ถ้ามีการเรียกใช้ function ภายนอก ต้องคำนวณ Big O ของ function ภายนอกนั้นด้วย

Exercise 1 Total time = O(1) + O(1) + O(1) = O(3) = O(1) int x; //O(1) x = 5 + (15*20); //O(1) System.out.println(x); //O(1) Total time = O(1) + O(1) + O(1) = O(3) = O(1)

Exercise 2 Total time = O(n) * O(1) = O(n) for(int i=0; i<n; i++)//O(n) System.out.println(i);//O(1) Total time = O(n) * O(1) = O(n)

Exercise 3 Total time = O(1) + O(n) = O(n) x = 5 + (15*20); //O(1) for(int i=0; i<n; i++) System.out.println(i); O(n) Total time = O(1) + O(n) = O(n)

Exercise 4 Total time = O(n) + O(n) = O(n) for(int i=0; i<n; i++) System.out.println(x); O(n) O(n) Total time = O(n) + O(n) = O(n)

Exercise 5 Total time = O(2n) = O(n) for(int i = 0; i < 2*n; i++) { System.out.println(i); } Total time = O(2n) = O(n)

Exercise 6 Total time = O(1) + O(n) + O(n2) = O(n2) x = 5 + (15*20); //O(1) for(int i=0; i<n; i++) System.out.println(x); for(int j=0; j<n; j++) O(n) O(n2) Total time = O(1) + O(n) + O(n2) = O(n2)

Exercise 7 Total time = O(n2) if(x>0) x = 5 + (15*20); else if(x<0) for(int i=0; i<n; i++) System.out.println(x); else for(int j=0; j<n; j++) O(n) O(n2) Total time = O(n2)

Exercise 8 Total time = O(n) * O(n) = O(n2) function(int n) { int sum = 0; for(int i=0; i<n; i++) { // O(n) if(i > j) { sum = sum + 1; } else { for(int k=0; k<n; k++) // O(n) sum = sum – 1; } Total time = O(n) * O(n) = O(n2)

Exercise 9 Total time = O(1) * O(n) = O(n) for(int i = 0; i < n; i++) { // O(n) for(int j = 0; j < 2; j++) { // O(1) // do stuff } Total time = O(1) * O(n) = O(n)

Exercise 10 Total time = O(n) * O(n) = O(n2) for(int i = 0; i < n*n; i++) { // O(n) * O(n) System.out.println(i); } Total time = O(n) * O(n) = O(n2)

Exercise 11 Total time = O(n/2) * O(5) * O(n) = O(n2) int function(int n){ int i, j, k, sum=0; for(i=0; i < (n/2); i++) for(j=0; j<5; j++) for(k=0; k<n; k++) sum+=n; return sum; } Total time = O(n/2) * O(5) * O(n) = O(n2)

Reference https://docs.google.com/file/d/0B09a_TYwhKDZZXNSRHV3aFhuamc/edit https://itopstory.com/what-why-and-type-big-o-notation-90a1a1d43596 https://www.cp.eng.chula.ac.th/~somchai/ULearn/DataStructures/