Skip to main content

[algorithm] sleep sort

UPDATED: đã update phiên bản viết bằng golang ở cuối bài.
Ngày hôm nay,  cộng đồng hackernews điên đảo vì một thuật toán sắp xếp được phát minh từ năm 2011 do một người ẩn danh đưa ra với tên gọi "sleep sort".

Nguyên văn implement trên bash như sau:

#!/bin/bash
function f() {
    sleep "$1"
    echo "$1"
}
while [ -n "$1" ]
do
    f "$1" &
    shift
done
wait

example usage:
./sleepsort.bash 5 3 6 3 6 3 1 4 7
Chỉ cần google là bạn sẽ tìm thấy nguồn, bài viết này sẽ không link đến trang mà thuật toán này được công bố, đơn giản vì không thích. Nếu lười gõ google, bạn có thể bấm vào đây.

Thuật toán khá dễ hiểu, có thể mô tả bằng lời như sau: chương trình nhận nhiều tham số đầu vào
(arguments), với mỗi số đầu vào, ví dụ số đó là N, chạy một process con (subprocess) ở chế độ background (tức chương trình sẽ tiếp tục chạy sau khi tạo 1 subprocess chứ không đợi subprocess này kết thúc), sleep N giây rồi in ra số N.
Hiển nhiên với đầu vào là 2, 1, 3, chương trình
  1. đọc số 2, đợi 2 giây rồi in ra số 2
  2. đọc số 1, đợi 1 giây rồi in ra số 1
  3. đọc số 3, đợi 3 giây rồi in ra số 3
vì thời gian đọc vào cả 3 số gần như tức thời, mà đợi 1 giây nhanh hơn đợi 2 giây nên số 1 được in ra trước, rồi đến số 2, rồi số 3 ... và mọi thứ được sắp xếp tăng dần.
Đây không phải một thuật toán có kết quả tốt (nhanh) vì nếu có một số ở input là 1000, bạn phải đợi 1000 giây. Nhưng ý tưởng rất vui, khơi dậy rất nhiều vấn đề liên quan đến việc quản lý process, hàm sleep, và thậm chí gây rất nhiều tranh cãi về độ phức tạp thuật toán O(n).

Nếu bạn không thấy vui? có thể đọc phần tranh cãi về cách tính O(n) cho thuật toán này cho bớt không vui.
Nếu vẫn không thấy vui? đến giờ đi ngủ rồi !

Hết.
hvn@familug.org

PS: phiên bản lược bỏ phần parse argument  trên golang

Comments

  1. Phiên bản viết bằng golang đã lược bỏ phần parse argument xem ở :
    https://github.com/familug/FAMILUG/blob/master/Golang/sleepsort.go

    ReplyDelete
  2. nếu không đợi 1000s mà đợi 1000ms thì có chênh lệch nhau nhiều không nhỉ?

    ReplyDelete

Post a Comment

Popular posts from this blog

Tài liệu và hướng dẫn học Python

Để tiết kiệm thời gian, tốt nhất là đi học PyMI Updated: 130617 Sau đây là các tài liệu khuyên dùng: Vì nhiều lý do, nên học python2.7 tại thời điểm hiện tại (giờ là tháng 6/2013 - muốn biết tại sao thì tự tìm hiểu) python 3.5+ (giờ là tháng 2/2017) Chuẩn bị: 1. biết bật tắt máy 2. biết cài python 3. tập gõ 10 ngón - gõ 2 ngón hay 1 ngón cũng không sao, nhưng 10 ngón là cách dễ nhất để gõ nhanh nhất. Tài liệu - Nên dùng tài liệu tại trang chủ của Python làm chính, tham khảo thêm các tài liệu khác tại http://www.familug.org/2016/12/free-ebook.html Căn bản, mới học 1.1 Python PyMI.vn https://pymi.vn/tutorial/ 1.2. Python offical tutorial kết hợp làm bài tập trên HackerRank  (đề bài bằng tiếng Anh, nhưng Google translate 1 lúc cũng ra vì có nhiều ví dụ mẫu đi kèm). Học viên của Pymi.vn có rất nhiều học viên đã tự học với Learn Python the hard way nhưng chưa thấy ai thành công cả. Hai link dưới nên đọc sau khi đã nắm được những phần cơ bản của ngôn ngữ pytho...

The PyMiers

New FAMILUG