Anda cukup menghitung jumlah inversi dalam daftar.
Inversi
Suatu inversi dalam suatu urutan elemen-elemen tipe T
adalah sepasang elemen-elemen sekuens yang muncul tidak sesuai dengan beberapa pemesanan <
pada set elemen T
.
Dari Wikipedia :
Secara formal, biarkan A(1), A(2), ..., A(n)
menjadi urutan n
angka.
Jika i < j
dan A(i) > A(j)
, maka pasangan (i,j)
disebut inversi dari A
.
Nomor inversi dari urutan adalah salah satu ukuran umum penyortirannya.
Secara formal, nomor inversi didefinisikan sebagai jumlah inversi, yaitu,
Untuk membuat definisi ini lebih jelas, pertimbangkan urutan contoh 9, 5, 7, 6
. Urutan ini memiliki inversi (0,1), (0,2), (0,3), (2,3)
dan nomor inversi 4
.
Jika Anda menginginkan nilai antara 0
dan 1
, Anda dapat membagi nomor inversi dengan N choose 2
.
Untuk benar-benar membuat algoritma untuk menghitung skor ini untuk bagaimana diurutkan daftar itu, Anda memiliki dua pendekatan:
Pendekatan 1 (Deterministik)
Ubah algoritma penyortiran favorit Anda untuk melacak berapa banyak inversi yang dikoreksi saat dijalankan. Meskipun ini bukan trivial dan memiliki implementasi yang bervariasi tergantung pada algoritma pengurutan yang Anda pilih, Anda akan berakhir dengan algoritma yang tidak lebih mahal (dalam hal kompleksitas) daripada algoritma pengurutan yang Anda mulai.
Jika Anda mengambil rute ini, perlu diketahui bahwa tidak sesederhana menghitung "swap". Mergesort, misalnya, adalah kasus terburuk O(N log N)
, namun jika dijalankan pada daftar yang diurutkan dalam urutan menurun, itu akan memperbaiki semua N choose 2
inversi. Itu O(N^2)
inversi diperbaiki di O(N log N)
operasi. Jadi beberapa operasi pasti mengoreksi lebih dari satu inversi pada suatu waktu. Anda harus berhati-hati dengan implementasi Anda. Catatan: Anda dapat melakukan ini dengan O(N log N)
kerumitan, itu hanya rumit.
Terkait: menghitung jumlah "inversi" dalam permutasi
Pendekatan 2 (Stochastic)
- Pasangan sampel secara acak
(i,j)
, di manai != j
- Untuk setiap pasangan, tentukan apakah
list[min(i,j)] < list[max(i,j)]
(0 atau 1)
- Hitung rata-rata perbandingan ini dan kemudian normalkan dengan
N choose 2
Saya pribadi akan pergi dengan pendekatan stokastik kecuali jika Anda memiliki persyaratan ketepatan - jika hanya karena sangat mudah diimplementasikan.
Jika yang benar-benar Anda inginkan adalah nilai ( z'
) antara -1
(diurutkan menurun) ke 1
(diurutkan naik), Anda cukup memetakan nilai di atas ( z
), yang antara 0
(diurutkan naik) dan 1
(diurutkan turun), ke rentang ini menggunakan rumus ini :
z' = -2 * z + 1