Tôi rất tò mò, tại sao sự ổn định là hoặc không quan trọng trong việc sắp xếp các thuật toán?
IBM (Insertion, Bubble, Merge)
Tôi rất tò mò, tại sao sự ổn định là hoặc không quan trọng trong việc sắp xếp các thuật toán?
IBM (Insertion, Bubble, Merge)
Câu trả lời:
Một thuật toán sắp xếp được cho là ổn định nếu hai đối tượng có các khóa bằng nhau xuất hiện theo cùng một thứ tự trong đầu ra được sắp xếp khi chúng xuất hiện trong mảng đầu vào được sắp xếp. Một số thuật toán sắp xếp ổn định theo bản chất như Sắp xếp chèn, Sắp xếp hợp nhất, Sắp xếp bong bóng, v.v. Và một số thuật toán sắp xếp không, như Sắp xếp Heap, Sắp xếp nhanh, v.v.
Bối cảnh : thuật toán sắp xếp "ổn định" giữ các mục có cùng khóa sắp xếp theo thứ tự. Giả sử chúng ta có một danh sách các từ gồm 5 chữ cái:
peach
straw
apple
spork
Nếu chúng ta sắp xếp danh sách chỉ bằng chữ cái đầu tiên của mỗi từ thì sắp xếp ổn định sẽ tạo ra:
apple
peach
straw
spork
Trong một thuật toán sắp xếp không ổn định , straw
hoặc spork
có thể thay thế cho nhau, nhưng trong một thuật toán ổn định, chúng ở cùng một vị trí tương đối (nghĩa là, straw
xuất hiện trước spork
trong đầu vào, nó cũng xuất hiện trước spork
trong đầu ra).
Chúng ta có thể sắp xếp danh sách các từ bằng thuật toán này: sắp xếp ổn định theo cột 5, rồi 4, rồi 3, rồi 2, rồi 1. Cuối cùng, nó sẽ được sắp xếp chính xác. Hãy thuyết phục bản thân về điều đó. (nhân tiện, thuật toán đó được gọi là radix sort)
Bây giờ để trả lời câu hỏi của bạn, giả sử chúng tôi có một danh sách tên và họ. Chúng tôi được yêu cầu sắp xếp "theo họ, sau đó theo đầu tiên". Đầu tiên chúng ta có thể sắp xếp (ổn định hoặc không ổn định) theo tên đầu tiên, sau đó sắp xếp ổn định theo tên cuối cùng. Sau khi sắp xếp, danh sách chủ yếu được sắp xếp theo tên cuối cùng. Tuy nhiên, trong đó tên cuối cùng giống nhau, tên đầu tiên được sắp xếp.
Bạn không thể xếp các loại không ổn định theo cùng một kiểu.
straw
và spork
so sánh bằng nhau. Sắp xếp ổn định sẽ duy trì thứ tự đầu vào, trong khi sắp xếp không ổn định không đảm bảo điều đó. "Chính xác" phụ thuộc vào ứng dụng. Hàm sắp xếp trong hầu hết các ngôn ngữ lập trình cho phép người dùng cung cấp chức năng đặt hàng tùy chỉnh. Nếu chức năng của người dùng coi các mục khác nhau là bằng nhau (ví dụ: cùng tên, họ khác nhau), sẽ giúp biết liệu thứ tự ban đầu có được giữ nguyên hay không. Xem các hàm sắp xếp mảng của OCaml để biết ví dụ trong thế giới thực.
Thuật toán sắp xếp ổn định là thuật toán sắp xếp các phần tử giống hệt nhau theo thứ tự giống như chúng xuất hiện trong đầu vào, trong khi sắp xếp không ổn định có thể không thỏa mãn trường hợp. - Tôi cảm ơn giảng viên thuật toán của tôi Didem Gozupek đã cung cấp cái nhìn sâu sắc về các thuật toán .
Các thuật toán sắp xếp ổn định:
Các thuật toán sắp xếp không ổn định:
Sắp xếp ổn định có nghĩa là các bản ghi có cùng khóa giữ nguyên thứ tự tương đối của chúng trước và sau khi sắp xếp.
Vì vậy, sự ổn định là vấn đề nếu và chỉ khi, vấn đề bạn đang giải quyết yêu cầu duy trì trật tự tương đối đó.
Nếu bạn không cần sự ổn định, bạn có thể sử dụng thuật toán nhấm nháp bộ nhớ nhanh từ thư viện, như heapsort hoặc quicksort, và quên nó đi.
Nếu bạn cần sự ổn định, nó phức tạp hơn. Các thuật toán ổn định có mức sử dụng CPU và / hoặc bộ nhớ lớn hơn so với các thuật toán không ổn định. Vì vậy, khi bạn có một tập dữ liệu lớn, bạn phải chọn giữa việc đánh bại CPU hoặc bộ nhớ. Nếu bạn bị hạn chế về cả CPU và bộ nhớ, bạn có vấn đề. Một thuật toán ổn định thỏa hiệp tốt là một loại cây nhị phân; các bài viết trên Wikipedia có một C pathetically dễ ++ thực hiện dựa trên STL.
Bạn có thể biến một thuật toán không ổn định thành một thuật toán ổn định bằng cách thêm số bản ghi gốc làm khóa vị trí cuối cùng cho mỗi bản ghi.
Nó phụ thuộc vào những gì bạn làm.
Hãy tưởng tượng bạn có một số bản ghi người với trường tên và họ. Đầu tiên bạn sắp xếp danh sách theo tên. Nếu sau đó bạn sắp xếp danh sách với thuật toán ổn định theo họ, bạn sẽ có một danh sách được sắp xếp theo tên VÀ họ.
Có một vài lý do tại sao sự ổn định có thể quan trọng. Một là, nếu hai bản ghi không cần hoán đổi bằng cách hoán đổi chúng, bạn có thể gây ra cập nhật bộ nhớ, một trang bị đánh dấu bẩn và cần được ghi lại vào đĩa (hoặc phương tiện chậm khác).
Một thuật toán sắp xếp được cho là ổn định nếu hai đối tượng có các khóa bằng nhau xuất hiện theo cùng một thứ tự trong đầu ra được sắp xếp khi chúng xuất hiện trong mảng không được sắp xếp đầu vào. Một số thuật toán sắp xếp ổn định theo bản chất như Sắp xếp chèn, Sắp xếp hợp nhất, Sắp xếp bong bóng, v.v. Và một số thuật toán sắp xếp không, như Sắp xếp Heap, Sắp xếp nhanh, v.v.
Tuy nhiên, bất kỳ thuật toán sắp xếp nào không ổn định đều có thể được sửa đổi thành ổn định. Có thể sắp xếp các cách cụ thể để làm cho nó ổn định, nhưng nói chung, mọi thuật toán sắp xếp dựa trên so sánh không ổn định về bản chất đều có thể được sửa đổi thành ổn định bằng cách thay đổi thao tác so sánh khóa để so sánh hai khóa coi vị trí là một hệ số cho các đối tượng có khóa bằng nhau.
Tài liệu tham khảo: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf http://en.wikipedia.org/wiki/Sorting_alerskym#Stability
Tôi biết có nhiều câu trả lời cho điều này, nhưng với tôi, câu trả lời này , của Robert Harvey , đã tóm tắt nó rõ ràng hơn nhiều:
Một loại ổn định là một loại duy trì thứ tự ban đầu của bộ đầu vào, trong đó thuật toán [không ổn định] không phân biệt giữa hai hoặc nhiều mục.
Nếu bạn giả sử những gì bạn đang sắp xếp chỉ là những con số và chỉ các giá trị của chúng xác định / phân biệt chúng (ví dụ: các phần tử có cùng giá trị là nhận dạng), thì vấn đề ổn định của việc sắp xếp là vô nghĩa.
Tuy nhiên, các đối tượng có cùng mức độ ưu tiên trong sắp xếp có thể khác biệt và đôi khi thứ tự tương đối của chúng là thông tin có ý nghĩa. Trong trường hợp này, sắp xếp không ổn định tạo ra vấn đề.
Ví dụ: bạn có một danh sách dữ liệu chứa chi phí thời gian [T] của tất cả người chơi để dọn sạch mê cung với Cấp [L] trong trò chơi. Giả sử chúng ta cần xếp hạng người chơi bằng cách họ dọn dẹp mê cung nhanh như thế nào. Tuy nhiên, một quy tắc bổ sung được áp dụng: những người chơi dọn dẹp mê cung với cấp độ cao hơn luôn có thứ hạng cao hơn, bất kể chi phí thời gian là bao lâu.
Tất nhiên, bạn có thể thử ánh xạ giá trị được ghép nối [T, L] thành một số thực [R] với một số thuật toán tuân theo quy tắc và sau đó xếp hạng tất cả người chơi có giá trị [R].
Tuy nhiên, nếu sắp xếp ổn định là khả thi, thì bạn có thể chỉ cần sắp xếp toàn bộ danh sách theo [T] (người chơi nhanh hơn trước) và sau đó là [L]. Trong trường hợp này, thứ tự tương đối của người chơi (theo chi phí thời gian) sẽ không được thay đổi sau khi bạn nhóm chúng theo cấp độ mê cung mà họ đã làm sạch.
PS: tất nhiên cách tiếp cận để sắp xếp hai lần không phải là giải pháp tốt nhất cho vấn đề cụ thể nhưng để giải thích câu hỏi về poster thì nó là đủ.
Sắp xếp ổn định sẽ luôn trả về cùng một giải pháp (hoán vị) trên cùng một đầu vào.
Ví dụ [2.1,2] sẽ được sắp xếp bằng cách sử dụng sắp xếp ổn định dưới dạng hoán vị [2,1,3] (đầu tiên là chỉ số 2, sau đó chỉ mục 1 sau đó chỉ mục 3 trong đầu ra được sắp xếp) Điều đó có nghĩa là đầu ra luôn bị xáo trộn theo cách tương tự. Khác không ổn định, nhưng hoán vị đúng là [2,3,1].
Sắp xếp nhanh không phải là sắp xếp ổn định và sự khác biệt hoán vị giữa các yếu tố giống nhau phụ thuộc vào thuật toán để chọn trục. Một số triển khai nhận ngẫu nhiên và có thể sắp xếp nhanh chóng mang lại các hoán vị khác nhau trên cùng một đầu vào bằng cùng một thuật toán.
Thuật toán sắp xếp ổn định là cần thiết xác định.
sort([(5,3),(1,5),(3,3),(1,3)], x) => [(1,5),(1,3),(3,3),(5,3)]
. Tôi có thể tạo ra một loại xác định luôn luôn xuất (xác định) đầu ra: [(1,3),(1,5),(3,3),(5,3)]
nhưng đây không phải là một loại ổn định.
Một số ví dụ khác về lý do muốn sắp xếp ổn định. Cơ sở dữ liệu là một ví dụ phổ biến. Lấy trường hợp của một cơ sở dữ liệu giao dịch hơn bao gồm họ | tên, ngày | thời gian mua, số mặt hàng, giá cả. Nói cơ sở dữ liệu thường được sắp xếp theo ngày | thời gian. Sau đó, một truy vấn được thực hiện để tạo một bản sao được sắp xếp của cơ sở dữ liệu theo họ | tên, vì một loại ổn định giữ nguyên thứ tự ban đầu, mặc dù so sánh truy vấn chỉ liên quan đến họ | tên, các giao dịch cho mỗi tên cuối cùng sẽ được trong dữ liệu | thứ tự thời gian.
Một ví dụ tương tự là Excel cổ điển, giới hạn sắp xếp thành 3 cột cùng một lúc. Để sắp xếp 6 cột, một sắp xếp được thực hiện với 3 cột ít quan trọng nhất, tiếp theo là sắp xếp với 3 cột quan trọng nhất.
Một ví dụ kinh điển về sắp xếp cơ số ổn định là một bộ sắp xếp thẻ, được sử dụng để sắp xếp theo một trường gồm 10 cột số cơ sở. Các thẻ được sắp xếp từ chữ số có nghĩa ít nhất đến chữ số có ý nghĩa nhất. Trên mỗi lượt đi, một cỗ bài được đọc và tách thành 10 thùng khác nhau theo chữ số trong cột đó. Sau đó, 10 thùng thẻ được đưa trở lại vào phễu đầu vào theo thứ tự (thẻ "0" trước, thẻ "9" cuối cùng). Sau đó, một đường chuyền khác được thực hiện bởi cột tiếp theo, cho đến khi tất cả các cột được sắp xếp. Bộ sắp xếp thẻ thực tế có hơn 10 thùng vì có 12 vùng trên thẻ, một cột có thể để trống và có một thùng đọc sai. Để sắp xếp các chữ cái, cần có 2 lượt cho mỗi cột, đường chuyền thứ nhất cho chữ số, đường chuyền thứ 2 cho vùng 12 11.
Sau này (1937) có các máy đối chiếu thẻ (sáp nhập) có thể hợp nhất hai cỗ bài bằng cách so sánh các trường. Đầu vào là hai bộ bài đã được sắp xếp, bộ bài chính và bộ bài cập nhật. Collator đã hợp nhất hai sàn thành một thùng mater mới và thùng lưu trữ, được sử dụng tùy ý cho các bản sao chính để thùng chính mới chỉ có thẻ cập nhật trong trường hợp trùng lặp. Đây có lẽ là cơ sở cho ý tưởng đằng sau sắp xếp hợp nhất (từ dưới lên).