Apakah diperlukan transitivitas untuk algoritme pengurutan

14

Apakah mungkin untuk menggunakan algoritma penyortiran dengan perbandingan non-transitif, dan jika ya, mengapa transitivitas terdaftar sebagai persyaratan untuk menyortir komparator?

Latar Belakang:

  • Algoritma pengurutan umumnya mengurutkan elemen daftar sesuai dengan fungsi komparator C (x, y), dengan

    C(x,y)={-1jika xy0jika xy+1jika xy

    Persyaratan untuk pembanding ini adalah, sejauh yang saya mengerti:

    • refleksif: x:C(x,x)=0
    • antisymmetric: x,y:C(x,y)=-C(y,x)
    • transitif: x,y,z,Sebuah:C(x,y)=SebuahC(y,z)=SebuahC(x,z)=Sebuah
    • C (x, y) didefinisikan untuk semua x dan y, dan hasilnya hanya bergantung pada x dan y

    (Persyaratan ini selalu terdaftar secara berbeda di seluruh implementasi yang berbeda, jadi saya tidak yakin saya mendapatkannya dengan benar)

Sekarang saya bertanya-tanya tentang fungsi komparator "toleran", yang menerima angka x, y sama seperti jika : |x-y|1

C(x,y)={-1jika x<y-10jika |x-y|1+1jika x>y+1

Contoh: keduanya [ 1, 2, 3, 4, 5]dan [1, 4, 3, 2, 5]secara benar diurutkan dalam urutan naik sesuai dengan pembanding yang toleran ( jika x datang sebelum y dalam daftar) tetapi tidak, karena C (4,2) = 1C(x,y)0
[1, 4, 2, 3, 5]

Komparator toleran ini bersifat refleksif dan antisimetris, tetapi tidak transitif.

yaitu C (1,2) = 0, c (2,3) = 0, tetapi C (1,3) = -1, melanggar transitivitas

Namun saya tidak dapat memikirkan algoritma pengurutan apa pun yang akan gagal menghasilkan keluaran yang "diurutkan dengan benar" ketika diberi komparator ini dan daftar acak.

Apakah karena itu transitivitas tidak diperlukan dalam kasus ini? Dan apakah ada versi kurang ketat transitivitas yang adalah diperlukan untuk menyortir bekerja?

Pertanyaan-pertanyaan Terkait:

HugoRune
sumber
Saya pikir quicksort dengan "selalu pilih tengah" karena pivot akan gagal menggunakan komparator ini pada [3, 2, 1].
G. Bach
2
Saya menduga bahwa beberapa pembanding non-transitif yang digunakan dalam beberapa algoritma penyortiran dapat menyebabkan loop tak terbatas.
Karolis Juodelė
1
Apa yang akan Anda pertimbangkan sebagai daftar yang diurutkan (yaitu output yang diperlukan)? Dalam kasus biasa, ada dua kondisi yang setara: , dan untuk semua . SebuahsayaSebuahsaya+1SebuahsayaSebuahjsayaj
Yuval Filmus
@ G.Bach Saya pikir quicksort benar-benar akan gagal sepenuhnya jika array Anda memiliki n kali 3, satu kali 2, n kali 1, dan tengah 2 digunakan sebagai poros pertama, tidak peduli apa yang terjadi setelahnya.
gnasher729

Jawaban:

11

Anda bertanya: Bisakah kita menjalankan algoritme pengurutan, memberinya perbandingan non-transitif?

Jawabannya: tentu saja. Anda dapat menjalankan algoritma apa pun dengan input apa pun.

Namun, Anda tahu aturannya: Sampah Masuk, Sampah Keluar. Jika Anda menjalankan algoritme pengurutan dengan pembanding non-transitif, Anda mungkin mendapatkan hasil yang tidak masuk akal. Secara khusus, tidak ada jaminan bahwa output akan "diurutkan" sesuai dengan pembanding Anda. Jadi, menjalankan algoritme pengurutan dengan komparator non-transitif kemungkinan tidak akan berguna seperti yang Anda harapkan.

Sebagai contoh tandingan, menjalankan penyisipan mengurutkan pada daftar input menggunakan komparator Anda akan membuat daftar tidak berubah - namun daftar output yang dihasilkan tidak dalam urutan diurutkan (sesuai dengan komparator Anda).[3,2,1]

DW
sumber
1
Pikiran pertama saya adalah bahwa daftar [3,2,1] adalah dalam rangka diurutkan menurut pembanding saya, jadi tentu saja semacam itu harus meninggalkannya tidak berubah; tapi saya mungkin telah menggunakan definisi yang salah dari diurutkan. Saya hanya membandingkan masing-masing elemen dengan tetangga langsungnya, tetapi itu mungkin terlalu lemah pembatasan untuk mempertimbangkan daftar diurutkan
HugoRune
4
@HugoRune Nah, itu poin yang menarik. Apa yang Anda maksud dengan diurutkan ? Jika Anda dapat menunjukkan algoritma pengurutan akan berakhir dengan komparator non-transitif, dan bahwa setiap kali algoritma berakhir, beberapa kondisi adalah benar, dan kondisi itu adalah apa yang Anda ambil untuk disortir ... maka tentu saja algoritma tersebut akan mengurutkan daftar Anda setiap waktu, untuk definisi pengurutan . Jika pembanding tidak transitif, mungkin tidak masuk akal untuk mengambil definisi yang diurutkan yang membutuhkan perbandingan berpasangan dari semua elemen dalam daftar yang diurutkan.
Patrick87
3
@HugoRune, dengan "hanya tetangga yang dibandingkan" Anda mungkin perlu jenis kustom. Algoritma standar mengasumsikan transitivitas untuk menghindari perbandingan yang berlebihan. Atau Anda dapat menanamkan pesanan non-transitif Anda dalam transitif. Atau mungkin Anda mencari sesuatu di sepanjang garis penyortiran topologi ?
vonbrand
Saya berlari ke ini beberapa waktu lalu dan menemukan bahwa semacam gelembung benar-benar berfungsi dengan baik, karena hanya membandingkan elemen yang berdekatan.
Mooing Duck
4

Dengan serangkaian elemen dan hubungan pemesanan biner, transitivitas diperlukan untuk memesan elemen secara total. Bahkan, transitivitas bahkan diperlukan untuk menentukan urutan parsial pada elemen. http://en.m.wikipedia.org/wiki/Total_order

Anda akan memerlukan definisi yang lebih luas tentang arti "diurutkan" untuk mengurutkan elemen tanpa transitivitas. Sulit untuk konsisten dengan diri sendiri. Jawaban lain mengatakan, "Secara khusus, tidak ada jaminan bahwa output akan 'diurutkan' sesuai dengan pembanding Anda." Tapi kita sebenarnya bisa mengatakan sesuatu yang jauh lebih kuat. Anda dijamin bahwa output tidak diurutkan sesuai dengan pembanding Anda.

Sebuah<bb<cc<Sebuah

Joe
sumber
1
Saya menafsirkan pertanyaan yang akan ditanyakan tentang penyortiran menggunakan urutan parsial (sedemikian sehingga perbandingan yang mengatakan hal-hal tidak setara adalah transitif, tetapi mereka yang menganggap barang tidak bisa dibedakan tidak). Penyortiran berdasarkan pemesanan parsial kadang berguna, tetapi dalam kasus terburuk memerlukan perbandingan N (N-1) / 2. Algoritma pengurutan apa pun yang dalam kasus terburuk melakukan perbandingan kurang dari N (N-1) / 2 tidak akan dapat membuat peringkat item yang dipesan sebagian dengan benar karena alasan yang dijelaskan dalam jawaban saya.
supercat
2

Kedengarannya seperti apa yang Anda inginkan adalah mengatur item sehingga semua peringkat yang terlihat benar, tetapi item yang dekat mungkin dianggap "tidak bisa dibedakan". Dimungkinkan untuk merancang algoritma pengurutan yang akan bekerja dengan perbandingan seperti itu, tetapi kecuali ada batasan berapa banyak perbandingan dapat melaporkan bahwa hal-hal tidak dapat dibedakan, tidak ada cara untuk menghindarinya karena mereka memerlukan perbandingan N (N-1) / 2. Untuk memahami alasannya, pilih beberapa angka N dan algoritma penyortiran apa pun yang melakukan perbandingan kurang dari N (N-1) / 2. Kemudian mengisi daftar L [0..N-1], mengatur setiap elemen L [I] ke I / N dan "mengurutkan" menggunakan komparator Anda (nilai minimum akan menjadi 0 dan maksimum (N-1) / N , jadi perbedaannya adalah (N-1) / N, yang kurang dari 1).

Karena ada N (N-1) / 2 pasang item yang dapat dibandingkan, dan jenisnya tidak melakukan banyak perbandingan, pasti ada beberapa item yang tidak secara langsung dibandingkan satu sama lain. Ganti yang mana saja yang akhirnya disortir terlebih dahulu dengan 1, dan yang lainnya dengan -1 / N, kembalikan semua item ke posisi awal, dan ulangi operasi penyortiran. Setiap operasi perbandingan tunggal akan menghasilkan nol, sama seperti yang dilakukan pertama kali, sehingga perbandingan yang sama akan dilakukan dan item akan berakhir dalam urutan yang sama. Agar daftar diurutkan dengan benar, "1" harus mengurutkan setelah "-1 / N" (karena mereka berbeda lebih dari satu) tetapi karena algoritma pengurutan tidak akan pernah membandingkan kedua item secara langsung terhadap satu sama lain, itu tidak akan memiliki cara untuk mengetahui hal itu.

supercat
sumber
0

Isi larik elemen n dengan nilai n, n-1, n-2, ..., 2, 1. Kemudian cobalah mengurutkan menggunakan algoritma "straight insertion". Anda akan menemukan bahwa setiap elemen dianggap sama dengan elemen sebelum itu, dan karenanya tidak dipindahkan. Hasil dari "sort" adalah array yang sama.

gnasher729
sumber