Bài toán tập con

Một phần của tài liệu 28011_1712202001859520HuynhLeDaiNgoc.compressed (Trang 31)

M ăĐ U

2.2.2.2.Bài toán tập con

5. Ý nghĩa khoa học và thực tiễn ca đề tài

2.2.2.2.Bài toán tập con

Bài toán tập con là bài toán lựa chọn đối tượng phần tử có trong tập hợp đã cho mà không quan tâm đến th tự c a các phần tử ấy.

Với tập hợp X có n phần tử thì X có 2ntập con bao g m c phần tử rỗng và chính

nó.

Có các phương pháp cho bài toán tập con như:

- Phương pháp th tự từ điển: liệt kê tuần tự các tập con theo thư tự từ điển.

- Phương pháp mã Gray: theo th tự mã Gray, mỗi tập con sau được t o b i tập con đ ng trước nó bằng cách thêm hoặc bớt 1 phần tử.

- Phương pháp đếm nhị phân: sinh ra tập con S thông qua việc quan sát tập con S’ bằng một chuỗi nhị phân g m n bit. Sao cho bit th i bằng 1 nếu phần tử th i c a S thuộc S’

Ví dụ: tìm tất c tập con c a tập hợp A={1,2,3}

A có 23=8 tập con {},{1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}

Ta có thể biểu diễn các tập con c a dãy có 3 phần tử theo d ng dãy nhị phân, với giá trị 1 tương ng với phần tử đó xuất hiện trong tập con, giá trị 0 tương ng với việc phần tử đó không xuất hiện trong tập connhư b ng sau:

Bảng 2.3. Biểu diễn tập con theo dạng nhị phân

STT Phần tử 1 Phần tử 2 Phần tử 3 1 0 0 0 2 0 0 1 3 0 1 0 4 0 1 1 5 1 0 0 6 1 0 1 7 1 1 0 8 1 1 1

2.2.2.3. Hoán vị n phần tử

Hoán vị c a một tập đối tượng là sự liệt kê ra các đối tượng đó theo một trật tự nhất định. Hoán vị thư ng xuất hiện trong nhiều lĩnh vực toán học xem xét đến th tự c a các phần từ. Hoán vị xuất hiện nhiều trong các bài toán về sắp xếp trong ngành công nghệ thông tin.

Bài toán hoán vị:

Cho tập X g m n phần tử, mỗi hoán vị c a tập X là 1 cách liệt kê tất c các phần tử c a X theo 1 th tự nhất định. Với Sn là tập tất c các hoán vị c a tập X. Mỗi hoán vị trên tập X là một xong ánh f: XX nên có thể biểu diễn thành một dãy số nguyên độ dài n như sau

f= <f(1) f(2)…f(n)> với f(i) ∈X và f(i) ≠ f(j) nếu 1≤ i ≠ j ≤ n

Bài toán yêu cầu tìm ra tất c dãy số f này.

Ví dụ: Có 3 ký tự ABC tìm tất c các chuỗi có 3 ký tự t o từ 3 ký tự đã cho. Ta có 6 hoán vị c a nó để t o thành chuỗi có 3 ký tự {ABC}, {ACB}, {BAC},

{BCA}, {CAB}, {CBA}

Có nhiều phương pháp như là: phương pháp từ điển, từ điển ngược, thêm bớt một phần tử, đ i chỗ, sinh hoán vị nh vector nghịch thế,… chương 3 ta sẽ nghiên c u về phương pháp tìm hoán vị từ vector nghịch thế và tính toán song song hóa.

2.2.2.4. Bài toán phân hoạch

Phân ho ch tập hợp là phân chia các phần tử c a một tập hữu h n thành các tập con khác rỗng và không có phần tử chung.

Cho X là tập hợp g m có n phần tử

Một phân ho ch c a X là một họ các tập con π = {A1, A2,…Ak} thỏa các tính chất sau:

 Ai≠ ϕ, 1≤ i ≤ k

 Ai∩ Aj= ϕ;1≤ i < j ≤ k  A1 U A2 U … U Ak = X

Các tập con A1, A2,…Akđược gọi là các khối c a phân ho ch π Bài toán được đặt ra là tìm tất c các phân ho ch c a tập X

Ví dụ: phân ho ch c a tập 4 phần tử là: {{1234}}, {{123},{4}},

