Là độ xuyên cần thiết cho một thuật toán sắp xếp


14

Có thể sử dụng một thuật toán sắp xếp với một so sánh không bắc cầu, và nếu có, tại sao tính chuyển đổi được liệt kê như một yêu cầu để sắp xếp các bộ so sánh?

Lý lịch:

  • Một thuật toán sắp xếp thường sắp xếp các phần tử của danh sách theo hàm so sánh C (x, y), với

    C(x,y)={1nếu xy0nếu x~y+1nếu xy

    Các yêu cầu cho bộ so sánh này, theo như tôi hiểu chúng:

    • phản xạ: x:C(x,x)= =0
    • đối xứng: x,y:C(x,y)=C(y,x)
    • chuyển tiếp: x,y,z,a:C(x,y)=aC(y,z)=aC(x,z)=một
    • C (x, y) được xác định cho tất cả x và y và kết quả chỉ phụ thuộc vào x và y

    (Các yêu cầu này luôn được liệt kê khác nhau qua các triển khai khác nhau, vì vậy tôi không chắc là mình đã hiểu đúng chưa)

Bây giờ tôi đang tự hỏi về một hàm so sánh "khoan dung", chấp nhận các số x, y là tương tự nếu : C ( x , y ) = { - 1 nếu x < y - 1 0 nếu | x - y | 1 + 1 nếu x > y + 1|xy|1

C(x,y)={1if x<y10if |xy|1+1if x>y+1

[ 1, 2, 3, 4, 5][1, 4, 3, 2, 5]C(x,y)0
[1, 4, 2, 3, 5]

Bộ so sánh dung sai này là phản xạ và không đối xứng, nhưng không phải là bắc cầu.

tức là C (1,2) = 0, c (2,3) = 0, nhưng C (1,3) = -1, vi phạm tính siêu việt

Tuy nhiên, tôi không thể nghĩ ra bất kỳ thuật toán sắp xếp nào sẽ không tạo ra đầu ra "được sắp xếp chính xác" khi đưa ra bộ so sánh này và một danh sách ngẫu nhiên.

Do đó, tính xuyên sáng không được yêu cầu trong trường hợp này? Và có một phiên bản ít nghiêm ngặt hơn về tính siêu việt được yêu cầu để sắp xếp hoạt động không?

Câu hỏi liên quan:


Tôi nghĩ quicksort với "luôn luôn chọn giữa" cho trục sẽ không sử dụng bộ so sánh này trên [3, 2, 1].
G. Bạch

2
Tôi nghi ngờ rằng một số bộ so sánh không chuyển tiếp được sử dụng trong một số thuật toán sắp xếp có thể gây ra một vòng lặp vô hạn.
Karolis Juodelė

1
aiai+1aiajij

@ G.Bach Tôi nghĩ quicksort sẽ thực sự thất bại hoàn toàn nếu mảng của bạn có n lần 3, một lần 2, n lần 1 và giữa 2 được sử dụng làm trục đầu tiên, bất kể điều gì xảy ra sau đó.
gnasher729

Câu trả lời:


11

Bạn hỏi: Chúng ta có thể chạy một thuật toán sắp xếp, cho nó một bộ so sánh không bắc cầu không?

Câu trả lời: Tất nhiên. Bạn có thể chạy bất kỳ thuật toán với bất kỳ đầu vào.

Tuy nhiên, bạn biết quy tắc: Rác vào, Rác ra. Nếu bạn chạy một thuật toán sắp xếp với một bộ so sánh không chuyển tiếp, bạn có thể nhận được đầu ra vô nghĩa. Cụ thể, không có gì đảm bảo rằng đầu ra sẽ được "sắp xếp" theo bộ so sánh của bạn. Vì vậy, chạy một thuật toán sắp xếp với một bộ so sánh không chuyển tiếp có thể không hữu ích theo cách mà bạn có thể hy vọng.

Như một ví dụ mẫu, chạy sắp xếp chèn vào danh sách đầu vào [3,2,1]


1
Suy nghĩ đầu tiên của tôi là danh sách [3,2,1] theo thứ tự sắp xếp theo so sánh của tôi, vì vậy dĩ nhiên là loại nên để lại nó không thay đổi; nhưng tôi có thể đã sử dụng định nghĩa sai của sắp xếp. Tôi chỉ so sánh từng yếu tố với các hàng xóm trực tiếp của nó, nhưng đó có thể là một hạn chế quá yếu để xem xét một danh sách được sắp xếp
HugoRune

4
@HugoRune Vâng, đó là một điểm thú vị. Làm gì bạn có nghĩa là bởi sắp xếp ? Nếu bạn có thể hiển thị một thuật toán sắp xếp sẽ chấm dứt một bộ so sánh không chuyển tiếp và rằng bất cứ khi nào thuật toán kết thúc, một số điều kiện là đúng và điều kiện đó là thứ bạn sắp xếp thành ... thì tất nhiên thuật toán đó sẽ sắp xếp danh sách của bạn mỗi lần, cho định nghĩa của sự sắp xếp . Nếu bộ so sánh không mang tính bắc cầu, có thể không có ý nghĩa để đưa ra một định nghĩa về sắp xếp , đòi hỏi so sánh từng cặp của tất cả các yếu tố trong danh sách được sắp xếp.
Patrick87

3
@HugoRune, với "chỉ hàng xóm được so sánh" có thể bạn sẽ cần một loại tùy chỉnh. Các thuật toán tiêu chuẩn giả định tính siêu việt để tránh so sánh dư thừa. Hoặc bạn có thể nhúng thứ tự không chuyển tiếp của bạn trong một thứ tự bắc cầu. Hoặc có lẽ bạn đang tìm kiếm một cái gì đó dọc theo dòng sắp xếp tôpô ?
vonbrand

Tôi tình cờ gặp lại một lúc và thấy rằng loại bong bóng thực sự hoạt động tốt, vì nó chỉ so sánh các yếu tố liền kề.
Vịt Mooing

4

Đưa ra một tập hợp các phần tử và một quan hệ thứ tự nhị phân, độ xuyên được yêu cầu để hoàn toàn sắp xếp các phần tử. Trong thực tế, tính siêu việt thậm chí được yêu cầu để xác định một phần thứ tự trên các phần tử. http://en.m.wikipedia.org/wiki/Total_order

Bạn sẽ cần một định nghĩa rộng hơn nhiều về ý nghĩa của "sắp xếp" để sắp xếp các phần tử mà không có tính chuyển đổi. Thật khó để tự nhất quán. Một câu trả lời khác cho biết "Đặc biệt, không có gì đảm bảo rằng đầu ra sẽ được 'sắp xếp' theo bộ so sánh của bạn." Nhưng chúng ta thực sự có thể nói điều gì đó mạnh mẽ hơn nhiều. Bạn được đảm bảo rằng đầu ra không được sắp xếp theo bộ so sánh của bạn.

Nói rằng bạn có một bộ so sánh không bắc cầu cho bạn biết một<bb<cc<một


1
Tôi đã giải thích câu hỏi được hỏi về việc sắp xếp bằng cách sử dụng thứ tự từng phần (sao cho một phép so sánh nói rằng mọi thứ không đồng đều là bắc cầu, nhưng những thứ liên quan đến các mục không thể phân biệt được thì không). Sắp xếp dựa trên thứ tự một phần đôi khi hữu ích, nhưng trong trường hợp xấu nhất đòi hỏi phải so sánh N (N-1) / 2. Bất kỳ thuật toán sắp xếp nào trong trường hợp xấu nhất thực hiện ít hơn so sánh N (N-1) / 2 sẽ không thể xếp hạng chính xác các mục được đặt hàng một phần vì những lý do được mô tả trong câu trả lời của tôi.
supercat

2

Nghe có vẻ như những gì bạn muốn là sắp xếp các mục sao cho tất cả các thứ hạng rõ ràng là chính xác, nhưng các mục gần gũi có thể được coi là "không thể phân biệt". Có thể thiết kế các thuật toán sắp xếp sẽ hoạt động với các so sánh như vậy, nhưng trừ khi có giới hạn về số lượng so sánh có thể báo cáo rằng mọi thứ không thể phân biệt được, không có cách nào để tránh chúng yêu cầu so sánh N (N-1) / 2. Để hiểu lý do tại sao, chọn một số số N và bất kỳ thuật toán sắp xếp nào có ít hơn so sánh N (N-1) / 2. Sau đó điền danh sách L [0..N-1], đặt từng phần tử L [I] thành I / N và "sắp xếp" nó bằng bộ so sánh của bạn (giá trị tối thiểu sẽ là 0 và tối đa (N-1) / N , do đó, sự khác biệt sẽ là (N-1) / N, nhỏ hơn 1).

Bởi vì có N (N-1) / 2 cặp vật phẩm có thể so sánh được và loại này không thực hiện được nhiều so sánh, nên phải có một số cặp vật phẩm không được so sánh trực tiếp với nhau. Thay thế bất kỳ một trong số này cuối cùng được sắp xếp trước 1 và cái còn lại bằng -1 / N, hoàn nguyên tất cả các mục về vị trí ban đầu của chúng và lặp lại thao tác sắp xếp. Mỗi thao tác so sánh đơn lẻ sẽ mang lại số không, giống như lần đầu tiên thực hiện, do đó, các phép so sánh tương tự sẽ được thực hiện và các mục sẽ kết thúc theo cùng một trình tự. Để danh sách được sắp xếp chính xác, "1" sẽ phải sắp xếp sau "-1 / N" (vì chúng khác nhau nhiều hơn một) nhưng vì thuật toán sắp xếp sẽ không bao giờ so sánh trực tiếp hai mục đó với nhau. sẽ không có cách nào để biết điều đó.


0

Điền vào một mảng gồm n phần tử với các giá trị n, n-1, n-2, ..., 2, 1. Sau đó thử sắp xếp bằng thuật toán "chèn thẳng". Bạn sẽ thấy rằng mỗi phần tử được coi là bằng với phần tử ngay trước nó, và do đó không được di chuyển. Kết quả của "sắp xếp" là cùng một mảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.