1. Trang chủ
  2. » Luận Văn - Báo Cáo

tiểu luận nguyên lý sáng tạo ứng dụng trong một số thuật toán sắp xếp nội

23 994 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 23
Dung lượng 611,49 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

THUẬT TOÁN SẮP XẾP Sắp xếp là quá trình bố trí lại các phần tử của một tập đối tượng theo một thứ tự được ấn định, chẳng hạn tăng dần hay giảm dần đối với một dãy số.. d Độ phức tạp của

Trang 1

ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

KHOA CÔNG NGHỆ THÔNG TIN

BÀI THU HOẠCH MÔN HỌC PHƯƠNG PHÁP

NGHIÊN CỨU KHOA HỌC TRONG TIN HỌC

LỚP CAO HỌC KHOA HỌC MÁY TÍNH KHÓA 22

Giảng viên: GS.TSKH Hoàng Văn Kiếm

ĐỀ TÀI

NGUYÊN LÝ SÁNG TẠO ỨNG DỤNG

TRONG MỘT SỐ THUẬT TOÁN SẮP XẾP NỘI

Học viên: Trần Huy Quang

Mã số: 12 11 058

TP.HCM, 12-2012

Trang 2

MỤC LỤC

THUẬT TOÁN SẮP XẾP 4

I Sắp xếp theo phương pháp chọn 5

1 Phương pháp chọn trực tiếp – Selection Sort 5

2 Phương pháp vun đống – Heap Sort 6

3 Đánh giá 9

II Sắp xếp theo phương pháp chèn 10

1 Phương pháp chèn trực tiếp – Insertion Sort 10

2 Phương pháp độ dài bước giảm dần - Shell Sort 11

3 Đánh giá 13

III Phương pháp sắp xếp phân hoạch - Quick Sort 14

1 Ý tưởng 14

2 Thuật toán 14

3 Minh họa 14

4 Độ phức tạp của thuật toán 15

5 Đánh giá 16

PHỤ LỤC: CÁC NGUYÊN LÝ SÁNG TẠO 17

1 Nguyên lý phân nhỏ 17

2 Nguyên lý “tách khỏi” 17

3 Nguyên lý phẩm chất cục bộ 17

4 Nguyên lý phản đối xứng 17

5 Nguyên lý kết hợp 17

6 Nguyên lý vạn năng 17

7 Nguyên lý “chứa trong” 17

8 Nguyên lý phản trọng lượng 17

9 Nguyên lý gây ứng suất sơ bộ 18

10 Nguyên lý thực hiện sơ bộ 18

11 Nguyên lý dự phòng 18

12 Nguyên lý đẳng thế 18

13 Nguyên lý đảo ngược 18

14 Nguyên lý cầu (tròn) hóa 18

Trang 3

16 Nguyên lý giải “thiếu” hoặc “thừa” 19

17 Nguyên lý chuyển sang chiều khác 19

18 Nguyên lý sử dụng các dao động cơ học 19

19 Nguyên lý tác động theo chu kỳ 19

20 Nguyên lý liên tục tác động có ích 19

21 Nguyên lý “vượt nhanh” 20

22 Nguyên lý biến hại thành lợi 20

23 Nguyên lý quan hệ phản hồi 20

24 Nguyên lý sử dụng trung gian 20

25 Nguyên lý tự phục vụ 20

26 Nguyên lý sao chép (Copy) 20

27 Nguyên lý “rẻ” thay cho “đắt” 20

28 Thay thế sơ đồ cơ học 20

29 Sử dụng các kết cấu khí và lỏng 21

30 Sử dụng vỏ dẻo và màng mỏng 21

31 Sử dụng các vật liệu nhiều lỗ 21

32 Nguyên lý thay đổi màu sắc 21

33 Nguyên lý đồng nhất 21

34 Nguyên lý loại bỏ hoặc tái sinh từng phần 21

35 Thay đổi các thông số lý hóa của đối tượng 22

36 Sử dụng chuyển pha 22

37 Sử dụng sự nở nhiệt 22

38 Sử dụng các chất oxy hóa 22

39 Sử dụng môi trường trơ 22

40 Sử dụng các vật liệu hợp thành (composite) 22

TÀI LIỆU THAM KHẢO 23

Trang 4

THUẬT TOÁN SẮP XẾP

