Tải bản đầy đủ (.doc) (25 trang)

mô phỏng thuật toán heap sort & quick sort trên maple

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.61 MB, 25 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
CHƯƠNG TRÌNH ĐÀO TẠO THẠC SĨ CNTT
Tiểu luận : MÔ PHỎNG THUẬT TOÁN
HEAP SORT & QUICK SORT TRÊN
MAPLE
Giảng viên hướng dẫn : PGS.TS Đỗ Văn Nhơn
Học viên thực hiện : Đoàn Vũ Ngọc Duy
MSSV : CH1101010
TP.HCM 01/01/2013
GIỚI THIỆU 3
ĐẶC ĐIỂM 4
NHỮNG ỨNG DỤNG CHỦ YẾU 4
CẤU TRÚC GIAO DIỆN VÀ TÀI NGUYÊN CỦA MAPLE 5
1. LÀM QUEN VỚI MAPLE 5
SỬ DỤNG DỊCH VỤ TRỢ GIÚP (HELP) TRONG MAPLE 6
LƯU TRỮ VÀ TRÍCH XUẤT DỮ LIỆU 7
MÔI TRƯỜNG TÍNH TOÁN VÀ CÁC ĐỐI TƯỢNG LÀM VIỆC 7
BÀI TẬP VẬN DỤNG 15
1. THUẬT TOÁN HEAP SORT 15
THUẬT TOÁN QUICK SORT 20
2
GIỚI THIỆU
Lập trình symbolic là lập trình trên cơ sở toán học logic, được thiết kế để giải
quyết các vấn đề liên quan đến trí tuệ nhân tạo. Chương trình là tập hợp các mô
tả logic , lập trình dạng này còn được gọi là ngôn ngữ lập trình ký hiệu
(symbolic programming) tương tự các ngôn ngữ lập trình hàm
(functional programming), hay lập trình phi số (non-numerical
programming). Lập trình symbolic rất thích hợp để giải quyết các bài toán liên
quan đến các đối tượng (object) và mối quan hệ (relation) giữa chúng
Với các tính năng cơ bản của mình, Maple có thể thực hiện được hầu hết các
phép toán cơ bản trong chương trình toán đại học và phổ thông. Maple là chương


trình tính toán vạn năng rất đồ sộ, không thể nào nắm bắt cho hết (dù chỉ trên
phương diện tính toán và biểu diễn) ở đây em xin trình bày các bước cơ bản về số
học và các vấn đề liên quan, giới thiệu các câu lệnh, các hàm thường sử dụng,
cách viết các thủ tục. Từ đó có thể xây dựng nhiều chương trình khác phục vụ
cho việc học tập và nghiên cứu.
Maple là sản phẩm của Waterloo Maple Inc. (). Ra đời
vào những năm 1980 tại đại học Waterloo (Canada), và cho đến thời điểm hiện
nay (những ngày đầu năm 2008) đã phát triển đến phiên bản 11. Cài đặt đơn
giản, không đòi hỏi cấu hình máy mạnh (như Matlab), chạy trên tất cả các hệ
điều hành, không quá khó khăn để tự học cách sử dụng với một trình trợ giúp
(Help) rất tiện lợi.
Maple là một chương trình tính toán mạnh mẽ. Hãy thử làm một phép so sánh
nhỏ với một công cụ tính toán thật quen thuộc với chúng ta: Chiếc máy tính bỏ
túi (một phép so sánh rất khập khiễng). Máy tính bỏ túi thì chỉ có thể tính toán
với số cụ thể (nếu bạn nghĩ nó có thể phân tích đa thức thành nhân tử chẳng
3
hạn ?) nhưng Maple thì khác. Nó có khả năng làm việc với cả những biểu thức
toán học và các phép tính hình thức. Cho phép tính toán ra các giá trị chính xác
(chứ không phải là gần đúng như một số ngôn ngữ lập trình khác – ví dụ : C# hay
C++ không hổ trợ tính chính xác tuyệt đối) Từ rút gọn, khai triển biểu thức, tính
giới hạn, đạo hàm, nguyên hàm (chứ không phải chỉ là tính tích phân) ở bậc phổ
thông. Đến khai triển Taylor, tìm nghiệm phương trình vi phân, tính định thức,
giải hệ phương trình tuyến tính có tham số… Maple xử lý trong tích tắc. Không
chỉ như vậy, Maple còn có thể minh hoạ xuất sắc đồ thị hai chiều lẫn mặt cong
trong không gian ba chiều, đồ thị toạ độ cực, tham số, hàm ẩn.
Đặc điểm
• Là một hệ thống tính toán trên các ký hiệu và biểu thức toán học.
• Có thể thực hiện hầu hết các phép toán cơ bản của chương trình toán đại
học và sau đại học.Tính toán được nghiệm chính xác và gần đúng của một
lớp rộng các bài toán lý thuyết và ứng dụng.

