Trình bày thuật toán sắp xếp chọn trực tiếp mô tả thuật toán, cài đặt, độ phức tạp, ví dụ 5 6.. Trình bày thuật toán sắp xếp chèn mô tả thuật toán, cài đặt, độ phức tạp, ví dụ .... Trình
Trang 1Trường Đại Học Hàng Hải Việt Nam Khoa Công Nghệ Thông Tin
ĐỀ CƯƠNG ÔN TẬP
MÔN HỌC: PHÂN TÍCH THIẾT KẾ
VÀ ĐÁNH GIÁ THUẬT TOÁN
Trang 2MỤC LỤC
I LÝ THUYẾT 3
1 Thuật toán là gì? Tính chất, cách biểu diễn, độ phức tạp? 3
2 Thế nào là bài toán tìm kiếm? (định nghĩa, đầu vào, đầu ra, mục đích, …) 3
3 Trình bày thuật toán tìm kiếm tuyến tính (các bước, sơ đồ thuật toán, độ phức tạp, …) 4
4 Bài toán sắp xếp là gì? (định nghĩa, đầu vào, đầu ra, mục đích, …) 4
5 Trình bày thuật toán sắp xếp chọn trực tiếp (mô tả thuật toán, cài đặt, độ phức tạp, ví dụ) 5 6 Trình bày thuật toán sắp xếp chèn (mô tả thuật toán, cài đặt, độ phức tạp, ví dụ) 6
7 Trình bày thuật toán sắp xếp nổi bọt (mô tả thuật toán, cài đặt, độ phức tạp, ví dụ) 8
8 Trình bày thuật toán sắp xếp đổi chỗ (mô tả thuật toán, cài đặt, độ phức tạp, ví dụ) 9
9 Trình bày thuật toán sắp xếp vun đống (heap-sort) (mô tả thuật toán, cài đặt, độ phức tạp, ví dụ) 10
10 Thế nào là giải thuật đệ quy? Ưu, nhược điểm của đệ quy? Cách khử đệ quy Ví dụ 11
11 Thế nào là chiến lược vét cạn? Ưu, nhược điểm của vét cạn? Ví dụ 12
12 Thế nào là chiến lược quay lui? Ưu, nhược điểm của quay lui? Ví dụ 12
13 Thế nào là chiến lược chia để trị? Ưu, nhược điểm của chia để trị? Ví dụ 13
14 Trình bày thuật toán sắp xếp nhanh (Quick-Sort)? (mô tả thuật toán, cài đặt, độ phức tạp, ví dụ) 13
15 Trình bày thuật toán tìm kiếm nhị phân? (mô tả thuật toán, cài đặt, độ phức tạp, ví dụ) 15 16 Trình bày chiến lược quy hoạch động? Ưu, nhược điểm? Ví dụ 15
17 Trình bày bài toán tìm dãy con chung dài nhất 16
18 Trình bày bài toán nhân ma trận 17
19 Trình bày chiến lược tham lam Ưu, nhược điểm? Ví dụ 18
20 Trình bày bài toán sắp lịch các sự kiện 18
II Bài tập: 19
1 Cho cấu trúc sinh viên gồm các trường: tên, tuổi, địa chỉ, … Khai báo cấu trúc trên để có thể lưu được danh sách sinh viên theo mảng Cài đặt hàm sắp xếp mảng sinh viên tăng dần (hoặc giảm dần) theo tuổi, cùng tuổi theo tên Áp dụng giải thuật sắp xếp chọn (hoặc chèn, hoặc nổi bọt, hoặc đổi chỗ, …) 19
2 Cho cấu trúc nhân viên gồm các trường: tên, năm sinh, hệ số lương, … Khai báo cấu trúc nhân viên trên ở dạng danh sách liên kết Cài đặt hàm sắp xếp danh sách nhân viên tăng dần (hoặc giảm dần) theo năm sinh, cùng năm sinh theo tên Áp dụng giải thuật sắp xếp chọn (hoặc chèn, hoặc nổi bọt, hoặc đổi chỗ, …) 21
Trang 33 Cho cấu trúc mặt hàng gồm: mã số, loại, tên, Khai báo cấu trúc mặt hàng ở trên (để lưu ở
dạng mảng, hoặc dạng danh sách liên kết đơn) Cài đặt hàm tìm kiếm mặt hàng nào đó theo mã (hoặc tên, …) Nêu rõ giải thuật áp dụng 23
4 Cài đặt và đánh giá độ phức tạp thuật toán in ra hoán vị của n số nguyên từ 1 đến n Các
hoán vị được in ra phải thỏa mãn một tiêu chuẩn nào đó, ví dụ: tổng 2 phần tử liên tiếp của hoán vị
là số nguyên tố, hoặc tổng 2 phần tử liên tiếp của hoán vị là số hoàn hảo, … 25
5 Cài đặt và đánh giá độ phức tạp thuật toán in ra tất cả các xâu nhị phân có độ dài k Xâu
được in ra phải thỏa mãn một điều kiện nào đó, ví dụ: biểu diễn thập phân của xâu đó là số hoàn hảo, hoặc số nguyên tố, hoặc xâu đó không có 3 phần tử liên tiếp giống nhau, hoặc xâu đó phải có 2 ký tự liền kề không giống nhau, … 27
6 Cài đặt và đánh giá độ phức tạp thuật toán in ra số nguyên có k chữ số Số được in ra phải
thỏa mãn một điều kiện nào đó, ví dụ: số đó có tổng các chữ số là số nguyên tố, hoặc số hoàn hảo, hoặc các chữ số phải khác nhau, … 28
7 Trình bày thuật toán nhân dãy ma trận A Tìm số phép nhân ít nhất để nhân các ma trận có
kích thước nào đó, ví dụ: 6x5, 5x7, 7x8, 8x3, 3x5 29
8 Trình bày thuật toán tìm xâu con chung dài nhất của hai xâu Áp dụng tìm xâu con chung dài
nhất của hai xâu con sau: “CDADDADC”, “ACDDCCA” 32
III Cấu trúc đề thi học kỳ: (mỗi câu 2/10 điểm) 36
Trang 4I LÝ THUYẾT
1 Thuật toán là gì? Tính chất, cách biểu diễn, độ phức tạp?
a Thuật toán là một hệ thống đầy đủ và rõ ràng các quy tắc sao cho sau một số hữu hạn
bước thực hiện thì thu được mục tiêu đề ra
b Tính chất:
- Tính đúng đắn: Nếu áp dụng cùng một thuật toán với cùng một dữ liệu đầu vào thì phải cho cùng một kết quả
- Tính dừng: Thuật toán cần phải đảm bảo sẽ dừng sau 1 số bước hữu hạn bước
- Tính xác định: Các bước của thuật toán phải được hiểu rõ ràng, cụ thể, tránh gây nhập nhằng hoặc nhầm lẫn đối với người đọc và hiểu, cài đặt thuật toán
- Tính hiệu quả: thuật toán được xem là hiệu quả nếu như nó có khả năng giải quyết hiệu quả bài toán đặt ra trong thời gian hoặc các điều kiện cho phép trên thực tế đáp ứng được yêu cầu của người dùng
- Tính phổ quát: thuật toán có thể giải quyết được 1 lớp các bài toán tương tự nhau
c Cách biểu diễn: có 2 cách biểu diễn thuật toán:
- Mô tả các bước thực hiện của thuật toán
- Sử dụng sơ đồ giải thuật
d Độ phức tạp:
Các tiêu chí đánh giá thuật toán:
+ Thuật toán đơn giản, dễ hiểu, dễ cài đặt
+ Dựa vào thời gian thực hiện và tài nguyên mà thuật toán sử dụng để thực hiện trên các bộ dữ liệu
2 Thế nào là bài toán tìm kiếm? (định nghĩa, đầu vào, đầu ra, mục đích, …)
Tìm kiếm là 1 trong những vấn đề thuộc lĩnh vực nghiên cứu của ngành khoa học máy tính và được ứng dụng rộng rãi trên thực tế
Chúng ta quan tâm đến bài toán tìm kiếm trên 1 mảng, hoặc 1 danh sách các phần tử cùng kiểu
Kết quả tìm kiếm là vị trí của phần tử thỏa mãn điều kiện tìm kiếm: có trường khóa bằng với 1 giá trị khóa cho trước Từ vị trí này chúng ta có thể truy cập tới các thông tin khác được chứa trong trường dữ liệu của phần tử tìm thấy Nếu kết quả là không tìm thấy thì giá trị trả về
Trang 5sẽ được gán cho một giá trị đặc biệt nào đó tương đương với việc không tồn tại phần tử nào có
vị trí đó: chẳng hạn – 1 với mảng và NULL với danh sách liên kết
Có nhiều thuật toán tìm kiếm như: tìm kiếm vét cạn, tìm kiếm tuần tự, tìm kiếm nhị phân, v.v.v v
3 Trình bày thuật toán tìm kiếm tuyến tính (các bước, sơ đồ thuật toán, độ phức tạp, …)
Các bước:
- Duyệt qua các phần tử của mảng
- Nếu tìm thấy phần tử có khóa bằng khóa tìm kiếm thì trả về vị trí của phần tử đó Ngược lại không tìm thấy thì trả về -1
Sơ đồ thuật toán:
Độ phức tạp thuật toán trong trường hợp trung bình và tồi nhất: O(n)
Trong trường hợp tốt nhất thuật toán có độ phức tạp O(1)
4 Bài toán sắp xếp là gì? (định nghĩa, đầu vào, đầu ra, mục đích, …)
Sắp xếp là 1 quá trình xếp đặt các bản ghi của 1 file theo một thứ tự nào đó Cơ sở của việc xếp đặt này được gọi là khóa sắp xếp (key) Hầu hết các thuật toán sắp xếp được gòi là các thuật toán sắp xếp so sánh: chúng sử dụng 2 thao tác cơ bản là so sánh và đổi chỗ (swap) các phần tử cần sắp xếp
Các bài toán sắp xếp đơn giản được chia thành: sắp xếp trong (dữ liệu cần sắp xếp được lưu đầy đủ trong bộ nhớ trong để thực hiện thuật toán sắp xếp), sắp xếp ngoài (Dữ liệu sắp xếp
Trang 6có kích thước quá lớn và không thể lưu vào bộ nhớ trong mà phải lưu ở các bộ nhớ ngoài như đĩa từ, băng từ, trống từ, để sắp xếp, các thao tác truy cập dữ liệu cũng mất nhiều thời gian hơn), sắp xếp gián tiếp (khi kích thước các bản ghi lớn và việc hoán đổi các bản ghi là rất tốn kém)
5 Trình bày thuật toán sắp xếp chọn trực tiếp (mô tả thuật toán, cài đặt, độ phức tạp,
Trang 7void selection_sort(int a[],int n)
6 Trình bày thuật toán sắp xếp chèn (mô tả thuật toán, cài đặt, độ phức tạp, ví dụ)
Thuật toán dựa vào thao tác chính là chèn mỗi khóa vào một dãy con đã được sắp xếp của dãy cần sắp xếp Phương pháp này thường được sử dụng trong việc sắp xếp các cây bài trong quá trình chơi bài
Sơ đồ thuật toán:
Trang 8Cài đặt thuật toán bằng C:
void insertion_sort(int a[],int n)
Trang 9Độ phức tạp: O(n 2 )
7 Trình bày thuật toán sắp xếp nổi bọt (mô tả thuật toán, cài đặt, độ phức tạp, ví dụ)
Thuật toán dựa trên việc so sánh và đổi chỗ 2 phần tử ở kề nhau:
- Duyệt qua danh sách các bản ghi cần sắp xếp theo thứ tự, đổi chỗ 2 phần tử kề nhau nếu chúng không đúng thứ tự
- Lặp lại điều này cho tới khi không có 2 bản ghi nào sai thứ tự
Sơ đồ thuật toán:
Độ phức tạp: O(n 2 )
Ví dụ:
Trang 108 Trình bày thuật toán sắp xếp đổi chỗ (mô tả thuật toán, cài đặt, độ phức tạp, ví dụ)
Mô tả thuật toán: Bắt đầu xét phần tử đầu tiên a[i] với i=0, ta xét tất cả các phần tử đứng
sau a[i] gọi là a[j] với j nằm trong đoạn [i+1; n-1] Với mỗi cặp a[i], a[j] đó, nếu có sự sai khác về
vị trí giữa a[i] và a[j] thì đổi chỗ a[i] và a[j]
Cài đặt thuật toán:
void exchange_sort(int a[],int n)
Trang 11Sơ đồ thuật toán:
Ví dụ: Giả sử mảng ban đầu là int a[]={2, 6, 1, 19, 3, 12} thì thuật toán sẽ thực hiện như
Mô tả thuật toán:
- Thực hiện thủ tục buildheap để biến mảng A thành 1 heap
- Vì A là 1 heap nên phần tử lớn nhất sẽ là A[1]
Trang 12- Đổi chỗ A[0] và A[n-1], A[n-1] đã nằm đúng vị trí của nó và vì thế chúng ta có thể bỏ qua
nó và coi như mảng bây giờ có kích thước là n-1 và quay trở lại xem xét phần đầu của mảng đã không là 1 heap nữa
- Vì A[0] có thể lỗi vị trí nên ta sẽ gọi thủ tục heaprify đối với nó để chỉnh lại mảng trở thành 1 heap
- Lặp lại các thao tác trên cho tới khi chỉ còn 1 phần tử trong heap khi đó mảng đã được sắp xếp
10 Thế nào là giải thuật đệ quy? Ưu, nhược điểm của đệ quy? Cách khử đệ quy Ví dụ
- Đệ quy là cách định nghĩa một đối tượng dựa trên chính nó, hay cụ thể hơn là trên các thể hiện cụ thể, đơn giản của nó 1 hàm đệ quy là 1 hàm mà trong thân hàm có lời gọi tới chính
nó (số lượng và vị trí không hạn chế)
Ưu điểm của đệ quy: Chương trình ngắn gọn và đẹp hơn
Nhược điểm của đệ quy: Tốn vùng nhớ, thời gian truyền đối mục, thiết lập vùng nhớ trung gian và trả về kết quả
Trang 1311 Thế nào là chiến lược vét cạn? Ưu, nhược điểm của vét cạn? Ví dụ
Chiến lược vét cạn là thử tất cả các khả năng xem khả năng nào là nghiệm đúng của bài toán cần giải quyết
Ví dụ giải bài toán in ra tất cả các số nguyên tố 4 chữ số abcd sao cho ab=cd được thực hiện bằng thuật toán vét cạn như sau:
12 Thế nào là chiến lược quay lui? Ưu, nhược điểm của quay lui? Ví dụ
Chiến thuật quay lui tương tự như chiến lược vét cạn song có 1 điểm khác: nó lưu lại các trạng thái trên con đường đi tìm nghiệm của bài toán, nếu tới 1 bước nào đó không thể tiến hành tiếp, thuật toán sẽ quay lui về trạng thái trước đó và lựa chọn các khả năng khác
Ưu điểm: Thuật toán tìm ra được tất cả các nghiệm của bài toán 1 cách dễ dàng, có thể áp
dụng cho các bài toán với kích thước input nhỏ
Nhược điểm: Tốn nhiều thời gian cho phép thử nghiệm
Ví dụ: Sinh các dãy nhị phân độ dài N (N<=20)
Trang 1413 Thế nào là chiến lược chia để trị? Ưu, nhược điểm của chia để trị? Ví dụ
Thuật toán chia để trị thực hiện chia bài toán thành các bài toán nhỏ hơn, giải các bài toán nhỏ hơn đó, sau đó kết hợp nghiệm của các bài toán nhỏ hơn đó lại thành nghiệm của bài toán ban đầu
Ưu điểm: Số lượng công việc để tìm nghiệm bài toán sẽ giảm đi nên tốc độ thực hiện thuật
toán nhanh
Nhược điểm: Khó tách hợp lý bài toán thành các bài toán con và việc kết hợp lời giải của
các bài toán con sẽ khó thực hiện
int power(int a,int n)
Mô tả thuật toán:
Chúng ta xét mảng a gồm các phần tử a[0] a[n] Giả sử v là giá trị khóa mà ta gọi là chốt (pivot) Ta phân hoạch dãy a[0] a[n] thành 2 mảng con “bên trái” và “bên phải” Mảng con
“bên trái” bao gồm các phần tử có khóa nhỏ hơn chốt, mảng con “bên phải” bao gồm các phần
tử có khóa lớn hơn hoặc bằng chốt
Sắp xếp mảng con “bên trái” và mảng con “bên phải” thì mảng đã cho sẽ được sắp bởi vì tất cả các khóa trong mảng con “bên trái” đều nhỏ hơn các khóa trong mảng con “bên phải” Việc sắp xếp các mảng con “bên trái” và “bên phải” cũng được tiến hành bằng phương pháp nói trên
Vấn đề chọn chốt: Chọn khóa lớn nhất trong 2 phần tử có khóa khác nhau đầu tiên kể từ trái qua, nếu mảng chỉ gồm 1 hay nhiều phần tử có khóa bằng nhau thì không có chốt
Trang 15Vấn đề phân hoạch: Để phân hoạch mảng ta dùng 2 con nháy L và R, trong dó L từ bên trái
và R từ bên phải, ta cho L chạy sang phải cho tới khi gặp phần tử có khóa >= chốt và cho R chạy
từ trái cho tới khi gặp phần tử có khóa < chốt Tại chỗ dừng của L và R, nếu L < R thì hoán vị a[L] và a[R], lặp lại quá trình dịch sang phải, sang trái của 2 con nháy này cho đến khi L > R Giải thuật:
Trang 16Mô tả thuật toán:
- Input: mảng a[] đã được sắp xếp, có khóa tìm kiếm k
- Output: vị trí của phần tử có khóa bằng k
16 Trình bày chiến lược quy hoạch động? Ưu, nhược điểm? Ví dụ
Quy hoạch động là 1 phương pháp giải bài toán bằng cách kết hợp các lời giải cho các bài toán con của nó giống như phương pháp chia để trị Quy hoạc động được áp dụng khi các bài toán con của bài toán ban đầu không độc lập với nhau, chúng có chung các bài toán con nhỏ hơn Trong trường hợp như vậy 1 thuật toán chia để trị sẽ thực hiện nhiều việc hơn những gì thực sự cần thiết, nó sẽ lặp lại việc giải quyết các bài toán con nhỏ hơn đó 1 thuật toán quy hoạch động sẽ chỉ giải quyết tất cả các bài toán con nhỏ 1 lần duy nhất sau đó lưu kết quả vào 1 bản ghi và điều này giúp nó tránh không phải tính toán lại các kết quả mỗi khi gặp 1 bài toán con nhỏ nào đó
Trang 17Quy hoạch động thường được áp dụng cho các bài toán tối ưu, trong các bài toán đó thường có nhiều nghiệm, mỗi nghiệm có 1 giá trị được lượng giá bằng cách sử dụng 1 hàm đánh giá tùy thuộc vào các bài toán cụ thể và yêu cầu của bài toán là tìm ra 1 nghiệm có giá trị của hàm đánh giá là tối ưu
Ưu điểm: Dễ cài đặt, tốc độ thực hiện bài toán nhanh
Nhược điểm: Tốn bộ nhớ do cần lưu lại kết quả của bài toán con
17 Trình bày bài toán tìm dãy con chung dài nhất
Dãy con là dãy được định nghĩa là 1 tập con các ký tự của dãy (giữ nguyên thứ tự)
Giả sử ta có 2 dãy ký tự X[n] và Y[m]
Bước 1: Xác định đặc điểm của dãy con chung dài nhất:
- Giả sử chúng ta đã có lời giải Z[1 k]
- Nếu 2 ký tự cuối cùng của X và Y trùng nhau thì đó cũng là ký tự cuối cùng của Z
- Phần còn lại của Z khi đó sẽ là xâu con chung dài nhất của X[1 n-1] và Y[1 m-1]
- Nếu 2 ký tự cuối cùng của X và Y không trùng nhau thì một trong số chúng sẽ không nằm trong Z (có thể cả 2)
- Giả sử ký tự không nằm trong Z trong trường hợp đó là ký tự của X, thì Z sẽ là dãy con dài nhất của X[1 n-1] và Y[1 m]
- Ngược lại nếu ký tự không nằm trong Z là ký tự của Y thì Z sẽ là dãy con dài nhất của X[1 n] và Y[1 m-1]
Bước 2: Xây dựng công thức truy hồi tính độ dài lớn nhất của dãy con của 2 dãy
- Gọi C[i][j] là độ dài dãy con lớn nhất của 2 dãy X[1 i] và Y[1 j]
- C[i][0] = C[0][j] với mọi i, j
- Lời giải của bài toán chính là C[n][m]
- Công thức truy hồi [ ][ ] [ 1][ 1] 1(1)
- Trường hợp 1 là khi X[i] = Y[j], ngược lại là trường hợp 2
Bước 3: Xây dựng thuật toán tìm dãy con chung dài nhất của 2 dãy X[1 n] và Y[1 m]
int longest_common_sequence(X,Y)
{
for(i=0;i<=m;i++) C[i][0]=0;
for(j=0;j<n;j++) C[0][j]=0;
Trang 18D[i][j] = 2 (Trên) nếu C[i][j] = C[i-1][j]
D[i][j] = 3 (Trái) nếu C[i][j] = C[i][j-1]
18 Trình bày bài toán nhân ma trận
Để giảm số phép nhân cần dùng chúng ta sẽ tránh tạo ra các ma trận trung gian có kích thước lớn và do phép nhân ma trận có tính kết hợp nên có thể đạt được điều này bằng cách sử dụng các dấu đóng mở ngoặc để chỉ ra thứ tự phép nhân giữa các ma trận Bên cạnh đó phép nhân ma trận không đối xứng nên không thể hoán vị thứ tự của chúng mà không làm thay đổi kết quả
Trang 19Nếu có n ma trận thì sẽ có n+1 số nguyên là kích thước của chúng và sẽ có tổ hợp chập 2 của n phần tử các xâu con (mỗi xâu tương ứng với mỗi thứ tự của các dấu ngoặc) giữa 1 và n
nên chỉ cần dùng O(n2) không gian nhớ để lưu kết quả các bài toán con
19 Trình bày chiến lược tham lam Ưu, nhược điểm? Ví dụ
Chiến lược tham lam cũng giống như các thuật toán quy hoạch động thường được sử dụng để giải các bài toán tối ưu (tìm nghiệm của bài toán tốt nhất theo 1 tiêu chí nào đó) Các thuật toán quy hoạch động luôn cho 1 nghiệm tối ưu Các thuật toán tham lam thực hiện các lựa chọn tối ưu cục bộ với hy vọng các lựa chọn đó sẽ dẫn đến 1 nghiệm tối ưu toàn cục cho bài toán cần giải quyết
Ưu điểm: dễ cài đặt (độ phức tạp thời gian thường là hàm tuyến tính hoặc cùng lắm là bậc
2) Dễ gỡ lỗi và sử dụng ít bộ nhớ
Nhược điểm: Không phải lúc nào chúng cũng cho các lời giải tối ưu
Ví dụ: Dãy số (3, 4, 5, 17, 7, 8, 9) cần chọn ra dãy con của nó sao cho dãy con đó là một dãy
đơn điệu tăng Dễ dàng thấy kết quả đúng là (3, 4, 5, 7, 8, 9) Tuy nhiên theo cách chọn tham ăn sau khi chọn xong 3 phần tử đầu là 3, 4, 5 sẽ chọn tiếp phần tử 17, phần tử hợp thành 1 dãy tăng dài hơn đối với các phần tử được chọn trước đó và kết quả là 3, 4, 5, 17 Nhưng kết quả này không phải là đúng
20 Trình bày bài toán sắp lịch các sự kiện
Một phòng học chỉ có thể sử dụng cho 1 lớp học tại 1 thời điểm Có n lớp học muốn sử dụng phòng học, mỗi lớp học có 1 lịch học được cho bởi 1 khoảng thời gian Ij=[sj, fj] Mục đích của bài toán là tìm một lịch học sao cho số lượng lớp học có thể sử dụng phòng học là lớn nhất
có thể được và không có 2 lớp nào cùng sử dụng phòng học tại 1 thời điểm
Gọi Si, j là tập các lớp học bắt đầu sau thời điểm fi và kết thúc trước thời điểm Sj, có nghĩa là các lớp này có thể được sắp xếp giữa các lớp Ci và Cj
Chúng ta có thể thêm vào 2 lớp giả định C0 và Cn+1 với f0= −∞ và Sn+1 = +∞ Khi đó giá trị
S0, n+1 sẽ là tập chứa tất cả các lớp
Giả sử lớp Ck là 1 phần của lịch học tối ưu của các lớp nằm trong Si, j khi đó i < k < j và lịch học tối ưu bao gồm tập con lớn nhất của Si, k, {Ck}, và 1 tập con lớn nhất của Sk, j
Thực hiện 1 lựa chọn tham lam:
Bổ đề 1: Tồn tại 1 lịch học (thời khóa biểu) tối ưu cho tập Si, j chứa lớp Ck trong Si, j kết thúc đầu tiên, có nghĩa là lớp Ck trong Si, j với giá trị chỉ số k nhỏ nhất