Sắp xếp là quá trình bố trí lại các phần tử của một tập đối tượng theo một thứ tự được ấn định, chẳng hạn tăng dần hay giảm dần đối với một dãy số Với một cấu trúc đã được sắp xếp thì rất thuận tiện khi thực hiện các tác vụ như tìm kiếm, duyệt cấu trúc…

Có hai loại thuật toán sắp xếp: Sắp xếp nội và Sắp xếp ngoại

Sắp xếp nội

- Toàn bộ dữ liệu được đưa vào bộ nhớ trong

- Kích thước dữ liệu cần sắp xếp không lớn lắm

- Thời gian sắp xếp được thực hiện rất nhanh

Sắp xếp ngoại

- Chỉ một phần nhỏ dữ liệu cần sắp xếp được đưa vào bộ nhớ trong, phần lớn

dữ liệu còn lại được lưu ở bộ nhớ ngoài (đĩa cứng, băng từ…)

độ phức tạp của thuật toán

Khi xây dựng thuật toán sắp xếp, cần tìm cách giảm thiểu những phép so sánh và hoán vị không cần thiết để tăng hiệu quả của thuật toán Do dãy số được lưu trọn vẹn trong bộ nhớ chính của máy tính, nên các thuật toán sắp xếp nội thường không sử dụng các vùng nhớ thêm trong quá trình sắp xếp, mà hướng đến sắp xếp trực tiếp trên dãy số ban đầu

Một số thuật toán sắp xếp nội đề cập trong đề tài gồm Selection Sort, Heap Sort, Insertion Sort, Shell Sort, và Quick Sort

Trong đó những thuật toán như Selection Sort, Insertion Sort là những thuật toán đơn giản nhưng có chi phí cao Trong khi các thuật toán Shell Sort, Heap Sort, và Quick

Trang 5

Xét dãy con sau chỉ còn N-1 phần tử cần sắp xếp, lặp lại thao tác trên để đưa phần

tử nhỏ nhất về đầu dãy hiện hành Ta được dãy con đầu a 1 , a 2 đã có thứ tự, chỉ cần sắp

xếp dãy con sau có N-2 phần tử còn lại

Lặp lại như trên cho đến khi dãy con cần sắp xếp chỉ còn một phần tử, ta được dãy kết quả có thứ tự

b) Thuật toán

Bước 1: i := 1

Bước 2: Tìm phần tử amin nhỏ nhất trong dãy hiện hành a i , a i+1 , …, a N

Bước 3: Hoán vị amin và a i

Bước 4: Nếu i < N-1: tăng i thêm 1 và lặp lại Bước 2

Trang 6

d) Độ phức tạp của thuật toán

- Số phép so sánh: tại mỗi lượt thứ i, cần thực hiện N-i phép so sánh để tìm phần

tử nhỏ nhất trong dãy con chưa có thứ tự Số phép so sánh không phụ thuộc vào

tình trạng của dãy ban đầu, do đó tổng số phép so sánh là n(n-1)/2

- Số phép gán: tại mỗi lượt, cần thực hiện ba phép gán để hoán vị a min với a i, do

đó cần 3n(n-1)/2 phép gán Tuy nhiên điều này phụ thuộc vào tình trạng ban

đầu của dãy số, nếu dãy ban đầu đã có thứ thự thì không cần thực hiện phép gán nào

- Độ phức tạp của thuật toán là T(N) = O(N2)

2 Phương pháp vun đống – Heap Sort

a) Ý tưởng

Sử dụng một cấu trúc dữ liệu gọi là Heap cho phép tích lũy các thông tin về sự so

sánh giữa các phần tử trong quá trình sắp xếp

Cấu trúc Heap

Là một cây nhị phân gần đầy đủ, cài đặt bằng mảng một chiều a l a l+1 …a r, với các

nút trên heap có nội dung nhỏ hơn hay bằng nội dung của nút cha

Trang 7

Tính chất của Heap

1 Heap có nút gốc lớn nhất, đánh theo chỉ số 0, 1, 2,… cho các nút kế tiếp

Đướng đi từ gốc đến nút lá có nội dung - giá trị nút giảm dần

2 Nếu a l a l+1 …a r là một heap, khi cắt bỏ một số phần tử ở hai đầu của heap, thì dãy còn lại vẫn là một heap

3 Heap con: SubHeap(p,m), có nút gốc là p và các nút con nhỏ hơn hay bằng m (nếu p > m thì subheap rỗng)

4 Mọi dãy a l a l+1 …a r với 2l > r là một heap

