Tập hợp
• Cấu trúc dữ liệu tập hợp(set) trong Maple đ−ợc dùng để gom các đối t−ợng phân biệt vào trong cùng một nhóm gọi là tập hợp. Tập hợp đ−ợc tạo thành bằng cách bao quanh một dãy trong cặp dấu ngoặc móc ('{ }'). Giống nh− hầu hết các đối t−ợng khác trong Maple, ta có thể gán Tập hợp cho các biến, và có thể sử dụng tập hợp nh− là đối số hoặc là kết quả của một số hàm. Tập hợp khác danh sách ở chỗ, các phần tử trong một tập hợp phải phân biệt nhau.
• Các phép toán đ−ợc sử dụng cho kiểu tập hợp: union (hợp của hai tập hợp),
intersect (giao của hai tập hợp), minus (hiệu của hai tập hợp). Tập hợp rỗng đ−ợc kí hiệu là {}.
• Trật tự của các phần tử trong tập hợp đ−ợc quyết định bởi hệ thống. Giống nh− các số hạng trong một tổng, trật tự của một tập hợp thì không thay đổi trong mỗi lần tính toán, nh−ng lại thay đổi giữa các phiên (session) tính toán, và
giữa các máy khác nhau. Vì vậy, một tập hợp có thể đ−ợc in là
{x,y,z}trong lần tính toán này, trong khi ở lần khác nó có thể xuất hiện d−ới dạng {z,y,x}. Nếu bạn muốn có một trật tự rõ ràng cho các phần tử, hãy dùng một danh sách để l−u dữ liệu.
Danh sách
• Danh sách (list) là một cấu trúc dữ liệu trong Maple dùng để gom các đối t−ợng (có thể giống nhau hoặc khác nhau) thành một danh sách.
• Giống nh− cấu trúcdãy, danh sách l−u giữ dữ liệu theo trật tự nh− khi đ−ợc tạo ra. Hai giá trị giống nhau có thể đ−ợc l−u trữ trong cùng một danh sách, trong khi đó chúng sẽ bị loại bỏ bớt đi một nếu chúng đ−ợc l−u trữ trong cùng một
tập hợp. Các toán tử dùng trong cấu trúc tập hợp: union, intersect, minus
không đ−ợc định nghĩa cho danh sách.
• Một danh sách có thể đ−ợc tạo ra bằng cách bao quanh một dãy bằng cặp dấu ngoặc vuông ([ ]), và khi ấy nó không còn là một dãy. Ng−ời ta th−ờng sử dụng danh sách để nhóm các đối t−ợng với nhau khi mỗi nhóm đ−ợc xem nh− là một đối số đơn của một hàm nào đó.
• Để minh hoạ cho sự khác nhau giữa dãy và danh sách trong Maple, ta xét lệnh
x:=[a,b],[b,c], khi đó a sẽ đ−ợc gán là dãy của hai danh sách x:=[a,b],[b,c] , trong khi đó x:=(a,b),(b,c) thì kết quả gán cho x sẽ tự động nối lại thành dãy đơn x:=a,b,b,c.
• Hàm op() đ−ợc dùng để rút ra một thành phần trong một biểu thức, và do đó ta có thể sử dụng nó để lấy ra một thành phần trong một danh sách: phần tử thứ i do hàm op() cho chính là đối t−ợng thứ i trong danh sách hay tập hợp, theo trật tự phụ thuộc việc bạn thấy tập hợp và danh sách đ−ợc in ra nh− thế nào. Chẳng hạn khi bạn gán x:=[a,b,d,c] thì lệnh này in ra màn hình là x:=[a,b,d,c], khi đó lệnh y:=op(3,x) sẽ cho lại kết quả y:=d.
• Việc ghép 2 dãy nhỏ thành một dãy to là khá đơn giản (xem phần trên). Nh−ng để gộp (involving) hai hay nhiều danh sách (hoặc là tập hợp) với nhau để tạo ra một danh sách (hay tập hợp) mới thì không đơn giản nh− vậy. Muốn làm điều này ta tiến hành qua 3 b−ớc: tr−ớc hết ta biến đổi chúng thành các dãy
(bằng lệnh seq()), rồi dùng lệnh ghép các dãy nhỏ thành dãy to, sau đó biến đổi dãy thành một danh sách (hoặc tập hợp) bằng cách đ−a chúng vào trong cặp dấu ngoặc thích hợp. Để hiểu rõ thêm, xin xem trong phần ví dụ.
• Toán tử [] dùng để tham chiếu đến một phần tử của một danh sách, tập hợp. Ví dụ, ta có ds=[a,b,d,c] là một danh sách, lời gọi y:=ds[2] sẽ cho ta kết quả là y=b. Ta cũng có thể dùng toán tử trên để thay đổi giá trị của một phần tử trong danh sách nh−ng không thể dùng lệnh này để thay đổi bất cứ phần tử nào trong tập hợp. Chẳng hạn đối với danh sách ds=[a,b,d,c] trên, lệnh
ds[2]:=e sẽ thay giá trị b của phần tử thứ 2 trong danh sách ds thành e, vì vậy danh sách trở thành x=[a,e,d,c], trong khi đó đối với tập hợp y:={a,b,d,c} thì lệnh y[2]:=e sẽ báo lỗi.
• Hàm subsop() đ−ợc dùng để tạo ra một danh sách hay tập hợp mới bằng cách thay thế một hay nhiều phần tử của một danh sách hay một tập hợp đã cho nào đó. Xem cụ thể hơn ở phần sau.
Lệnh tạo danh sách và tập hợp
• Ta đã biết cách tạo một dãy bằng lệnh seq() hoặc bằng cách liệt kê các phần tử. Một cách thông th−ờng để tạo ra một danh sách (hay là một tập hợp) là tạo từ một dãy bằng cách đ−a nó vào trong một cặp dấu ngoặc t−ơng ứng.
• Một cách khác để tạo một danh sách(tập hợp) là tìm cách biến đổi một hay một số phần tử của một danh sách(tập hợp) đã có sẵn. Lệnh supsop đ−ợc mô tả sau đây cho phép thay thế một số thành phần của danh sách đã cho bằng một số thành phần khác: subsop(index = replacement, expression).Trong lệnh này, tham biến expression có thể nhận giá trị là một biểu thức, thành phần tại vị trí index trong biểu thức expression
đ−ợc thay bởi giá trị mới là replacement. Nh− vậy, hàm supsop() tạo ra một biểu thức hoàn toàn mới giống biểu thức mẫu, trừ phần tử bị thay thế. Lệnh supsop(i=NULL,ds) dùng để xoá thành phần thứ i trong ds.
• Hàm subsop(index1=repl1,...indexn=repln,expr) cho phép tạo ra biểu thức mới bằng cách thay thế n giá trị tại n vị trí trong biểu thức
expr. Minh họa [>restart; Khai báo tập hợp: [>taphop1:={a,b,c}; := taphop1 {a b c, , } [>taphop2:={a,d,e};
:=
taphop2 {e a d, , }
[>taphop3:={e,f};
:=
taphop3 {e f, }
Thực hiện các phép toán trên tập hợp: [>taphop4:=taphop1 union taphop2;
:=
taphop4 {e a b c d, , , , }
[>taphop5:=taphop2 intersect taphop3;
:=
taphop5 { }e
[>taphop6:=taphop1 minus taphop2;
:=
taphop6 {b c, }
[>taphop6[2];
c
Khai báo các danh sách: [>list01:=[x,y,z]; := list01 [x y z, , ] [>list02:=[z,t,u,v]; := list02 [z t u v, , , ]
Thực hiện các phép toán trên danh sách: [>list03:=[list01,list02]; := list03 [[x y z, , ],[z t u v, , , ]] [>list04:=[op(list01),op(list02)]; := list04 [x y z z t u v, , , , , , ]
Dùng hàm op() để tham chiếu đến phần tử thứ i của danh sách: [>op(3,list04);
z
[>list04[3];
z
Tạo danh sách mới với một thành phần đ−ợc thay đổi: [>list05:=subsop(5=a,list04);
:=
list05 [x y z z a u v, , , , , , ]
Phép gán không thay đổi phần tử của tập hợp, hơn thế, chúng có thể làm mất dữ liệu l−u trong tập hợp:
[>taphop4[4]:=a;
Error, cannot assign to a set
3.4.3. Cấu trúc dữ liệu bảng
Lệnh tạo bảng
Khai báo:
table(F,L);
F: (tuỳ chọn) Hàm chỉ mục.
L: (tuỳ chọn) Danh sách hay tập hợp các giá trị khởi tạo cho bảng.
• Hàm table() đ−ợc sử dụng để tạo một bảng trong Maple. Nếu đối số chúng ta truyền cho hàm table() là một danh sách các đẳng thức thể hiện mối quan hệ giữa các chỉ mục và các giá trị của bảng, thì danh sách đó đ−ợc dùng để định rõ phần khởi tạo cho các phần tử của bảng. Nếu hàm table không nhận đ−ợc đối số nào, thì bảng sẽ đ−ợc khởi tạo rỗng.
• Bất cứ tên biến ch−ơng trình nào trong Maple cũng có thể nhận giá trị là một
bảng. Sau khi gán, tên biến đó trở thành tên của bảng. Nội dung của toàn bộ bảng thì đ−ợc in ra màn hình bằng cách dùng lệnh print.
Mô tả
• Bảng là cấu trúc dữ liệu đ−ợc Maple dùng để l−u trữ dữ liệu theo từng cặp các
chỉ mục và giá trị. Một bảng là một quan hệ t−ơng ứng một-nhiều giữa hai tập dữ liệu rời rạc. Nói cách khác, ta có thể xem nó nh− một ánh xạ đa trị từ tập dữ liệu này vào tập dữ liệu kia. Hai tập dữ liệu này đ−ợc gọi t−ơng ứng là
miền xác định (domain) và miền giá trị (range) của bảng, mỗi một giá trị trong miền xác định t−ơng ứng với một hay một số giá trị trong miền giá trị. Các phần tử trong miền xác định của bảng đ−ợc gọi là các khoá(key) (hay còn gọi là các chỉ mục (index) vì miền xác định đ−ợc xem nh− là một dãy). Hàm
indices(bang) cho lại kết quả là dãy các khoá này của bảng bang. Còn các phần tử trong miền giá trị của bảng đ−ợc gọi là các giá trị(value) của bảng hay là các phần tử (entries) của bảng. Hàm entries(bang) trong Maple cho lại kết quả là dãy các giá trị của bảng bang.
• Trật tự của các chỉ mục và các phần tử của một bảng do hàm indices và hàm
entries cho biết không nhất thiết phải trùng với trật tự khi chúng đ−ợc nhập vào bảng. Nguyên nhân là do Maple đã sử dụng một bảng băm (là một kiểu cấu trúc dữ liệu đ−ợc dùng nhiều trong tin học) để l−u trữ các chỉ mục và các
phần tử của bảng. Tuy vậy, giữa dãy các chỉ mục do hàm indices và dãy các giá trị do hàm entries cho lại vẫn có sự t−ơng ứng một-một. Với việc sử dụng kĩ thuật bảng băm, bảng sẽ trở thành một cấu trúc dữ liệu rất lợi hại cho việc tìm kiếm và tra cứu. Việc tìm phần tử bảng t−ơng ứng cho một khoá nào đó trong bảng là rất nhanh. Thời gian tìm kiếm gần nh− một hằng số, không phụ thuộc vào cỡ lớn của bảng. Nh− vậy, bảng là công cụ rất thích hợp cho việc thiết lập các sổ tra cứu, thí dụ: thiết lập từ điển giải nghĩa các lệnh trong Maple, và từ điển ng−ợc: tìm các lệnh của Maple thực hiện một chức năng nào đó (trong toán học).
• Dùng hàm assigned() để kiểm tra một phần tử đã đ−ợc gán cho bảng hay ch−a. Một phần tử có thể đ−ợc xóa bằng cách gán cho nó chính tên của nó.
Minh họa
Ví dụ sau là một bảng t−ơng ứng giữa một từ chỉ một màu trong tiếng Việt với hai từ chỉ đến màu t−ơng ứng trong tiếng Anh và tiếng Pháp.
[>MAUSAC[maudo]:=red,rouge;
:=
MAUSACmaudo red rouge,
[>MAUSAC[mauxanh]:=blue,bleu;
:=
MAUSACmauxanh blue bleu,
[>MAUSAC[mauvang]:=yellow,jaune;
:=
MAUSACmauvang yellow jaune,
Miền xác định(domain) của bảng là tên màu sắc trong tiếng Việt, còn các phần tử t−ơng ứng trong miền giá trị(range) là các màu sắc t−ơng ứng trong tiếng Anh và tiếng Pháp. Các chỉ mục trong bảng MAUSAC trên là: maudo, mauxanh, mauvang, còn các giá trị của bảng t−ơng ứng với các chỉ mục trên là các cặp red,rouge, blue,bleu và yellow,jaune. Ta có thể sử dụng các hàm indices và hàm
entries để liệt kê dãy các chỉ mục và các giá trị của bảng: [>indices(MAUSAC);
, ,
[mauxanh] [mauvang] [maudo]
[>entries(MAUSAC);
, ,
[blue bleu, ] [yellow jaune, ] [red rouge, ]
Ta có thể đọc dữ liệu trong bảng bằng cách gọi tên bảng với chỉ mục t−ơng ứng: [>MAUSAC[maudo];
,
red rouge
Xoá một phần tử của bảng bằng cách gán cho chính tên của nó: [>MAUSAC[mauxanh]:='MAUSAC[mauxanh]';
:=
MAUSACmauxanh MAUSACmauxanh
Ta có thể kiểm tra lại xem phần tử có chỉ mụcmauxanh đã đ−ợc xoá hay ch−a: [>assigned(MAUSAC[mauxanh]); false [>assigned(MAUSAC[mauvang]); true In ra giá trị của bảng: [>print(MAUSAC);
table([mauvang = (yellow jaune, ),maudo = (red rouge, )])
3.4.4. Cấu trúc dữ liệu mảng
Mô tả
• Mảng là một kiểu của cấu trúc dữ liệu bảng, trong đó các chỉ số của một mảng
bất kì đều là các số nguyên và phạm vi của các chỉ số mảng phải đ−ợc định rõ khi khai báo mảng thông qua hàm array().
• Để tạo ra một mảng, ta phải định rõ phạm vi chỉ số cho mỗi chiều của mảng. Thêm vào đó, bạn có thể định tr−ớc mảng là th−a, đối xứng, phản đối xứng hay theo một số kiểu định nghĩa riêng của bạn.
• Việc thay đổi và sao chép mảng làm việc giống nh− trong bảng. Nói chung việc sử dụng mảng với bảng là giống nhau, trừ việc giới hạn chỉ mục là số nguyên trong mảng và bất cứ sự tham chiếu đến một thành phần của mảng
đều đ−ợc kiểm tra xem nó có nằm trong phạm vi chỉ số của mảng hay không.
Minh họa
Định nghĩa A là một mảng hai dòng hai cột: [>A:=array(1..2,1..2);
:=
A array(1 2.. ,1 2 [ ].. , )
Các phần tử của A có thể đ−ợc gán giá trị: [>A[1,1]:=1;A[2,1]:=4;
:=
A1 1, 1 :=
A2 1, 4
Giống nh− trong bảng, Maple định giá trị của biến theo tên cuối (last name evaluation) thay cho định giá trị hoàn toàn cho biến ( full evaluation). Dùng lệnh print để xem nội dung mảng:
[>A; A [>print(A); 1 A1 2, 4 A2 2,
Các chỉ số t−ợng tr−ng tạo nên những tham chiếu đến mảng t−ợng tr−ng. Khi các chỉ số đó đ−ợc gán giá trị , thì sự định giá hoàn toàn sẽ sinh ra một tham chiếu đến mảng thực sự: [>i:='i'; := i i [>B:=A[i,1]; := B Ai,1 [>i:=2; := i 2 [>B; 4
Một mảng một chiều đ−ợc định nghĩa, với phạm vi chỉ số từ -1 đến 3. Theo nh−
cách thức đã làm trong cấu trúc bảng, chúng ta cũng sẽ định nghĩa giá trị b[-1] là t khi ta định nghĩa mảng: [>B:=array(-1..3,[-1=t]); B :=array(-1 3 .. , [ = (-1) t = ( )0 B0 = ( )1 B1 = ( )2 B2
=
( )3 B3
])
[>B[-1];
t