{{124},{3}}, {{12},{34}}, {{12},{3},{4}}, {{134},{2}}, {{13},{24}}, {{13},{2},{4}}, {{14},{23}}, {{1},{234}} {{1},{23},{4}}, {{14},{2},{3}}, {{1},{24},{3}}, {{1},{2},{34}}, {{1},{2},{3},{4}}

CH NGă3 (adsbygoogle = window.adsbygoogle || []).push({});

NGăD NGăTệNHăTOỄNăSONGăSONGăVĨOăBĨIăTOỄNăT ăH P

Chương 2 đã trình bày lý thuyết về toán t hợp cũng như các bài toán liệt kê có độ ph c t p lớn. chương này tập trung trình bày các ý tư ng và thuật toán để gi i quyết các bài toán đã nêu. Từ các thuật toán tính toán tuần tự đơn gi n ta vận dụng các phương pháp phân rã bài toán các dữ liệu đầu vào, đầu ra và phân cho các bộ xử lý thực hiện đ ng th i. Từ đó đềxuất các thuật toánxử lý song song.

3.1. BƠiătoánăsinhădưyăb ăchặn

Theo chương 2 trình bày việc sinh dãy bị chặn có thể liệt kê bằng cách liệt kê từ điển thông thư ng, ta xây dựng thuật toán tuần tự cho bài toán sinh dãy bị chặn:

3.1.1. Xây dựng thuật toán tuần tự

Thu tătoánă1: sinhăt tăc ădưyăb ăchặn

1. BEGIN

2. Nhập n, s[i], g[i], i=1,…,n //s, g là hai biên nhỏ nhất và lớn nhất

3. t[i]:=s[i], i=1,…,n

4. Repeat

5. Print t[i], i=1,…,n

6. i:=n;

7. While t[i] =g[i] do 8. Begin

9. t[i]:=s[i]; 10. i:=i-1; 11. End;

12. If i>=1 then t[i]:=t[i]+1; 13.Untill i=0

14.END

Trong thuật toán này, ta thấy trong vòng lặp bước 12, giá trị c a t[i] sẽ ch y tăng dần từ s[i] đến g[i] có g[i]-s[i]+1 giá trị. Mà i ch y từ n về 1 bước 10 nên có n

giá trị. Vậy độ ph c t p c a thuật toán sinh tất c dãy bị chặn này xấp xỉ bằng O(n*an)

với a = max {(g1-s1+1),(g2-s2+1),…,(gn-sn+1)}.

3.1.2. Xây dựng thuật toán song song

Ý tư ng thuật toán bắt đầu từ việc xét thấy bài toán yêu cầu tìm tất c các dãy bị chặn T nằm trong 2 dãy biên S và G có số lượng phần tử là n. Áp dụng phương pháp phân rã dữ liệu đầu vào ta thấy việc tìm các dãy bị chặn T có thể chia thành các đo n

nhỏ để tìm. Có nghĩa là trong kho ng giữa S và G ta chọn ra một số dãy bị chặn để có thể tr thành các dãy biên con trong đo n con mới.

Ta có thể chia dãy n phần tử thành 2 phần, phần 1 với p phần tử đầu và phần 2 với n-p phần tử còn l i. Ta tìm các dãy t’ là dãy bị chặn nằm trong kho n S’ và G’ có p phần tử đầu tiên c a dãy S, G ban đầu.

Gọi các dãy S1, S2,… là các dãy chặn con min và các dãy G1, G2,… là các dãy chặn con max. Việc tìm các dãy chặn con min ta có thể thêm vào bên ph i dãy chặn con t’(có p phần tử) các phần từ c a S từ phần tử th p+1, tương tự việc tìm các dãy chặn con max ta có thể thêm từ dãy t’ (có p phần tử) các phần từ c a G từ phần tử th

p+1. Như minh họa dưới đây:

S: S1: G1: S2: G2: … G:

Ta xây dựng thuật toán tính toán song song tìm tất c các dãy bị chặn n phần tử với cách chọn k=(g1-s1+1)*(g2-s2+1),…,(gp-sp+1) là t ng số bộ xử lý c a chương trình

(1<p<n) như sau:

Thu tătoánă2: song song sinhăt tăc ădưyăb ăchặn

1. Begin (adsbygoogle = window.adsbygoogle || []).push({});

2. Nhập n, p (p∈{2,3, … , n ứ 1})