b) Thuật toán

Giai đoạn 1: Hiệu chỉnh dãy số ban đầu thành heap

a l a l+1 …a r Với l=0 và r=N-1

Giai đoạn 2: Sắp xếp dãy số dựa trên heap

Bước 1: Hoán vị phần tử lớn nhất - nút gốc của heap với phần tử cuối dãy

Bước 2: Loại bỏ phần tử lớn nhất ra khỏi heap: r=r-1

Hiệu chỉnh phần còn lại của dãy là a l a l+1 …a r-1 thành heap

Bước 3: Nếu r>l: lặp lại Bước 2

Giai đoạn 1: Hiệu chỉnh dãy ban đầu thành heap

Dãy ban đầu 12 2 8 5 1 6 4 15

Trang 8

Giai đoạn 2: Sắp xếp dãy số dựa trên heap

Heap ban đầu 15 12 8 5 1 6 4 2

d) Độ phức tạp của thuật toán

- Độ phức tạp của thuật toán là T(N) = O(Nlog2N)

Trang 9

gọi là Heap trong thuật toán Heap Sort Từ Selection Sort đến Heap Sort thể hiện những

nguyên lý sáng tạo ứng dụng như sau

- Nguyên lý phân nhỏ

Dãy số biểu diễn bằng mảng một chiều được chuyển sang cấu trúc heap là một cây

phân cấp, như vậy một dãy đồng nhất đã được phân chia thành các thành phần độc lập, chính là các nhánh của cây Do đó trong quá trình sắp xếp, số lượng phép so sánh và phép gán được giảm thiểu do thuật toán chỉ làm việc trên một số nhánh liên quan tại mỗi bước của thuật toán

- Nguyên lý phẩm chất cục bộ

Cấu trúc mảng một chiều tuyến tính được chuyển thành cấu trúc cây phân cấp, cụ

thể là cây nhị phân Trong đó, một phần tử ở mức i là phần tử lớn trong cặp phần tử ở mức i+1, do đó phần tử ở mức 0 tức là nút gốc của cây luôn là phần tử lớn nhất trong

dãy Khi loại phần tử gốc ra khỏi cây, cần phải cập nhật lại cây để đảm bảo tính chất

của heap, tuy nhiên việc cập nhật chỉ xảy ra một cách cục bộ đối với những nhánh liên

quan đến phần tử vừa loại bỏ, còn các nhánh khác vẫn giữ nguyên Như vậy bước tiếp theo của thuật toán có thể sử dụng lại kết quả của sự so sánh ở bước hiện tại

- Nguyên lý linh động

Dãy số được biểu diễn một cách tự nhiên bằng cấu trúc mảng một chiều, nhưng với

heap, dãy số có thể biểu diễn dưới dạng cây phân cấp Với đặc trưng của cấu trúc cây

gồm nhiều nhánh, dãy số được chia thành nhiều thành phần độc lập dưới dạng các

nhánh và có khả năng dịch chuyển đối với nhau, mỗi khi cập nhật heap trong quá trình

sắp xếp

- Nguyên lý chuyển sang chiều khác

Ở mỗi bước sắp xếp, Selection Sort hoạt động trên toàn bộ chiều dài của dãy con còn lại nên số lượng phép so sánh luôn nhiều nhất Hạn chế đó là do cấu trúc của mảng

một chiều Trong khi Heap Sort sử dụng cấu trúc heap là cấu trúc cây - nhiều chiều, tại

mỗi bước, việc so sánh chỉ xảy ra trong nhánh liên quan nên có thể giảm thiểu số phép

so sánh

Trang 10

- Thay thế sơ đồ cơ học

Phương pháp Heap Sort sử dụng cấu trúc cây phân cấp thay cho mảng một chiều với các phần tử cố định Như vậy các phần tử đồng nhất trong dãy số đã được chuyển sang cấu trúc không đồng nhất, mỗi phần tử được phân cấp qua giá trị của nó

- Nguyên lý loại bỏ hoặc tái sinh từng phần

Cấu trúc heap có nút gốc luôn là phần tử lớn nhất trong dãy hiện hành, nếu loại bỏ

phần tử này khỏi cây, có nghĩa là đưa nó về vị trí đúng thì sau đó không cần quan tâm

đến nó nữa Sau khi loại bỏ nút gốc, heap cần phải phục hồi với những phần tử còn lại,