• Cung cấp các công cụ minh họa hình học thuận tiện bao gồm: đồ thị, hình vẽ
tĩnh và động của các đường và mặt được cho bởi các hàm tùy ý trong nhiều
hệ tọa độ khác nhau.
• Một ngôn ngữ lập trình đơn giản và mạnh mẽ có khả năng chuyển đổi
sang các ngôn ngữ lập trình khác.
• Cho phép trích xuất dữ liệu ra các định dạng khác nhau như Latex, Word,
HTML
• Một công cụ biên soạn giáo trình điện tử và trình diễn bài giảng thuận
tiện.
• Hỗ trợ theo nhiều mức độ cho sinh viên trong việc học tập.
Những ứng dụng chủ yếu
• Maple như một công cụ hỗ trợ việc dạy và học toán. Ứng dụng này quả
thật là quan trọng với những sinh viên sư phạm toán cũng như những
4
người làm công tác nghiên cứu toán học
• Ngoài ta Maple còn là một công cụ hỗ trợ cho tin học và lập trình. Hiện
nay khi Pascal thiếu nhiều công cụ và không còn phù hợp lắm với kiến
thức tin học hiện nay để dạy và học cách lập trình. Với những phần mềm
tính toán khoa học đang được phát triển rất mạnh mẽ hiện nay như Maple,
Mathematica, Matlab… Ta có thể khai thác ngôn ngữ lập trình của nó để
học tin học, nhất là thể hiện các thuật toán và các kiến thức tin học có liên
quan. Với việc thể hiện các thuật toán trên các ngôn ngữ thông thường
như C#, C++ hay Java cũng có nhiều hạn chế trong lập trình cũng như
tính toán chính xác, maple là một công vụ rất mạnh để mô phỏng các thuật
toán trong trí tuệ nhân tạo hay các thuật giải mã hóa dữ liệu cho đến việc
mô phỏng máy học….
CẤU TRÚC GIAO DIỆN VÀ TÀI NGUYÊN CỦA MAPLE
Việc cài đặt và khởi động chương trình Maple trên môi trường Windows không
có gì khác biệt so với các chương trình ứng dụng khác. Giao diện của Maple khá
giống với giao diện làm việc của các chương trình ứng dụng khác trên Windows

