Ứng dụng sql để liệt kê các phần tử của bài toán tổ hợp

Liên hệ QC

haonlh

Thành viên tích cực
Tham gia
2/12/07
Bài viết
1,177
Được thích
587
ỨNG DỤNG SQL ĐỂ LIỆT KÊ CÁC PHẦN TỬ CỦA BÀI TOÁN TỔ HỢP
Các bài toán tổ hợp thường cho kết quả khá lớn. Việc hiển thị các kết quả đó không phải là yêu cầu của bài toán. Nhưng nếu được thì đó là cách hỗ trợ khá tốt, có thể gợi ý để tìm ra lập luận cho có kết quả đúng.
Bài viết này coi rằng bạn đã biết khái niệm tích Đề các, các loại tổ hợp cơ bản và ít nhiều sử dụng câu lệnh SQL trên Access, hay trên Excel (phải viết ở phần VBA). Từ đó chỉ ra cách tạo liệt kê các tổ hợp cơ bản.
Một tiện lợi của lệnh SQL là viết điều kiện Where khá gần với ngôn ngữ nói thông thường nên sẽ dễ dàng áp dụng cho các bài toán trong chương trình lớp 12.
Hy vọng bài viết sẽ giúp ích cho các bạn giáo viên và học sinh
1. Câu lệnh SQL đơn giản và tích Đề các

Các tập hợp có thể biểu diễn thành bảng có 1 cột. Biểu diễn bảng trong Excel là 1 vùng 1 cột, không cần tên trường, vùng đó đặt tên là A, B. Excel lấy F1 làm tên trường của mọi bảng.
Còn nếu thể hiện trong Access, hãy tạo bảng là A, B, nên đặt tên trường cũng là F1 để tiện theo dùng như các ví dụ.
Câu lệnh SQL đơn giản nhất là Select A.F1, B.F1 From A, B;
thì kết quả là 1 bảng, thực chất là tích Đề các của các cột của các bảng đó.
Ví dụ 1: Nếu A = {a,b,c}, B = {0;1} thì câu lệnh trên áp dụng cho 2 bảng A, B là một bảng, viết ở dạng tập hợp là {(a, 0) , (a, 1), (b, 0) , (b, 1), (c, 0) , (c, 1)}.
Nếu A = B thì ta kí hiệu A[SUP]2[/SUP] = A×A. Còn câu lệnh SQL là
Select A1.F1, A2.F2 From A A1, A A2;
Chú ý: Đúng ra là: Select A1.F1, A2.F2 From A As A1, A As A2; nhưng tôi đã thử và Access chạy bình thường.
Sau đây, các ví dụ thường xét trên 2 tập A = {1; 2; ...; n} (có n phần tử) và tập B ={0; 1} (có 2 phần tử) và các số nguyên dương k, n.
2. Chỉnh hợp lặp chập k của n

Ví dụ 2. Nếu A = {1; 2; 3} thì câu lệnh
Select A1.F1, A2.F2 From A A1, A A2;
cho chỉnh hợp lặp chập 2 của 3 là 1 bảng, viết ở dạng tập hợp là (mỗi hàng của bảng là 1 tọa độ)
A[SUP]2[/SUP] ={(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)}
Ví dụ 3. Câu lệnh
Select B1.F1, B2.F1, B3.F1, B4.F1, B5.F1
From B B1, B B2, B B3, B B4, B B5;
cho tập hợp B[SUP]5[/SUP] = {
(0, 0, 0, 0, 0), (0, 0, 0, 0, 1), (0, 0, 0, 1, 0), (0, 0, 0, 1, 1),
(0, 0, 1, 0, 0), (0, 0, 1, 0, 1), (0, 0, 1, 1, 0), (0, 0, 1, 1, 1),
(0, 1, 0, 0, 0), (0, 1, 0, 0, 1), (0, 1, 0, 1, 0), (0, 1, 0, 1, 1),
(0, 1, 1, 0, 0), (0, 1, 1, 0, 1), (0, 1, 1, 1, 0), (0, 1, 1, 1, 1),
(1, 0, 0, 0, 0), (1, 0, 0, 0, 1), (1, 0, 0, 1, 0), (1, 0, 0, 1, 1),
(1, 0, 1, 0, 0), (1, 0, 1, 0, 1), (1, 0, 1, 1, 0), (1, 0, 1, 1, 1),
(1, 1, 0, 0, 0), (1, 1, 0, 0, 1), (1, 1, 0, 1, 0), (1, 1, 0, 1, 1),
(1, 1, 1, 0, 0), (1, 1, 1, 0, 1), (1, 1, 1, 1, 0), (1, 1, 1, 1, 1)}
Qua đó, chỉnh hợp lặp không hạn chế giá trị k.
Liệt kê chỉnh hợp và tổ hợp xin để bài tiếp.
Nội dung sau là nhập thử
(0, 0, 0, 0, 0), (0, 0, 0, 0, 1), (0, 0, 0, 1, 0), (0, 0, 0, 1, 1),
 
Lần chỉnh sửa cuối:
Phần tiếp theo gồm chỉnh hợp và tổ hợp chập k của n (k<=n). Sau đó sẽ có phần file đính kèm 2 file, dùng cho Access và Excel (đang lo viết vì Excel có code)

