ความรู้เบื้องต้นของโครงสร้างข้อมูลและขั้นตอนวิธี

Download Report

Transcript ความรู้เบื้องต้นของโครงสร้างข้อมูลและขั้นตอนวิธี

Slide 1

รายวิชา ง40206 โครงสรางข

้อมูล
และขัน
้ ตอนวิธ ี
โรงเรี ยนมหิ ดลวิทยานุสรณ์


Slide 2

ความรูเ้ บือ้ งต้นของโครงสร้างข้อมูลและขัน้ ตอนวิธี


Slide 3

ความหมาย “โครงสร้างข้อมูล”
• การรวมประเภทข้อมูล (Data Type) เข้าไว้ดว้ ยกัน จน
กลายเป็ นกลุ่มประเภทข้อมูล และมีนิยามความสัมพันธ์
ภายในกลุ่มข้อมูลอย่างชัดเจน
• การรวมกลุ่มนี้อาจเป็ นการรวมกลุ่มกันระหว่างข้อมูล
ประเภทเดียวกัน ต่างประเภทกัน หรื อต่างโครงสร้าง
ข้อมูลกันก็ได้


Slide 4

ความหมาย “อัลกอริ ธึม”
• ลาดับขั้นตอนวิธีในการทางานของโปรแกรมเพื่อ
แก้ปัญหาใดปั ญหาหนึ่ง ซึ่ งถ้าปฏิบตั ิตามขั้นตอนอย่าง
ถูกต้องแล้ว จะต้องสามารถช่วยแก้ปัญหาหรื อ
ประมวลผลตามต้องการได้สาเร็ จ


Slide 5

ประเภทของโครงสร้างข้อมูล
• ด้านกายภาพ
– Primitive Data Type เช่ น char, int, float
– Structure Data Type เช่ น array, struct

• ด้านตรรกกะ
- Linear Data Structure
A

C

K

- Non-linear Data Structure
5

S
3

-1

3

4

5

8

8

12
-1

4

12


Slide 6


Slide 7

วัตถุประสงค์ของการศึกษาโครงสร้างข้อมูลและขั้นตอนวิธี
โปรแกรมทางานได้อย่างรวดเร็ว
ใช้เนื้ อที่หน่ วยความจาน้ อยที่สด



Slide 8

เทคนิคที่ช่วยในการออกแบบ
• ผังงาน (Flowchart)
– ผังงานระบบ (System Flowchart)
– ผังงานโปรแกรม (Program Flowchart)

• รหัสเทียม (Pseudocode)
– ใช้อธิบายการทางานของอัลกอริ ธึม ทาให้ไม่ตอ้ งเขียนอธิบายด้วย code
– ไม่ข้ ึนกับภาษาคอมพิวเตอร์ภาษาใดภาษาหนึ่ง
– อาจเป็ นภาษาไทยหรื อภาษาอื่นก็ได้ แต่การใช้ภาษาอังกฤษจะสะดวกที่สุด


Slide 9

Pseudocode
• เป็ นคาสั่งที่มีลกั ษณะการเขียนใกล้เคียงกับภาษาอังกฤษ แต่มีโครงสร้าง
เกือบจะเป็ นภาษาโปรแกรม เช่น





เริ่ มต้นอาจให้มีคาว่า BEGIN จบลงให้ใช้ END
อ่าน เขียนข้อมูลอาจใช้ READ และ PRINT
การทดสอบเงื่อนไขอาจใช้ IF , ELSE , ELSEIF
การทาซ้ าอาจใช้ WHILE , DO ENDWHILE เป็ นต้น


Slide 10

ตัวอย่าง Pseudocode
BEGIN
READ A, B
SUM = A+B
IF SUM > 10 THEN
PRINT SUM
ELSE
PRINT A-B
END


Slide 11

ตัวอย่าง Pseudocode
Algorithm arrayMax(A,n)
Input: An array A storing n integers.
Output: The maximum element in A.
currentMax < A[0]
for I <- 1 to n-1 do
if currentMax < A[i] then
currentMax <- A[i]
return currentMax


Slide 12

ตัวอย่าง Pseudocode


Slide 13

การวิเคราะห์ประสิ ทธิภาพของอัลกอริ ธึม
• Space/Memory :
ใช้เนื้อที่ความจามากน้อยแค่ไหน
• Time
เวลาที่ใช้ในการประมวลผล


Slide 14

การวิเคราะห์ Space Complexity
การวิเคราะห์วา่ จะต้องใช้หน่วยความจาทั้งหมดเท่าไรในการ
ประมวลผลอัลกอริ ธึมนั้น
•รองรับจานวนข้อมูลที่ส่งเข้ามาประมวลผล (Input Data)ได้มากที่สดุ เท่าใด
เพื่อให้อลั กอริธึมนัน้ สามารถประมวลผลได้อยู่
•ทราบขนาดของหน่ วยความจาที่จะต้องใช้ในการประมวลผลอัลกอริธึม เพื่อ
ไม่ให้กระทบกับการทางานของคนอื่น
•เพื่อเลือกคุณลักษณะของคอมพิวเตอร์ที่จะใช้ติดตัง้ โปรแกรมที่พฒ
ั นาขึน้ ได้
อย่างเหมาะสม