tuy nhiên chi phí cho thao tác này không lớn, do việc cập nhật chỉ xảy ra cục bộ trên những nhánh liên quan trong cây

II Sắp xếp theo phương pháp chèn

1 Phương pháp chèn trực tiếp – Insertion Sort

a) Ý tưởng

Từ dãy ban đầu, ta luôn có dãy con a 1 đã có thứ tự Chèn phần tử a 2 vào dãy con đã

có thứ tự trên, ta được dãy con có thứ tự mới a 1 , a 2 Lặp lại cho đến khi chèn xong phần

tử a N vào dãy con đã có thứ tự, ta được dãy kết quả có thứ tự

Như vậy, với dãy con đã có thứ tự là a1 , a 2 , …, a i-1 , cần tìm cách chèn phần tử a i

vào vị trí thích hợp:

- Xét 1 ≤ k ≤ i, vị trí thích hợp của a i là vị trí ở giữa a k-1 và a k nếu a k-1 ≤ a i < a k

- Dời các phần tử a k , a k+1 , …, a i-1 về phía sau một vị trí và chèn a i vào vị trí k,

ta được dãy a1 , a 2 , …, a i-1 có thứ tự

b) Thuật toán

Bước 1: i := 2

Bước 2: x := ai

Tìm vị trí k thích hợp trong dãy con a 1 , a 2 , …, a i-1 để chèn a i vào

Bước 3: Dời chỗ các phần tử ak , a k+1 , …, a i-1 về phía sau một vị trí

Bước 4: ak := x

Bước 5: i := i+1

Nếu i N: Lặp lại Bước 2

Ngược lại: Dừng

Trang 11

d) Độ phức tạp của thuật toán

- Trong mỗi lần lặp, cần thực hiện một phép so sánh và hai phép gán Tổng số phép so sánh và phép gán phụ thuộc vào tình trạng ban đầu của dãy

- Độ phức tạp của thuật toán là T(N) = O(N2)

2 Phương pháp độ dài bước giảm dần - Shell Sort

Thực hiện sắp xếp các phần tử trong cùng dãy con ta có các phần tử được đưa về vị

trí đúng tương đối – có thứ tự trong dãy con đang xét Sau đó giảm khoảng cách h để

tạo thành các dãy con mới, như vậy tạo cơ hội so sánh một phần tử với nhiều phần tử

Trang 12

khác trước đó không nằm cùng dãy con Sắp xếp những dãy con mới này Lặp lại cho

đến khi h=1, ta được dãy kết quả có thứ tự

Cách lựa chọn khoảng cách h và số bước sắp xếp là k thỏa:

hi > hi+1, hk =1, với i=1 k

Khoảng cách giữa các phần tử trong một dãy con ở bước sau phải nhỏ hơn bước

trước Sau k bước, khoảng cách bằng 1 (lúc này mỗi dãy con chỉ có một phần tử)

Theo Knuth đề nghị: hi = (h i-1 - 1)/3, h k =1, k=log 3 n – 1

Hoặc: h i = (h i-1 - 1)/2, h k =1, k=log 2 n - 1

b) Thuật toán

Bước 1: Chọn k khoảng cách h1 , h 2 , …, h k

i := 1

Bước 2: Chia dãy ban đầu thành các dãy con cách nhau hi phần tử

Sắp xếp từng dãy con theo phương pháp Chèn trực tiếp

Trang 13

Sắp xếp các dãy con theo phương pháp Chèn trực tiếp

d) Độ phức tạp của thuật toán

- Hiệu quả thuật toán phụ thuộc vào các dãy con với các độ dài được chọn

- Khi chọn theo công thức Knuth: h i = (h i-1 -1)/2, h k =1, k=log 2 n-1, thuật toán có

độ phức tạp là T(N) = O(N1.2)

3 Đánh giá

Hai thuật toán Insertion Sort và Shell Sort cùng dựa trên ý tưởng chèn một phần tử vào một dãy có thứ tự Tuy nhiên độ phức tạp của thuật toán Shell Sort là O(N1.2) nhỏ hơn rất nhiều so với độ phức tạp O(N2) của Insertion Sort Sự cải tiến này có thể nói là kết quả của việc ứng dụng những nguyên lý sáng tạo trong quá trình xây dựng thuật toán

- Nguyên lý phân nhỏ

Trong phương pháp Shell Sort, dãy ban đầu được chia thành nhiều dãy con độc lập

