Tossaporn Saengja

Introduction & Big-O Notation

วันนี้

การเขียนโปรแกรมแข่งขันประกอบด้วย

การออกแบบอัลกอริทึม

การ implement สร้างอัลกอริทึม

การวิเคราะห์อัลกอรึทึม

Motivation problem

for (int i = 1; i <= n; i++) {
  for (int j = i + 1; j <= n; j++) {
    // code
  }
}
for (int i = 1; i <= n; i++) {
  for (int j = 1; j <= n; j += i) {
    // code
  }
}

ประสิทธิภาพของอัลกอริทึม

Time complexity

กฏของการคำนวณ

การวนซ้ำ

ตัวอย่างเช่น time complexity ของโค้ดด้านล่างจะเป็น O(n)O(n)

for (int i = 1; i <= n; i++) {
  // code
}

และ time complexity ของโค้ดด้านล่างนี้ O(n2)O(n^2)

for (int i = 1; i <= n; i++) {    // ชั้นที่ 1
  for (int j = 1; j <= n; j++) {  // ชั้นที่ 2
    // code
  }
}

Order of magnitude

for (int i = 1; i <= 3*n; i++) {
  // code
}
for (int i = 1; i <= n+5; i++) {
  // code
}
for (int i = 1; i <= n; i += 2) {
  // code
}

ในอีกตัวอย่างหนึ่ง time complexity ของโค้ดต่อไปนี้เป็น O(n2)O(n^2)

for (int i = 1; i <= n; i++) {
  for (int j = i+1; j <= n; j++) {
   // code
  }
}

Phase

for (int i = 1; i <= n; i++) {
  // code O(n)
}
for (int i = 1; i <= n; i++) {
  for (int j = 1; j <= n; j++) {
    // code O(n^2)
  }
}
for (int i = 1; i <= n; i++) {
  // code O(n)
}

กรณีหลายตัวแปร

for (int i = 1; i <= n; i++) {
  for (int j = 1; j <= m; j++) {
    // code
  }
}

Recursion

void f(int n) {
  if (n == 1) return;
  f(n-1);
}
void g(int n) {
  if (n == 1) return;
  g(n-1);
  g(n-1);
}
function call number of calls
g(n)g(n) 1
g(n1)g(n-1) 2
g(n2)g(n-2) 4
\cdots \cdots
g(1)g(1) 2n12^{n-1}

Complexity classes

การประเมินประสิทธิภาพ

input size required time complexity
N10N \leq 10 O(N!)O(N!)
N20N \leq 20 O(2N)O(2^N)
N500N \leq 500 O(N3)O(N^3)
N5000N \leq 5000 O(N2)O(N^2)
N106N \leq 10^6 O(NlogN)O(N \log{N}) or O(N)O(N)
NN is large O(1)O(1) or O(logN)O(\log{N})

ตัวแปร constant

space complexity