Slide 15

องค์ ประกอบของ Space Complexity
• Instruction Space
– จานวนของหน่ วยความจาที่คอมไพเลอร์จาเป็ นต้องใช้ขณะทาการ
คอมไพล์โปรแกรม

• Data Space
– จานวนหน่ วยความจาที่ต้องใช้สาหรับเก็บค่าคงที่ และตัวแปรทัง้ หมดที่
ต้องใช้ในการประมวลผลโปรแกรม

• Environment Stack Space
– จานวนหน่ วยความจาที่ต้องใช้ในการเก็บผลลัพธ์ของข้อมูลเอาไว้ เพื่อ
รอเวลาที่จะนาผลลัพธ์นัน้ กลับไปประมวลผลอีกครัง้ (พบใน recursive
function)


Slide 16

Data Space
• Static memory allocation
จานวนของหน่ วยความจาที่ต้องใช้อย่างแน่ นอน ไม่มีการเปลี่ยนแปลง
ประกอบด้วยหน่ วยความจาที่ใช้เก็บค่าคงที่และตัวแปรประเภท array
– เช่น การประกาศตัวแปร int a, b;

char s[10], c;

• Dynamic memory allocation
จานวนของหน่ วยความจาที่ใช้ในการประมวลผลสามารถเปลี่ยนแปลงได้ และจะ
ทราบจานวนหน่ วยความจาที่จะใช้กต็ ่อเมื่อโปรแกรมกาลังทางานอยู่
– เช่น การใช้ pointer และมีการจองเนื้ อที่ในหน่ วยความจาด้วยคาสัง่ malloc();
int *p;
p = malloc(sizeof(int)*2);


Slide 17

ตัวอย่ างการวิเคราะห์ Space Complexity
{
int num1, num2, temp;
temp = num1;
num1 = num2;
num2 = temp;

}

ใช้ หน่ วยความจา 6 bytes


Slide 18

ตัวอย่ างการวิเคราะห์ Space Complexity
int factorial(int n)
{
if (n==0)
return 1;
else
return (n * factorial(n-1));
}

ใช้ หน่ วยความจา 4  Max{1, n}

ค่ า 4 คานวณมาจาก หน่ วยความจาสาหรับเก็บ address 2 bytes และตัวแปรชนิด integer อีก 2 bytes


Slide 19

หาค่ า 4! โดยใช้ recursive
factorial(4)

4x6=24
4 x factorial(3)

3x2=6

3 x factorial(2)

2x1=2
2 x factorial(1)

1x1=1

1 x factorial(0)

1

factorial(0) = 1


Slide 20

การวิเคราะห์ Time Complexity
คือ เวลาทีเ่ ครื่องคอมพิวเตอร์ ต้องใช้ ในการประมวลผลอัลกอริธึม
 ประมาณเวลาทั้งหมดที่ต้องใช้ ในโปรแกรมได้
 มุ่งประเด็นการแก้ ไขไปทีอ่ ลั กอริธึมทีใ่ ช้ เวลาในการประมวลผลนานๆ ทาให้ ไม่ ต้องแก้ ไข
ทั้งโปรแกรม
 โปรแกรมคอมพิวเตอร์ ทที่ างานแบบ Interactive
 เลือกคุณลักษณะของคอมพิวเตอร์ ทจี่ ะใช้ ติดตั้งโปรแกรมทีพ่ ฒ
ั นาขึน้ ได้ อย่ างเหมาะสม


Slide 21

หลักในการพิจารณาอย่ างคร่ าวๆ
ถึงเวลาที่ต้องใช้ ในการประมวลผล
ตัวอย่างเช่น
 โปรแกรมจะประมวลผลได้เร็ วกว่า เมื่ออยูบ่ นเครื่ องคอมพิวเตอร์ ที่มี
ความเร็ วในการประมวลผลสู งกว่า
 ถ้าใช้คอมไพเลอร์ ตวั เดียวกัน code ที่ส้ นั กว่า ย่อมใช้เวลาในการประมวลผล
ได้นอ้ ยกว่า


Slide 22

เวลาในการประมวลผลของโปรแกรม
Compile Time คือ เวลาที่ใช้ในการตรวจสอบไวยากรณ์ (syntax) ของ
code ว่าเขียนได้ถกู ต้องหรื อไม่

Run Time หรือ Execution Time คือ เวลาที่เครื่ องคอมพิวเตอร์ใช้ใน
การประมวลผล


Slide 23

การวิเคราะห์ Time Complexity ด้ วยวิธีการนับตัวดาเนินการ
 แบบ Linear Loops
 แบบ Logarithmic Loops
 แบบ Nested Loops


Slide 24