và tiến hành sắp xếp trên từng dãy con, giúp giảm thiểu số phép so sánh và phép gán Rồi tiếp tục tăng mức độ phân nhỏ các dãy con, cho đến khi độ dài của mỗi dãy con chỉ

là một thì được dãy kết quả có thứ tự

- Nguyên lý thực hiện sơ bộ

Trong phương pháp Insertion Sort, phần tử cần chèn luôn được so sánh trong một dãy tổng thể có độ dài tối đa, dẫn đến mất thời gian so sánh và dịch chuyển

Phương pháp Shell Sort thực hiện sắp xếp các phần tử trong cùng dãy con để đưa chúng về vị trí đúng tương đối rất nhanh – chỉ có thứ tự trong dãy con đang xét Sau đó

Trang 14

giảm độ dài các dãy con, tạo cơ hội so sánh một phần tử với nhiều phần tử khác trước

đó không nằm cùng dãy con với nó

- Nguyên lý linh động

Phương pháp Shell Sort chia dãy ban đầu thành các phần xen kẽ và tiến hành sắp xếp trên từng phần Các phần này có khả năng dịch chuyển đối với nhau khi giảm

khoảng cách h, khi đó mức độ xen kẽ tăng lên và các phần có cơ hội tương tác với nhau

III Phương pháp sắp xếp phân hoạch - Quick Sort

Ngược lại, dãy con 1 và 3 có nhiều hơn một phần tử, tiếp tục phân hoạch dãy con 1

và 3 thành các dãy con tương tự như trên

Phần tử x được chọn có tác động rất nhiều đến hiệu quả của thuật toán, vì nó quyết định số lần phân hoạch dãy Số lần phân hoạch sẽ ít nhất nếu chọn được phần tử x có độ lớn trung bình của dãy Tuy nhiên việc chọn được phần tử x như vậy là rất khó, nên

người ta thường chọn phần tử ở giữa dãy làm mốc phân hoạch

Khi đó, với l=1 và r=N thì ak là phần tử mốc, với k=(l+r)/2

2 Thuật toán

Bước 1: Phân hoạch dãy al , a l+1 , …, a r thành các dãy con:

Dãy con 1: a l …a j < x

Dãy con 2: a j+1 …a i-1 = x

Dãy con 3: a i a r > x

Trang 15

4 Độ phức tạp của thuật toán

Hiệu quả của thuật toán phụ thuộc vào cách chọn giá trị khóa x Trường hợp tốt

nhất là mỗi lần phân hoạch chọn được phần tử trung bình - phần tử lớn hơn hay bằng nửa số phần tử và nhỏ hơn hay bằng nửa số phần tử còn lại

Trường hợp xấu nhất là khi phân hoạch một dãy luôn được hai phần, phần thứ nhất

chỉ có một phần tử, trong khi phần còn lại có r-1 phần tử Lúc này cần tới N lần phân

hoạch Độ phức tạp của thuật toán sẽ là O(N2) Trong khi độ phức tạp trong trường hợp

Trang 16

tốt nhất của thuật toán là O(log2N)

Độ phức tạp trung bình của thuật toán: O(Nlog2N)

5 Đánh giá

Như cái tên Quick Sort, thuật toán có chi phí trong trường hợp tốt nhất chỉ là log2N Điều này đạt được nhờ kết hợp kỹ thuật chia để trị cùng với đệ quy Có thể nhận thấy những nguyên lý sáng tạo trong thiết kế thuật toán này như sau

- Nguyên lý phân nhỏ

Dãy ban đầu được phân nhỏ thành các dãy con với những đặc trưng riêng biệt phục

vụ cho quá trình sắp xếp Sau đó đến lượt các dãy con được xử lý độc lập, với cùng một cách thức như trên, nghĩa là tăng mức độ phân nhỏ các dãy con Cho đến khi không thể phân nhỏ các dãy con được nữa thì dãy ban đầu đã được sắp thứ tự

- Nguyên lý “tách riêng”

Trong quá trình sắp xếp, phép so sánh là thao tác được thực hiện nhiều nhất, đặc

biệt là so sánh khóa x với các phần tử khác trong dãy Sau khi phân hoạch, các phần tử

có giá trị bằng với khoá x được tách riêng ra, sau đó thì không cần quan tâm đến nữa

như vậy giúp giảm những phép so sánh không cần thiết

Ngày đăng: 05/04/2014, 10:34

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w