và cũng rất “ thân thiện” với người sử dụng.
Khi khởi động Maple, chương trình chỉ tự động kích hoạt nhân của Maple bao
gồm các phép toán và chức năng cơ bản nhất. Phần nhân chiếm khoảng 10%
dung lượng của toàn chương trình.
Các dữ liệu và chương trình còn lại của Maple được lưu giữ trong thư viện Maple
và được chia ra 2 nhóm: nhóm các lệnh cơ bản và nhóm các gói lệnh
1. Làm quen với maple
Lệnh được gõ vào trang làm việc (worksheet) tại dấu nhắc lệnh ">" và theo ngầm
định được hiển thị bằng font Courier màu đỏ. Một lệnh đựợc kết thúc bởi dấu " :"
5
hoặc dấu ";" và được ra lệnh thực hiện bằng việc nhấn Enter khi con trỏ đang ở
trên dòng lệnh.
> factor(2*x^102+x^100-2*x^3-x+60*x^2+30):
Kết quả của lệnh được hiển thị ngay bên dưới dòng lệnh nếu dùng dấu " ;". Có
thể dễ dàng dùng chuột và bàn phím để thực hiện các chức năng bôi đen, copy,
paste, cut, delete đối với dữ liệu trên dòng lệnh hay kết quả thực hiện.
• Trang làm việc (worksheet) : là trang chứa nơi có thể đặt các lệnh , các
chương trình , các chú thích Trang làm việc sẽ được lưu lại thành file có
phần mở rộng *.mws .
• Cụm xử lí (Execution Group): [> là nơi có thể đặt 1 lệnh , hay một nhóm
lệnh của Maple. Sau khi đánh Enter tòan bộ các lệnh trong cụm xử lí sẽ
được thực thi.
• Cụm văn bản (Text) : [ là nơi có thể đặt văn bản với mục đích minh họa,
chú thích.
• Phần (Section) : có thể thu gọn/nới rộng , có thể bao gồm cụm xử lí và
cụm văn bản.
• Trong một cụm xử lí có thể gồm nhiều lệnh. Các lệnh kết thúc bằng ; hoặc
:
 Các lệnh kết thúc bằng ; sẽ được thực thi và kết quả hiện ra màn
hình.

 Các lệnh kết thúc bằng : sẽ được thực thi ngầm và kết quả không
hiện ra màn hình.
 Muốn thêm một lệnh sau lệnh hiện tại gõ Shift Enter thay vì Enter.
• Có thể click vào nút lệnh Help trên Menu Bar của Maple để mở phần tài
liệu trợ giúp , tìm kiếm mục thích hợp , nhấn Ctrl + F1 để copy tòan bộ ví
dụ , dán ngược lại vào trang để thực thi
Sử dụng dịch vụ trợ giúp (Help) trong Maple
Maple có dịch vụ trợ giúp khá đầy đủ và thuận lợi bao gồm cú pháp, giải thích
cách dùng và các ví dụ đi kèm. Để nhận được trợ giúp, có thể:
6
• Nếu đã biết tên lệnh thì từ dấu nhắc gõ vào > factor
• Nếu dùng một gói lệnh thì khi nạp gói lệnh, Maple sẽ hiển thị toàn bộ lệnh
trong gói đó.
• Một cách thông dụng nữa là dùng trình Help|Topic Search rồi gõ vào từ
khóa cần tìm.
Lưu trữ và trích xuất dữ liệu
Trang làm việc của Maple sẽ được lưu giữ bằng file có đuôi ".mws". File được
lưu giữ bằng trình File|Save. Một file đó được mở bằng File|Open.
Ngoài việc lưu giữ bằng định dạng của Maple như trên, dữ liệu có thể được trích
xuất thành các định dạng khác như LaTex hay HTML. Trích xuất bằng File|
Export.
MÔI TRƯỜNG TÍNH TOÁN VÀ CÁC ĐỐI TƯỢNG LÀM VIỆC
Maple có 2 môi trường làm việc là toán và văn bản. Sau khi khởi động, Maple tự
động bật môi trường toán. Muốn chuyển sang môi trường văn bản, kích chuột
vào biểu tượng T trên thanh công cụ hay vào trình Insert->Text. Ngược lại, từ
môi trường văn bản, kích chuột vào dấu "[>" trên thanh công cụ hay vào Insert
để chuyển sang môi trường toán.
Một trang làm việc (worksheet) của Maple có thể bao gồm những thành phần cơ
bản như sau:
• Cụm xử lý (Execution Group)

• Lệnh và kết quả tính toán của Maple
• Mục (Section)
• Đồ thị (Graph)
• Siêu liên kết (Hyperlink)
• Văn bản và đoạn văn bản (Text và paragraph)
Đầu tiên hãy mở một trang (worksheet) mới bằng cách chọn File/New. Một trang
7
trắng với dấu [> sẽ hiện ra:
>
Dấu trên gọi là prompt, sau dấu đó các bạn có thể gõ các phép tính và yêu cầu
Maple thực hiện. Kết thúc mỗi dòng lệnh là dấu chấm phẩy hai hai chấm, sau đó
là …Enter. Hãy thử:
> 247*3756;
Nếu bạn kết thúc bằng dấu hai chấm, Maple sẽ vẫn tính nhưng không hiển thị kết
quả. Các phép tính cộng, trừ, nhân, chia, luỹ thừa, lần lượt được kí hiệu: +, -,
*, / , ^ (**).
Chú ý một điều là Maple dùng cách tính chính xác, cho nên khi thực hiện :
> 25/27+3/51;
Để có kết quả gần đúng, dùng hàm evalf:
> evalf(%);
Maple phân biệt chữ hoa với chữ thường, cho nên Pi khác với pi. Pi là hằng số
= 3.141592654, trong khi đó pi là chữ cái Hi Lạp
Để tìm hiểu thêm một lệnh nào đó chưa biết, bạn có thể đọc phần Help hoặc đơn
giản hơn là nhấn F1 sao khi đã đặt con trỏ vào và với 1 lần Click.
8
Biến và hàm: phép gán (một hàm số hay một giá trị nào đó cho một biến) được
thực hiện bằng cách dùng kí hiệu :=
> alpha:=5;
Kiểm tra lại:
> 4*alpha+12;

Để trả tự do lại cho biến alpha, bạn dùng lệnh:
> alpha:='alpha';
Định nghĩa hàm (cái này quan trọng!) có hai cách:
Cách 1: gán cho nó một biến số.
> f:=x^2;
Để tính giá trị của f:
> x:=1;
> f;
Hoặc:
9
> subs(x=1,f);
Cách 2 : > f:=x->x^2;
> f(1);
Lúc này ta có thể tính giá trị của hàm tại biến x bằng kí hiệu quen thuộc f(x).Hãy
xem xét khả năng của Maple trong việc biến đổi tính toán các biểu thức đại số:
Lệnh simplify thu gọn một biểu thức
> f:=(1+x)/x+(1-x)/x;
> simplify(f);
Lệnh expand khai triển một biểu thức:
> f:=(x^2-4)*(x+1)*(x-2)*(x^2+x+1);
> expand(f);
Lệnh Factor biến đổi biểu thức thành nhân tử:
> factor(sin(x)^3-cos(x)^3);
10
Giải hệ phương trình dùng lệnh Solve, tuy nhiên trước khi giải phải Restart để trả
tự do cho tất cả các biến.
> restart;
> sol:=solve({2*x-5*y=12,12*x+4*y=17},{x,y});
Đạo hàm và tích phân: dùng lệnh diff:
> f:=x*sin(x)-x;

> df:=diff(f,x);
> df2:=diff(f,x$2);#dao ham bac hai cua f
Nguyên hàm, tích phân dùng lệnh int
> f:=sin(x);
> int(f,x);#nguyen ham cua f
> int(f,x=0 3);#tich phan xac dinh cua f tu 0 toi 3
11
> evalf(%);
Tích phân thì luôn tính được, tuy nhiên nguyên hàm thì không phải lúc nào
Maple cũng tính ra. Chẳng hạn trường hợp sau:
> h:=sin(x)/g(x);
> int(h,x);#khong phai bao gio Maple cung tim ra nguyen ham
> evalf(int(h,x=0 1));
Đồ thị hai chiều: ta dùng lệnh Plot để vẽ.
> f:=exp(-x)*sin(3*x);
> plot(f,x=0 3);# ve ham f trong khoang tu 0 toi 3
12
> plot(f,x=0 3,y=-0.3 1,color=blue);# Giới hạn trục y chọn tọa độ màu xanh
Đồ thị 3 chiều: Ta xét một minh hoạ hình ảnh tự nhiên của các đường conic như
giao tuyến của mặt nón và một mặt phẳng cắt nó.
> with(plots):
13
>animate(plot3d,[y/3-10,x=
20 t,y=20 t,color=red,style=PATCHNOGRID],t=18 17,ax
es=framed,background=plot3d([z*cos(t),z*sin(t),z],z=20
0,t=-Pi Pi));
Kết quả là một hình 3 chiều mà đặc biết là bạn có thể xoay nó và quan sát theo
mọi góc độ.
Bằng cách thay đổi thích hợp phương trình mặt phẳng cắt nó, chúng ta có thể thu
được thiết diện là một trong các đường conic.

14
Bằng các gói lệnh chuyên nghiệp khác, Maple còn làm được rất nhiều các nghiên
cứu có giá trị
BÀI TẬP VẬN DỤNG
1. Thuật toán heap sort
Mô phỏng bài toán
Mỗi mảng a[1 n] có thể xem như một cây nhị phân gần đầy (có trọng số là các
giá trị của mảng), với gốc ở phần tử thứ nhất, con bên trái của đỉnh a[i] là a[2*i]
con bên phải là a[2*i+1] (nếu mảng bắt đầu từ 1 còn nếu mảng bắt đầu từ 0 thì 2
con là a[2*i+1] và a[2*i+2] ) (nếu 2*i<=n hoặc 2*i+1<=n, khi đó các phần tử có
chỉ số lớn hơn không có con, do đó là lá).
Ví dụ mảng (45,23,35,13,15,12,15,7,9) là một đống
Một cây nhị phân, được gọi là đống cực đại nếu khóa của mọi nút không nhỏ hơn
khóa các con của nó. Khi biểu diễn một mảng a[] bởi một cây nhi phân theo thứ
tự tự nhiên điều đó nghĩa là a[i]>=a[2*i] và a[i]>=a[2*i+1] với mọi i =1 int(n/2).
15
Ta cũng sẽ gọi mảng như vậy là đống. Như vậy trong đống a[1] (ứng với gốc của
cây) là phần tử lớn nhất. Mảng bất kỳ chỉ có một phần tử luôn luôn là một đống.
Một đống cực tiểu được định nghĩa theo các bất đẳng thức ngược lại:
a[i]<=a[2*i] và a[i]<=a[2*i+1]. Phần tử đứng ở gốc cây cực tiểu là phần tử nhỏ
nhất.
Vun đống
Việc sắp xếp lại các phần tử của một mảng ban đầu sao cho nó trở thành đống
được gọi là vun đống.
Vun đống thứ i
Nếu hai cây con gốc 2 * i và 2 * i + 1 đã là đống thì để cây con gốc i trở thành
đống chỉ việc so sánh giá trị a[i] với giá trị lớn hơn trong hai giá trị a[2 * i] và a[2
* i + 1], nếu a[i] nhỏ hơn thì đổi chỗ chúng cho nhau. Nếu đổi chỗ cho a[2 * i],
tiếp tục so sánh với con lớn hơn trong hai con của nó cho đên khi hoặc gặp đỉnh
lá. (Thủ tục DownHeap trong giả mã dưới đây)

Vun một mảng thành đống
Để vun mảng a[1 n] thành đống ta vun từ dưới lên, bắt đầu từ phần tử a[j]với j
=Int(n/2) ngược lên tới a[1]. (Thủ tục MakeHeap trong giả mã dưới đây) kho qua
Sắp xếp bằng vun đống
Đổi chỗ (Swap): Sau khi mảng a[1 n] đã là đống, lấy phần tử a[1] trên đỉnh của
đống ra khỏi đống đặt vào vị trí cuối cùng n, và chuyển phần tử thứ cuối cùng
a[n] lên đỉnh đống thì phần tử a[n] đã được đứng đúng vị trí.
Vun lại
Phần còn lại của mảng a[1 n-1] chỉ khác cấu trúc đống ở phần tử a[1]. Vun lại
mảng này thành đống với n-1 phần tử.
16
Lặp
Tiếp tục với mảng a[1 n-1]. Quá trình dừng lại khi đống chỉ còn lại một phần tử
Mô phỏng heap sort bằng Maple
> parent:=i->floor(i/2);
>
>
>
17
>
>
>
>
>
>
18
>
>
>
>

>
>
>
>
>
>
19
>
>
Thuật toán quick sort
Mô phỏng bài toán
Sắp xếp nhanh (Quicksort), còn được gọi là sắp xếp kiểu phân chia (part sort) là
một thuật toán sắp xếp phát triển bởi C.A.R. Hoare, dựa trên phép phân chia
danh sách được sắp thành hai danh sách con. Phương pháp này là minh họa rõ
ràng nhất Để sắp xếp một danh sách a[1…n] ta chia nó thành hai danh sách bằng
cách so sánh từng phần tử của danh sách với một phần tử được chọn làm phần tử
chốt.
Những phần tử nhỏ hơn phần tử chốt được đưa về phía trước và nằm trong danh
sách con thứ nhất, các phần tử lớn hơn chốt được đưa về phía sau và thuộc danh
sách đứng sau. Cứ tiếp tục chia như vậy tới khi các danh sách con đều có độ dài
bằng 1.
Danh sách a[1…n]:
Danh sách 1 gồm: a[1…k] < X
Danh sách 2 gồm: a[(k+1) …n] > X
a < X
a = X
a > X
20
Ở đây ta thấy xuất hiện 3 danh sách con, trong đó:
Danh sách thứ 2 đã được sắp xếp. Nếu danh sách 1 và 3 chỉ có một phần tử thì

dãy a[i…n] đã được sắp xếp xong. Nếu danh sách 1 và 3 có hơn một phần tử thì
dãy ban đầu chỉ có thứ tự khi các dãy con 1, 3 được sắp. Để sắp xếp dãy con 1 và
3, ta lần lượt tiến hành việc phân hoạch từng dãy con theo cùng phương pháp
phân hoạch dãy ban đầu vừa trình bày.
Giải thuật:
Giải thuật phân hoạch dãy a[1…n] thành hai dãy con gồm 3 bước:
Bước 1: chọn tùy ý 1 phần tử a[k] trong dãy làm giá trị mốc.
L ≤ k ≤ R : a[k] =X;
i = L; j = R;
Gợi ý các cách chọn phần tử mốc
Chọn phần tử đứng đầu hoặc đứng cuối làm phần tử chốt.
Chọn phần tử đứng giữa danh sách làm phần tử chốt.
Chọn phần tử trung vị trong 3 phần tử đứng đầu, đứng giữa và đứng cuối làm
phần tử chốt.
Chọn phần tử ngẫu nhiên làm phần tử chốt. (Cách này có thể dẫn đến khả năng
rơi vào các trường hợp đặc biệt)
Bước 2: Phát hiện và hiệu chỉnh cặp phần tử a, a[j] nằm sai chỗ:
Bước 2a: Trong khi (a < X) i++;
Bước 2b: Trong khi (a[j] > X) j++;
Bước 2c: Nếu i < j // a ≥ X ≥ a[j] mà a[j] đứng sau a
Hoán vị ( a, a[j]);
Bước 3: Nếu i < j; Lặp lại Bước 2
// chưa xét hết mảng
Nếu I > j; Dừngcho chiến lược chia để trị.
21
Mô phỏng quick sort bằng Maple
>
22
>
>

>
>
23
>
>
>
>
>
>
>
>
>
24
>
>
>
>
25

×