แบบ Linear Loops
อัลกอริ ธึมมีการทางานแบบวนรอบ (Loop) โดยแต่ละ loop จะมีการเพิ่ม
หรื อลดค่าในปริ มาณที่คงที่ เช่น

x=1
Loop (x <= 2000)
x = x+5

x=1
Loop (x <= 2000)
x = x+1

ถ้าให้ f(n) แทนประสิ ทธิภาพ และ n แทนจานวนรอบการทางาน สามารถเขียนเป็ น
สมการวัดประสิ ทธิภาพของอัลกอริ ธึมแบบ Linear loop ได้ดงั นี้

f(n) = n


Slide 25

แบบ Logarithmic Loops
อัลกอริ ธึมจะทางานแบบ Loop โดยการทางานภายในแต่ละ loop จะ
เพิ่มหรื อลดค่าเป็ นเท่าตัว
x=1
Loop (x < 1000)
x = x*2

x = 1000
Loop (x >= 1)
x = x/2

ถ้าให้ f(n) แทนประสิ ทธิภาพ และ n แทนจานวนรอบการทางาน สามารถเขียนเป็ น
สมการวัดประสิ ทธิ ภาพได้ดงั นี้
f(n) = [logn]


Slide 26

แบบ Nested Loops
คือ อัลกอริธึมที่มี loop ซ้ อนอยู่ภายใน loop โดยประสิ ทธิภาพของ
อัลกอริธึมก็จะมีค่าเท่ ากับจานวน loop ทั้งหมดทีจ่ ะต้ องประมวลผล ซึ่ งหาได้ จากการ
เอาจานวน loop ทีซ่ ้ อนกันมาคูณกัน

f(n) = n2

f(n) = n3


Slide 27

Big-O Notation
• การวิเคราะห์อลั กอริ ธึม จะใช้วธิ ี หาจานวนครั้งของการทางานของโปรแกรม
โดยมักจะสนใจค่าโดยประมาณเท่านั้น ซึ่ งจะใช้สัญลักษณ์วา่ O เรี ยกว่า บิ๊ก
โอ (big O) ซึ่ งเป็ นสัญลักษณ์ทางคณิ ตศาสตร์ ที่มาจากคาว่า Order of
Magnitude

• O(N), O(logN), O(N2), O(1)


Slide 28

Big-O Notation
• แนวความคิดของบิ๊กโอ จะดูจากค่าที่มีผลกระทบมากที่สุดเพียงค่าเดียว
• ค่าอื่นๆที่เกี่ยวข้องจะมีผลต่อฟังก์ชนั น้อยกว่า จึงไม่สนใจ และไม่สนใจ
ค่าคงที่ดว้ ย
ตัวอย่าง หาค่าบิ๊กโอของ N4 + 10N – 5
ถ้า
f(N) =
N4 + 10N – 5
O(f(N)) =
O(N4)


Slide 29

ตัวอย่าง หาค่าบิ๊กโอของ 100N +1
ถ้า
f(N)
=
O(f(N))
=

100N +1
O(N)

ตัวอย่าง หาค่าบิ๊กโอของ N/5 +100
ถ้า
f(N)
=
O(f(N))
=

N/5 +100
O(N)


Slide 30

ตัวอย่าง หาค่าบิ๊กโอของ N3 + 2N3 + 10
ถ้า
f(N)
=
N3 + 2N3 + 10
O(f(N))
=
O(N3)
ตัวอย่าง หาค่าบิ๊กโอของ 100
ถ้า
f(N)
O(f(N))

=
=

100
O(1)


Slide 31

การวิเคราะห์ความเร็ วของ Algorithm
เร็ว
lo g n
0
1
2
3
4
5

ช้า
n
1
2
4
8
16
32

n log n
0
2
8
24
64
1 60

2

n
1
4
16
64
2 56
1 ,0 24

3

n
1
8
64
5 12
4 096
3 2,768

n

2
2
4
16
2 56
6 5,536
4 ,2 94 ,96 7,296


Slide 32

lo g n
0
1
2
3
4
5

n
1
2
4
8
16
32

n log n
0
2
8
24
64
1 60

2

n
1
4
16
64
2 56
1 ,0 24

3

n
1
8
64
5 12
4 096
3 2,768

n

2
2
4
16
2 56
6 5,536
4 ,2 94 ,96 7,296

2n

100000

n3

n2
n log n

10000

n

1000
100

log n

10
1
n


Slide 33

Running time calculations
A simple Example
int sum(int n)
{ int i, partialSum;
partialSum = 0;
//1
for(i=1;i//2
partialSum += i*i*i; //3
return partialSum;
}

-> Count for 1 unit per time executed
-> Count for 2N+1 units
-> 4N units
The total is 6N+2
This function is O(N)


Slide 34

Running time calculations
A simple Example
int factorial(int n)
{ int fac
if((n==0)||(n=1))
fac = 1;
else
fac = n*factorial(n-1);
}

-> Running time = 1
-> เรี ยกตัวเอง N ครั้ง
This function is O(N)