OK đây là sự cố. Bạn muốn tôi in ra:
merge_sort $ take 100000 $ randomRs (1,100000) $ mkStdGen 1 ::[Int]
Tôi biết rằng đây là danh sách. Vì vậy, đầu tiên tôi sẽ in ra một cú đúp mở
[
Sau đó, tôi sẽ tìm phần tử đầu tiên của danh sách, in ra và sau đó là dấu phẩy. Điều đó có nghĩa là tôi phải bắt đầu đánh giá biểu thức đó cho đến khi tôi có thể tìm ra yếu tố đầu tiên của danh sách là gì.
merge_sort THUNK0
Bây giờ tôi cần phải khớp mẫu. THUNK phù hợp với (x:[])
hoặc không. Nhưng tôi chưa biết. Vì vậy, tôi sẽ đánh giá thunk một chút. Tôi làm cho thunk sản xuất hai số ngẫu nhiên đầu tiên (trong số 100000). Bây giờ tôi biết rằng nó không phù hợp với định nghĩa đầu tiên, vì vậy tôi lấy định nghĩa thứ hai là merge_sort
.
merge_sort keys = merge THUNK1 THUNK2 -- keys = THUNK0
Cũng đủ dễ dàng ... đó chỉ là cuộc gọi để hợp nhất. Tôi sẽ mở rộng định nghĩa đó. Rất tiếc, có ba các mẫu khác nhau này có thể khớp với nhau.Tôi đoán tôi nên đánh giá THUNK1 một chút và xem nếu nó phù hợp với mô hình định nghĩa đầu tiên, (x:xs)
merge_sort (take THUNK3 THUNK0)
Về merge_sort
một lần nữa, chúng ta? Điều đó có nghĩa là tôi cần đánh giá (take THUNK3 THUNK0)
vừa đủ để biết liệu nó có phù hợp với (x:[])
hay không. Chết tiệt. take
là nghiêm ngặt trong đối số đầu tiên ... có nghĩa là tôi phải đánh giá đầy đủ THUNK3. Ok ... hơi thở sâu ...
len = length THUNK0 `div` 2
Bây giờ đây là trường hợp khó chịu. Để tính toán length
trên THUNK0 (đây là danh sách), tôi phải mở rộng SPINE SPINE. Tôi không phải tính toán các giá trị bên trong, nhưng tôi cần phải xác định cấu trúc của toàn bộ danh sách. Điều này, tất nhiên, được thực hiện một mẫu phù hợp tại một thời điểm, xác định xem nó là []
hoặc (x:xs)
. Nhưng nói chung, length
là "cột sống nghiêm ngặt".
tạm dừng ngắn trong khi tôi xác thịt ra cột sống của một danh sách 100000-yếu tố
Phew, có mà làm. Bây giờ tôi biết chiều dài, có nghĩa là tôi biết len = 500000
. THUNK0 là cuối cùng là được đánh giá đầy đủ! Phew! Tôi đã ở đâu?
merge_sort (take 500000 THUNK3)
Và vân vân. merge_sort
sẽ tiếp tục cố gắng càng lười càng tốt. Các cuộc gọi đệ quy đến merge_sort
sẽ càng lười càng tốt. Cuối cùng, để xác định phần tử đầu tiên của ngoài cùng merge_sort
, chúng ta sẽ cần phải biết phần tử đầu tiên của cả hai cuộc gọi đệ quy đến merge_sort
. Và để biết phần tử đầu tiên của những người ... chúng tôi sẽ cần những yếu tố đầu tiên của cuộc gọi đệ quy tiếp theo, vv Vì vậy, sẽ có khoảng O (n) công việc thực hiện, bởi vì tất cả các yếu tố cần phải được đánh giá (thực hiện ngẫu nhiên hệ số cho mỗi người).
Sau đó, hãy nghĩ về nó như một giải đấu. Mỗi phần tử được ghép nối với một phần tử khác. Các yếu tố "thắng" (thấp nhất) chuyển sang vòng tiếp theo (trở thành phần tử đầu tiên của cuộc gọi đệ quy đến mức thấp nhất merge_sort
s). Còn có một cuộc cạnh tranh với 1/2 như nhiều chiến binh, và 1/2 của những (1/4 của tổng số) chuyển sang vòng tiếp theo, vv Điều này cũng hóa ra là O (n) công việc , kể từ khi (n/2) so sánh được thực hiện trong vòng đầu tiên, và vòng tiếp theo phát triển nhỏ hơn quá nhanh để có ý nghĩa. (Tổng số 1/2 + 1/4 + 1/8 ... hội tụ ở mức 1, nghĩa là tổng số các so sánh n được thực hiện.)
Tất cả trong tất cả, O (n) công việc cần được thực hiện để cuối cùng tạo ra phần tử đầu tiên. Công việc bổ sung cần phải được thực hiện cho các yếu tố tiếp theo, nhưng tổng khối lượng công việc kết thúc lên được O (n log (n)).
Bây giờ, hãy tương phản với insert_sort
. Chỉ cần suy nghĩ về cách nó hoạt động: nó đi qua danh sách và "chèn" từng phần tử vào danh sách được sắp xếp.Điều đó có nghĩa là bạn không thể biết chắc chắn yếu tố đầu tiên được sắp xếp là cho đến khi bạn đã thực hiện bit cuối cùng của công việc và chèn phần tử cuối cùng (có thể là phần tử thấp nhất) vào danh sách được sắp xếp.
Tôi hy vọng điều này minh họa rõ ràng cách merge_sort
không cần thực hiện tất cả công việc để bắt đầu tạo kết quả, trong khi insert_sort
.
Chào mừng bạn đến với thế giới lười biếng! –
Nếu bạn muốn in kết quả, trước tiên chúng phải được tính toán. Vì vậy, thuật toán tính toán kết quả nhanh hơn cũng in chúng nhanh hơn. Điều đó thật đáng ngạc nhiên như thế nào? Hoặc có lẽ tôi không nhận được những gì bạn đang yêu cầu. – sth
Đã thêm hình minh họa. –