Vì bộ soạn thảo GPE không hỗ trợ gõ công thức toán và phần tổ hợp có kí hiệu tập con, thuộc và kg thuộc nên tôi sẽ nhập trên Word và gửi file đính kèm.

Mong các thành viên trao đổi để các ứng dụng của SQL có thêm các lý thú và hữu ích.
 
Sau đây là nội dung của phần chỉnh hợp (không lặp) và tổ hợp. Do bài viết có một số kí hiệu toán nên tôi gửi file nén chứa 3 file
+ ToHopGPE.doc: bao gồm cả nội dung của #1, và nội dung mới, một vài giải thích về 2 file Excel và Access. Cuối là 1 bài của trang Web toán
+ ToHopGPE.xls: Có sẵn Code Main với phím nóng Ctrl - R. Cần chú ý viết tham số.
+ ToHopGPE.dbm: File này chủ yếu để làm ví dụ cuối
Xin lỗi, ToHopGPE.mdb

Hy vọng bài viết và các file demo là hữu ích.

Mong nhân được phản hồi của các bạn.
 

File đính kèm

  • ToHopGPE.rar
    215.9 KB · Đọc: 241
Lần chỉnh sửa cuối:
Mình góp 1 cách tổ hợp. Tập A={1;2;3;4;5}. Câu lệnh SQL biểu diễn tổ hợp chập 3 của 5 phần tử:
SELECT a1.f1,a2.f1,a3.f1 FROM a a1,a a2,a a3 WHERE a1.f1<a2.f1 and a2.f1<a3.f1
Tuy nhiên cái khó của bài toán tổ hợp là khi nào dùng tổ hợp, khi nào dùng chỉnh hợp. Biết được rồi thì dùng công thức là có kết quả ngay.
 
Mình góp 1 cách tổ hợp. Tập A={1;2;3;4;5}. Câu lệnh SQL biểu diễn tổ hợp chập 3 của 5 phần tử:
SELECT a1.f1,a2.f1,a3.f1 FROM a a1,a a2,a a3 WHERE a1.f1<a2.f1 and a2.f1<a3.f1
Tuy nhiên cái khó của bài toán tổ hợp là khi nào dùng tổ hợp, khi nào dùng chỉnh hợp. Biết được rồi thì dùng công thức là có kết quả ngay.

Đây là cách liệt kê mọi tập con có 3 phần tử của tập có 5 phần tử.

Nếu bạn dùng Excel thì ô hoạt động là
CH 3 5
Sau khi chạy xong thì có câu lệnh

Select a1.f1, a2.f1, a3.f1 From A a1, A a2, A a3 Where a1.f1 <> a2.F1 And a1.f1 <> a3.F1 And a2.f1 <> a3.F1 ;

Sửa thành
Select a1.f1, a2.f1, a3.f1 From A a1, A a2, A a3 Where a1.f1 < a2.F1 And a2.f1 < a3.F1 ;

Có lẽ tôi sưả code để câu lệnh cho tổ hợp ở dạng này. Tất nhiên cũng phải sửa bài "ví dụ cuối"

Còn về khi nào dùng chỉnh hợp , khi nào dùng tổ hợp thì phải dựa vào cách chọn mẫu. Mẫu có thứ tự là chỉnh hợp, không thứ tự là tổ hợp
 
Lần chỉnh sửa cuối:
BÀN THÊM VỀ TẬP CON

Bài toán tập con đã được quy về tổ hợp.Mỗi tập con được quy về thuộc tính của từng phần tử là 0/1 để biết nó thuộc tập con hay không.


Nếu cần chia 1 tập A có n phần tử thành 3 tập con thì ta cần tìm mô hình xử lý.


+ Đánh số các phần tử của A. Chuẩn bị 3 tập con và cũng đánh số là tập 1, 2,3
+ Lấy phần tử thứ nhất (của A) và chọn 1 tập con để bỏ nó vô. Ví dụ chọn tập con 1
+ Lấy phần tử thứ hai và chọn 1 tập con để bỏ nó vô. Ví dụ chọn tập con 2

+ Lấy phần tử thứ ba và chọn 1 tập con để bỏ nó vô. Ví dụ chọn tập con 1.


+ Nhận thấy mẫu là dãy n giá trị của tập {1;2;3}. Có thứ tự, lặp

Vậy, với n = 7, ta liệt kê nó (trong file ToHopGPE.xls) là CHL 7 3
Một vecto 7 chiều (1;1;1;1;1;1;1) cho ta biết cả 7 phần tử của tập A đều thuộc tập con thứ nhất. Các tập con kia đều rỗng.


Ví dụ trên cho ta cách nhận biết dùng CHL hay CH hay TH


Nếu thêm điều kiện: Các tập con đều không rỗng. Tôi nghĩ đã liệt kê trên Excel thì có thể tìm được bằng công thức
=AND(COUNTIF(A11:G11,1)>0,COUNTIF(A11:G11,2)>0,COUNTIF(A11:G11,3)>0)
(nhập vô ô H11), chép xuống và lọc TRUE


Còn nếu làm trên Access thì sao. Nếu sửa trên câu lệnh SQL trong Excel thì sửa sao. Và lập luận thuần toán thì sao.


Cảm ơn các bạn đã xem. Rất cảm ơn nếu tham gia bàn luận.
 
Web KT
Back
Top Bottom