Listedeki ters çevirme sayısını sayabilirsiniz.
ters çevirme
Bir dizi eleman dizisindeki ters çevirme , 's setindeki T
bazı sıralamaya göre sıra dışı görünen bir çift dizi elemanıdır .<
T
Gönderen Vikipedi :
Resmi olarak, A(1), A(2), ..., A(n)
bir n
sayı dizisi olsun .
Eğer i < j
ve A(i) > A(j)
ardından çifti (i,j)
bir denir inversiyon arasındaA
.
Ters numarası bir sekansın kendi sortedness biri ortak bir ölçüsüdür.
Resmi olarak, ters çevirme sayısı, ters çevirme sayısı, yani,
Bu tanımları daha açık hale getirmek için örnek sıralamayı göz önünde bulundurun 9, 5, 7, 6
. Bu sekansın inversiyonları (0,1), (0,2), (0,3), (2,3)
ve inversiyon sayısı vardır 4
.
0
Ve arasında bir değer 1
istiyorsanız, ters çevirme numarasınıN choose 2
.
Bir listenin nasıl sıralandığına ilişkin bu puanı hesaplamak için bir algoritma oluşturmak için iki yaklaşımınız vardır:
Yaklaşım 1 (Deterministik)
Çalışırken kaç ters çevirme olduğunu takip etmek için favori sıralama algoritmanızı değiştirin. Bu önemsiz olsa da ve seçtiğiniz sıralama algoritmasına bağlı olarak farklı uygulamalara sahip olsa da, başladığınız sıralama algoritmasından daha pahalı olmayan (karmaşıklık açısından) bir algoritma elde edeceksiniz.
Bu rotayı izlerseniz, bunun "swap" saymak kadar basit olmadığını unutmayın. Örneğin, Mergesort en kötü durumdur O(N log N)
, ancak azalan düzende sıralanmış bir listede çalıştırılırsa, tüm N choose 2
inversiyonları düzeltir . Bu O(N^2)
, O(N log N)
işlemlerde düzeltmeler düzeltildi . Bu nedenle, bazı işlemler kaçınılmaz olarak bir seferde birden fazla evirmeyi düzeltiyor olmalıdır. Uygulamanıza dikkat etmelisiniz. Not: Bunu O(N log N)
karmaşıklıkla yapabilirsiniz, sadece zor.
İlgili: permütasyondaki “inversiyon” sayısının hesaplanması
Yaklaşım 2 (Stokastik)
- Rastgele örnekleme çiftleri
(i,j)
, buradai != j
- Her çift için
list[min(i,j)] < list[max(i,j)]
(0 veya 1)
- Bu karşılaştırmaların ortalamasını hesaplayın ve ardından normalleştirin
N choose 2
Kesinlik gereksiniminiz olmadıkça şahsen stokastik yaklaşımla devam ederdim - sadece uygulanması çok kolay olduğu için.
Gerçekten istediğiniz ( (azalan sıralama) ile (artan sıralama z'
) arasındaki bir değer ( ) ise , bu formülü kullanarak ( artan sıralama) ve (sıralama azalan) arasındaki yukarıdaki ( ) değeri basitçe eşleyebilirsiniz. :-1
1
z
0
1
z' = -2 * z + 1