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
Persyaratan untuk pembanding ini adalah, sejauh yang saya mengerti:
- refleksif:
- antisymmetric:
- transitif:
- 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 :
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) = 1[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:
- Mengapa antisimetri diperlukan untuk jenis perbandingan? (tentang antisimetri)
- Algoritma pengurutan yang menerima pembanding acak (sekitar C acak (x, y))
- OrderBy dengan IComparer non-transitif (tentang algoritma c # sort, oleh saya)