Hotline: 024.62511017

024.62511081

  Trang chủ   Sản phẩm   Phần mềm Dành cho nhà trường   Phần mềm Hỗ trợ học tập   Kho phần mềm   Liên hệ   Đăng nhập | Đăng ký

Tìm kiếm

School@net
 
Xem bài viết theo các chủ đề hiện có
  • Hoạt động của công ty (726 bài viết)
  • Hỗ trợ khách hàng (498 bài viết)
  • Thông tin tuyển dụng (57 bài viết)
  • Thông tin khuyến mại (80 bài viết)
  • Sản phẩm mới (216 bài viết)
  • Dành cho Giáo viên (549 bài viết)
  • Lập trình Scratch (3 bài viết)
  • Mô hình & Giải pháp (156 bài viết)
  • IQB và mô hình Ngân hàng đề kiểm tra (127 bài viết)
  • TKB và bài toán xếp Thời khóa biểu (242 bài viết)
  • Học tiếng Việt (183 bài viết)
  • Download - Archive- Update (289 bài viết)
  • Các Website hữu ích (70 bài viết)
  • Cùng học (92 bài viết)
  • Learning Math: Tin học hỗ trợ học Toán trong nhà trường (78 bài viết)
  • School@net 15 năm (154 bài viết)
  • Mỗi ngày một phần mềm (7 bài viết)
  • Dành cho cha mẹ học sinh (124 bài viết)
  • Khám phá phần mềm (122 bài viết)
  • GeoMath: Giải pháp hỗ trợ học dạy môn Toán trong trường phổ thông (36 bài viết)
  • Phần mềm cho em (13 bài viết)
  • ĐỐ VUI - THƯ GIÃN (363 bài viết)
  • Các vấn đề giáo dục (1210 bài viết)
  • Bài học trực tuyến (1037 bài viết)
  • Hoàng Sa - Trường Sa (17 bài viết)
  • Vui học đường (275 bài viết)
  • Tin học và Toán học (220 bài viết)
  • Truyện cổ tích - Truyện thiếu nhi (180 bài viết)
  • Việt Nam - 4000 năm lịch sử (97 bài viết)
  • Xem toàn bộ bài viết (8223 bài viết)
  •  
    Đăng nhập/Đăng ký
    Bí danh
    Mật khẩu
    Mã kiểm traMã kiểm tra
    Lặp lại mã kiểm tra
    Ghi nhớ
     
    Quên mật khẩu | Đăng ký mới
     
    Thành viên có mặt
    Khách: 9
    Thành viên: 0
    Tổng cộng: 9
     
    Số người truy cập
    Hiện đã có 89681015 lượt người đến thăm trang Web của chúng tôi.

    Đặc trưng và hiệu quả của các thuật toán sắp xếp

    Ngày gửi bài: 30/05/2009
    Số lượt đọc: 3243

    Như chúng ta đã biết, các phép sắp xếp cơ bản là: phép sắp chọn, sắp xếp chèn và sắp xếp nổi bọt. Thông thường, các bài toán sắp xếp thường được ứng dụng cho vào các mảng (a) dữ liệu và chúng ta sẽ thực hiện sắp các phần tử trong mảng đó. Dễ dàng thấy được:

    + Với thuật toán sắp chọn: nội dung của mảng a sau khi vòng lặp ngoài đã lặp được N/4 lần ( bắt đầu bằng một phép xáo trộn ngẫu nhiên của các số nguyên từ 1 đến N coi như dữ liệu nhập cần sắp);

    procedure selection;

    var i, j, min, t: integer;

    begin

    for i:=1 to N-1 do

    begin min:=i;

    for j:=i+1 toN do

    if a[j] then

    min:=j; t:=a[min]; a[min]:= a[i]; a[i]:=t

    end;

    end;


    + Với thuật toán sắp xếp chèn: nội dung của mảng a sau khi vòng lặp ngoài đã lặp được N/2 lần;

    procedure insertion;

    var i,j,v: integer;

    begin

    for i:= 2 to N do

    begin

    v:= a[i]; j:=i;

    while a[j-1]>v do

    begin

    a[j]:=a[j-1]; j:= j-1

    end;

    a[j]:= v

    end

    end;

    + Với thuật toán sắp xếp nổi bọt: nội dung của mảng a sau khi vòng lặp ngoài đã lặp được 3N/4 lần ;

    Procedure bubble;

    var i, j, t: integer;

    begin

    for i:= N downto 1 do

    for j:= 2 to i do

    if a[j-1]> a[j] then

    begin

    t:= a[j-1]; a[j-1]:=a[j]; a[j]:=t

    end

    end;

    Trong các hình vẽ, một hình vuông được đặt ở vị trí (i, j) với a[i]=j. Một mảng không có thứ tự vì vậy sẽ là sự hiển thị ngẫu nhiên của các hình vuông; trong một mảng đã được sắp, mỗi hình vuông sẽ xuất hiện ở trên cái nằm bên tay trái của nó. Để cho rõ ràng trong các hình vẽ, ta chỉ ra các phép chuyển vị (các phép sắp xếp lại của các số nguyên từ 1 đến N), mà khi đã được sắp, sẽ có các hình vuông tất cả đều thẳng hàng dọc theo đường chéo chính. Các hình vẽ cho thấy các phương pháp khác nhau đã tiến triển hướng về mục tiêu này như thế nào.

    Hình 1 minh hoạ làm thế nào phép sắp xếp chọn chuyển từ trái sang phải, đặt các phần tử vào vị trí kết quả của chúng mà không nhìn ngược lại. Điều không rõ ràng trong đồ hình này là sắp xếp chọn tốn thời gian để tìm phần tử nhỏ nhất trong phần chưa sắp của mảng.

    Hình 2 trình bày cách thức phương pháp chèn đi từ trái qua phải, chèn các phần tử mới phát hiện vào đúng chỗ mà không cần quan sát gì thêm ở phía trước. Phía trái của mảng thay đổi liên tục.

    Hình 3 cho thấy sắp xếp chọn và nổi bọt tương tự nhau. Sắp xếp bằng phương pháp nổi bọt “chọn” phần tử lớn nhất trong số còn lại trong mỗi giai đoạn, nhưng không tận dụng được thứ tự để sắp phần còn lại của mảng.

    Tất cả các phương pháp đều tỉ lệ N2 trong cả hai trường hợp tốt và xấu nhất bà không đòi hỏi nhiều bộ nhớ. Vì vậy các lần so sánh của chúng phụ thuộc vào chiều dài của các vòng lặp trong đặc tính của dữ liệu nhập.

    * Sắp xếp bằng phương pháp chọn cần N2/2 lần so sánh và N lần hoán vị.

    Chúng ta có thể thấy rõ được tính chất này khi hình dung ra bảng NxN, trong đó mỗi ký tự tương ứng với một phép so sánh. Nhưng nó chỉ khoảng một nửa các phần tử nằm trên đường chéo. N-1 phần tử trên đường chéo (trừ phần tử cuối), mỗi phần tử tương ứng với một hoán vị. Chính xác hơn: với mọi i từ 1 đến N-1, có một hoán vị và N-1 so sánh, vì thế tổng cộng có N-1 hoán vị và (N-1) + (N-2)+…+2 + 1= N(N-1)/2 so sánh. Dù cho dữ liệu nhập như thế nào đi nữa thì kết quả trên vẫn giữ nguyên: phần duy nhất của phương pháp sắp xếp chọn phụ thuộc vào việc nhập là số lần giá trị min được cập nhật. Trong trường hợp xấu nhất, các thuật toán cũng tỉ lệ N2, nhưng trong trường hợp trung bình, tính toán này tỉ lệ với NlogN vì thế chúng ta mong muốn là thời gian chạy phương pháp sắp bằng chọn sẽ không bị ảnh hưởng bởi dữ liệu nhập.

    * Sắp xếp bằng phương pháp chèn trung bình cần N2/4 lần so sánh và N2/8 lần hoán vị, vấu nhất gấp đôi số lần này.

    Thử cài đặt phương pháp chèn chúng ta sẽ thấy: số lần so sánh và “hoán vị một nửa” (di chuyển) ngang nhau. Việc tính toán này dễ quan sát hơn khi sử dụng bảng NxN, nó thể hiện rõ chi tiết của thao tác của thuật toán chèn. Số phần tử bên dưới đường chéo chính đếm được là các phần tử trong trường hợp xấu nhất. Trong trường hợp dữ liệu nhập là ngẫu nhiên, chúng ta mong muốn mỗi phần tử dời ngược nửa đường tính theo trung bình, là khoảng nửa số phần tử nằm dưới đường chéo chính.

    * Sắp bằng phương pháp nổi bọt cần trung bình N2/2 lần so sánh và N2/2 hoán vị và tương tự cho trường hợp xấu nhất.

    Trong trường hợp xấu nhất (tập tin sắp ngược), rõ ràng là lần sắp xếp nổi bọt thứ i cần (N-i) so sánh và hoán vị, chúng ta có thể chứng minh giống như phương pháp chọn. Nhưng thời gian chạy của phương pháp nổi bọt phụ thuộc vào dữ liệu nhập. Chẳng hạn, chỉ cần một lần lặp khi tập tin đã sắp rồi (trường hợp này phương pháp chèn cũng nhanh như vậy). Trường hợp trung bình không tốt hơn bao nhiêu so với trường hợp xấu nhất mặc dù việc phân tích có vẻ phức tạp hơn.

    * Sắp xếp bằng phương pháp chèn là tuyến tính đối với các tập tin “hầu như đã được sắp”.

    Mặc dù quan điểm về tập tin “hầu như đã được sắp” là khá không chính xác, nhưng sắp bằng phương pháp chèn thao tác tốt trên một số kiểu tập tin không ngẫu nhiên thường có trong thực tế; thực ra sắp bằng phương pháp chèn đã lợi dụng được thứ tự hiện có trong tập tin.

    Chẳng hạn, để ý thao tác trong sắp xếp bằng phương pháp chèn trên tập tin đã sắp. Mỗi phần tử sẽ được xác nhận ngay vị trí thích hợp của nó trên tập tin, và tổng thời gian thực hiện thì tuyến tính. Tương tự cho sắp xếp bằng phương pháp nổi bọt, nhưng sắp bằng phương pháp chọn vẫn tỉ lệ N2. Mặc dù tập tin không được sắp hoàn toàn, nhưng sắp bằng phương pháp chèn có thể rất có ích vì thời gian chạy phụ thuộc mạnh vào thứ tự hiện có trong tập tin. Thời gian chạy phụ thuộc vào số lần hoán chuyển: với mỗi phần tử, đếm số phần tử nằm bên trái lớn hơn nó. Đó là khoảng cách mà các phần tử cần dời đổi khi chèn vào tập tin trong quá trình sắp xếp. Tập tin có sẵn các phần có thứ tự thì ít phải chuyển đổi hơn.

    Giả sử khi muốn thêm vài phần tử vào một tập tin đã sắp để tạo một tập tin lớn hơn có thứ tự. Một cách để làm điều này là thêm các phần tử mới vào cuối tập tin sau đó gọi một thuật toán sắp xếp. Rõ ràng là số lần hoán chuyển sẽ thấp trên tập tin này: một tập tin có một số không đổi các phần tử chưa đặt đúng chỗ sẽ chỉ dùng một số lần hoán chuyển tuyến tính. Một ví dụ khác là tập tin trong đó mỗi phần tử cách vị trí cuối cùng của nó (vị trí kết quả) một khoảng không đổi. Các tập tin như vậy có thể được tạo trong các bước khởi tạo của một vài thuật toán sắp xếp cải tiến: theo một quan điểm nào đó thì nó cũng chính là một dạng của sắp xếp bằng phương pháp chèn.

    Để so sánh thêm giữa các phương pháp, người ta cần phân tích chi phí của các phép so sánh và hoán vị, một yếu tố phụ thuộc vào kích thước của cá mẩu tin và khoá. Chẳng hạn, nếu mẩu tin là các khoá lưu một từ (word) thì một hoán vị (hai lần truy xuất mảng) sẽ tốn hai lần so với so sánh. Trong tình huống này, thời gian chạy của sắp bằng phương pháp chọn và phương pháp chèn có thể so sánh sơ lược, nhưng sắp bằng phương pháp nổi bọt thì chậm hơn hai lần (thường phương pháp này chậm hơn hai lần trong mọi trường hợp!). Nhưng nếu các mẩu tin cần nhiều so sánh trên khoá, phương pháp sắp xếp chọn sẽ tốt hơn.

    * Sắp xếp bằng phương pháp chọn là tuyến tính đối với các tập tin có mẩu tin kích thước lớn và khoá kích thước nhỏ.

    Giả sử chi phí cho một lần so sánh là một đơn vị thời gian và chi phí cho một lần hoán vị là M đơn vị thưòi gian (ví dụ như trường hợp ứng với các mẫu tin M từ và khoá 1 từ. Lúc này, sắp xếp bằng phương pháp chèn cần N2lần so sánh và NM lần hoán vị để sắp một tập tin có kích thước NM. Nếu N tỉ lệ với M, số lượng dữ liệu là tuyến tính.

    School@net (Theo THNT)



     Bản để in  Lưu dạng file  Gửi tin qua email


    Những bài viết khác:



    Lên đầu trang

     
    CÔNG TY CÔNG NGHỆ TIN HỌC NHÀ TRƯỜNG
     
    Phòng 804 - Nhà 17T1 - Khu Trung Hoà Nhân Chính - Quận Cầu Giấy - Hà Nội
    Phone: 024.62511017 - 024.62511081
    Email: kinhdoanh@schoolnet.vn


    Bản quyền thông tin trên trang điện tử này thuộc về công ty School@net
    Ghi rõ nguồn www.vnschool.net khi bạn phát hành lại thông tin từ website này
    Site xây dựng trên cơ sở hệ thống NukeViet - phát triển từ PHP-Nuke, lưu hành theo giấy phép của GNU/GPL.