3. Nhập s[i] và g[i], i = 1, … , n

4. k=(g1-s1+1)*(g2-s2+1)*…*(gp-sp+1); p=(2, 3,…,n-1) //k là số bộ xử lý

5. //Bộ xử lýđầu tiên tìm k đo n con, r i phân cho cácbộ xử lý khác Begin

//tìm dãy bị chặn theo thu tătoánă1và gửi dữ liệu đến các bộ xử lý

5.1. s’[i]=s[i], i=1,…,p 5.2. g’[i]=g[i], i=1,…,p

5.4. Gửi s[i], g[i] bước 3đếntất c các bộ xử lý phụ 5.5. Gửi (cjđến pj(j=1,…,k) End; 6. // k bộ xử lý phụ thực hiện đ ng th i, Begin 6.1.Nhận dữ liệu

6.2.T o sj bằng cách chèn các phần tử s[i] vào bên ph i c a cj (j=1,…,k) //j là chỉ số c a kbộ xử lý phụ

6.3.T o gj bằng cách chèn các phần tử g[i] vào bên ph i c a cj (j=1,…,k) //j là chỉ số c a k bộ xử lý phụ

6.4.tj[i]:=Sinh dãy bị chặn (sj(i), gj(i)), j=1,…,k, i=1,…,n //theo thu tă toán 1.

6.5.In kết qu

6.6.Gửi thông tin về bộ xử lý chính.

End; 7. End.

3.2. BƠiătoánătìmăt păcon

3.2.1. Xây dựng thuật toán tuần tự

Như chương 2 c a luận văn có trình bày, các kết qu tập con c a tập cho trước có thể biểu diễn dưới d ng dãy nhị phân có độ dài n phần tử được xác định. Nhận thấy các dãy nhị phân trong b ng biểu diễn đều là dãy (a1 a2 … an) có n phần tử tho i điều kiện 0 ≤ ai≤ 1, i ∈ (1 … n). Nên bài toán tìm tất c các tập con c a một tập hợp ta có thể suy ra từ bài toán tìm dãy bị chặn với s=(0 0…0) và g=(1 1…1)

Thu tătoánă3: tìmăt păconă

1. Begin

2. Nhập n và tập hợp X ={x1 x2 … xn} 3. s[i]:=0, i = 1, … , n

4. g[i]:=1, i = 0, … , n

5. Thu tătoánă1sinhăt tăc ăcácădưyăs ăb ăchặnt thỏa s ≤ t ≤ g

6. Thu tătoánă4 chuy năcácădưyăs ăb ăchặnătăthƠnhăcácăt păh păconăc aă

X

7. End

bước 6 ta có thuật toán riêng để xử lý như sau:

Thu tătoánă4: chuy năcácădưyb ăchặnătăthƠnhăcácăt păconăX

1. Begin

3. Kh i t o danh sách L = ϕ

4. For i=0 to n do

5. If ti=1 then chèn phần tử xi vào dãy L 6. X1:=L //s là 1 tập con c a X (adsbygoogle = window.adsbygoogle || []).push({});

7. End.

Áp dụng công th c (2) c a định lý 1 cho 2 dãy biên si và gita có độ ph c t p c a thuật toán xấp xỉ ∏ = 2n.

3.2.2. Xây dựng thuật toán song song

Tương tự bài toán song song trên, ta áp dụng phương pháp phân rã dữ liệu đầu vào, đầu ra để hình thành các lu ng dữ liệu có thể ch y song song. Để ý rằng với trong hệ nhị phân giá trị chỉ có thể là 0 hoặc 1 nên việc phân rã xem như tách p phần tử đầu ra và thêm 0 vào cho đ độ dài n sẽ tr thành các dãy bị chặn con để phân chia đến những bọ xử lý phụ. Số bộ xử lý có thể chọn sẽ là k=2p với 1<p<n. Với k bộ xử lý thuật toán song song tìm tất c tập con c a tập có n phần tử như sau:

Thu tătoánă5: songăsongătìmăt păconăc aăt păcóănăph năt

1. Begin

2. Nhập n, p (p∈{2,3, … , n ứ 1})

3. s[i]:=0, i = 1, … , n

4. g[i]:=1, i = 1, … , n

5. k:=2p; p=(2, 3,…,n-1) // k là số bộ xử lý

6. //Bộ xử lý đầu tiên tìm k đo n con, r i phân cho các bộ xử lý khác

Begin

//tìm dãy bị chặn theo thu tătoánă1và gửi dữ liệu đến các bộ xử lý

6.1.s’[i]=s[i], i=1,…,p

6.2.g’[i]=g[i], i=1,…,p

6.3.cj:=Sinh dãy bị chặn(s’(i), g’(i)), j=1,…,k //theoăthu tătoán 1.

6.4.Gửi s[i], g[i] bước 3 đến tất c các bộ xử lý phụ

6.5.Gửi (cjđến pj(j=1,…,k) End;

7. //k bộ xử lý phụ thực hiện đ ng th i,

Begin

7.1.Nhận dữ liệu

7.2.T o sjbằng cách chèn các phần tử s[i] vào bên ph i c a cj(j=1,…,k) //j là chỉ số c a k bộ xử lý phụ

7.3.T o gjbằng cách chèn các phần tử g[i] vào bên ph i c a cj(j=1,…,k) //j là chỉ số c a k bộ xử lý phụ

7.4.tj[i]:=Sinh dãy bị chặn (sj(i), gj(i)), j=1,…,k, i=1,…,n //theo thu tătoánă 1.

7.5.Chuyển tất c các dãy bị chặn tj[i] thành các tập con theo thu tătoánă4. 7.6.In kết qu

7.7.Gửi thông tin về bộ xử lý chính.

End; 8. End.

3.2.3. Ví dụ minh họa tìm tất cả tập con con của tập có 4 phần tử

Với n=4, ta có thể chọn p=2 lúc đó có 1 bộ xử lý chính và 4 bộ xử lý phụ. Ta có 2 dãy chặn s=(0 0 0 0) g=(1 1 1 0)

Với p=2 ta có các dãy nhị phân 00, 01, 10, 11 từ các dãy này ta thêm 0 để cho đ n phần tử. Ta được dãy 0000, 0100, 1000, 1100 là các dãy biên con để truyền vào các bộ xử lý tương ng. (adsbygoogle = window.adsbygoogle || []).push({});

Bảng 3.1. Bộ xử lý phụ sinh dãy nhị phân bị chặn với tập 4 phần tử

Bộ xử lý 1 Dãy bị chặn Bộ xử lý 2 Dãy bị chặn Bộ xử lý 3 Dãy bị chặn Bộ xử lý 4 Dãy bị chặn 0000 0100 1000 1100 0001 0101 1001 1101 0010 0110 1010 1110 0011 0111 1011 1111

Từ đó theo các thuật toán 4 sẽ sinh rađược các tập con tương ng.

3.2.4. Phân tích

Tương tự như bài toán tìm dãy bị chặn n phần tử, bài toán tìm tập con c a tập có n phần tử là trư ng hợp đặt biệt với dãy chặn min s=(0…0) (có n số 0) và max

g=(1…1) (có n số 1).

Với cách chọn số bộ xử lý k=2p (1<p<n)

Vì các dãy bị chặn con cho từng bộ xử lý t o ra bằng cách lấy p phần tử đầu trong dãy nhị phân ban đầu và thêm 0 vào cho đ n phần tử nên các dãy chặn con điều nằm trong kho n từ s=(0…0) và g=(1…1) (n phần tử).

Số dãy bị chặn t i mỗi bộ xử lý phụ là 2n-pdãy. Đ ng th i số bộ xử lý là k=2p nên

ta có t ng số dãy con t o ra là 2p

* 2n-p =2n dãy.

Vậy độ ph c t p c a thuật toán 5 song song tìm tập con c a tập có n phần tử xấp xỉ 2n-p +T với T là th i gian truyển thông giữa các bộ xử lý. T phụ thuộc vào từng hệ thống vật lý thực tế.

3.3. Bài toán li tăkêăhoánăv 3.3.1. Phép thế, nghịch thế

Theo lý thuyết về đ i số tuyến [5], phép thế và nghịch thế được định nghĩa như

sau:

Một phép thế σ trên tập Xn được gọi là một chuyển trí hai phần tử i, j thuộc Xn nếu σ(i) = j, σ(j) = i và σ(k) = k, với mọi k ∈ Xn, k ≠ i, k ≠ i.

Gi i sử tập hợp Xn = {1,2,3,..,n}, (n>1) Một song ánh σ: Xn→Xn được gọi là phép thế trên tâp Xn. Tập tất c các phép thế ký hiệu là Sn.

Phép thế σ: Xn→ Xn được biểu diễn như sau:

( )

Trong đó, σ(i) là nh c a phần tử i ∈ Xn được viết dòng dưới, trong cùng một cột với i.

Ví dụ:

Là phép thế trên tập X4 = {1,2,3,4} xác định b i: σ(1) = 3, σ(2) = 2, σ(3) = 4, σ(4) = 1.

Như vậy, nh c a các phần tử c a tập Xn qua mỗi phép thế cho ta một hoán vị trên tập Xn. Nguợc l i, mỗi hoán vị l i xác định một phép thế, chẳng h n, hoán vị (3, 4, 1, 2) xác định phép thế trên tập X4. Vì vậy, số các phép thế trên tập Xn bằng số các hoán vị trên tập Xn, nghĩa là bằng n!. Như vậy, tập Sncó n! phần tử.

Ví dụ: S3có 3! = 1.2.3 = 6 phần tử. Có những phép thế sau:

Phép nghịch thế được hiểu như sau:

Gi sử một phép thế trên tập Xn. Với i, j ∈ Xn, i ≠ j, ta nói cặp (σ(i), σ(j)) là một nghịch thế c a σ nếu i <j nhưng σ(i) > σ(j).

Ví dụ. Trên X3, phép thế có 1 nghịch thế là: (2, 1). (adsbygoogle = window.adsbygoogle || []).push({});

Phép thế có 3 nghịch thế: (3, 2), (3, 1), (2, 1).

Vậy trên tâp Xn có n phần tử và có n! phép thế, ng với mỗi phép thế ta có số nghịch thế khác nhau. Ta gọi dãy nghịch thế như sau: Dãy nghịch thế là dãy g m số nghịch thế t i t i từng phần tử trong phép thế nhất định.

Bảng 3.2. Hoán vị, dãy nghịch thế, dãy nghịch thế ngược 3 phần tử

STT Hoán vị

( nh phép thế) Dãy nghịch thế Dãy nghịch thế ngược

1 1 2 3 0 0 0 0 0 0 2 2 1 3 1 0 0 0 0 1 3 3 1 2 2 0 0 0 0 2 4 1 3 2 0 1 0 0 1 0 5 2 3 1 1 1 0 0 1 1 6 3 2 1 2 1 0 0 1 2

Ta thấy ng với mỗi hoán vị ta có một dãy nghịch thế ngược và mỗi dãy nghịch thế ngược xác định một hoán vị. Hơn nữa, kết hợp với phần lý thuyết phần 2.1 về dãy bị chặn ta có thể xem dãy nghịch thế ngược là dãy bị chặn b i 2 dãy biên là s=(0, 0, 0)

và g=(0, 1, 2) . Từ đó ta có thể phát triển thuật toán tìm hoán vị c a n phần tử bằng dãy nghịch thế ngược được sinh ra từ dãy bị chặn. Kết hợp với việc phân rã dãy nghịch thế ngược theo từng đo n nghiệm con để có thể tiến hành tính toán song song nhằm gia tăng hiệu năng tính toán.

3.3.2. Xây dựng thuật toántuần tự

Như phần 3 c a chương3 đã trình bày ta xây dựng thuật toán cho bài toán liệt kê hoán vị, nhưng trước hếtcần ch ng mình một số định lýđể đ m b o tính đúng đắn:

Đ nhălýă2: Cho hai dãy biên s=(0 …0) (có n phần tử0) và g=(0 1 2 …n-1). Các

dãy số bị chặn t thỏa là dãy nghịch thế ngược c a tập Xn= {1, 2, 3,..., n}, (

). và số dãy t bằng n! và nghịch thếngược s=(0 …0) tương ng với hoán vị (1 2

…n) và nghịch thế ngược g=(0 1 2 …n-1) tương ng với hoánvị (n n-1 … 1). Chng minh:

Cho Xn= {1, 2, 3,..., n}, ( ). Hoán vịđầu tiên là (1 2 3 …n).

Ta thấy trước 1 không có gặp ngịch thế nào nên số nghịch thế c a 1 bằng 0, trước

Một phần của tài liệu 28011_1712202001859520HuynhLeDaiNgoc.compressed (Trang 31)