İnversiyon sayısını minimumda tutarak listeye verimli bir şekilde ekleme


15

İki karşılaştırılabilir öğe listesi olduğunu varsayın: u ve s. INV (u) u içindeki ters çevirme sayısı olsun.

Ben INV (u) minimal bir artış ile u öğeleri s eklemek için verimli bir algoritma arıyorum.

Temelde ilk listenin sırasını korurken "olabildiğince sıralanmış" tutarken bir listeye nesneleri eklemek istiyorum.

Misal:

u = [4,6,2,9,7]
INV(u) = 3 ((4, 2), (6, 2) and (9, 7)

s = [8,3,10]

one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7))

different optimal solution u' = [3, 4, 6, 2, 9, 7, 8, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (9,8))

Gördüğünüz gibi benzersiz bir optimum çözüm yoktur.

Her türlü fikir veya yönün incelenmesinden memnuniyet duyarım.


Düşünce için yiyecek: Saf yaklaşım şöyle olacaktır: Bir öğeyi s'den alın, soldan sağa doğru u'daki her bir öğeyle karşılaştırın, bir ters çevirme ise artırın ve önceden hesaplanan sayıyı taşıyın. Ardından listeyi sağdan sola aynı öğeyle hareket ettirin ve her konum için sayıları artırın. Bu, O (| s | * | u |) ile space = O (| u |)
trevore içinde çalışır

1
Tüm maksimum artan alt sekansların incelenmesi bir yere yol açabilir.
Raphael

Yanıtlar:


2

Bu trevore'un cevabı üzerine bir ayrıntı. Bir yoruma uymak için çok uzun ve çözümünün kanıtlarını (veya en azından nasıl anladığımı) içeriyor.

Herhangi bir optimal çözümde, öğelerinin sıralı görüneceğini gösterebilirsiniz . sDeğilse, olduğunu varsayalım ve bunlar en uygun çözümde ters sırada görünür. Let σ 1 arasında elemanların sayısı s 1 ve s 2 daha az olan s 1 ve β 1 daha büyük olanların sayısı olmak s 1 . tanımlayıns1<s2σ1s1s2s1β1s1 ve β 2'yi s 2 için benzer şekilde. Σ 1 olduğunu unutmayınσ2β2s2 ve β 2β 1 . Değişim s 1 ve s P 1 + β 2 - σ 2 + σ 1 - 1 en -1 yer almaktadır.σ1σ2β2β1s1 evirme sayısını -s2β1+β2σ2+σ11

Şu unsurları görmek zor değil: bağımsız olarak eklenebileceğini. sDüzenli göründükleri için, unsurlarıbirbirlerinin varlığını "hissetmezler". Yani, s öğelerinden oluşan çiftlerters çevirme sayısına katkıda bulunmaz. Bunu yapmak için, s'nin medyanınılineer zamanda en uygun şekildeyerleştirin. Ardından, yinelemeli, insert elemanları s az ortanca daha refüj ve sağa ortanca daha büyük elementlerin bıraktı.ssss

Ortanca konumuna yerleştirilsin , bunun çalışma zamanı tatmin olur, T ( | s | , | u | ) = T ( | s | / 2 , | u | - k ) + T ( | s | / 2 , k )k, doğrusal | s |T(|s|,|u|)=T(|s|/2,|u|k)+T(|s|/2,k)+|u|+|s||s|faktör medyanı bulmak ve öğelerini karıştırmaktır . İndüksiyonla T ( | s | , | s | + | u | log | s | ) olduğunu göstermek kolaydır .sT(|s|,|u|)=O(|s|log|s|+|u|log|s|)

Unutmayın ki bağımlılık İşte optimal. Boş u ile problemi çözmek, s'yi sıralamakla eşdeğerdir.|s|us sadece karşılaştırmalar kullanarak. Bağımlılığı Bir tek liste için sorun beri, optimum da lar ve bir liste u doğrusal çalışma gerektirebilir gerekir.|u|su


Ayrıntılandırdığınız için teşekkürler. Demek istediğim tam da bu çözüm.
trevore

1

Tamam, işte benim çözümüm:

Bir gözlem (az ya da çok kanıtladığım), optimal bir çözümün her zaman s'nin artan bir şekilde sıralandığı bir çözüm olacağıdır. Bu bir O ((| u | + | s |) * log (| s |)) algoritmasına yol açar.

Tek bir öğe için en uygun çözümü bulmak için, yorumumda söylediğim gibi yapın: Bir öğeyi s'den alın, soldan sağa doğru u'daki her öğeyle karşılaştırın, bir sayacı artırmak ters çevirir ve önceden hesaplanan sayıyı taşır. Ardından listeyi sağdan sola aynı öğeyle hareket ettirin ve her konum için sayıları artırın.

Bu O (| u |).

Sırala s.

M konumundaki s'nin orta elemanı için: u'daki en iyi b pozisyonunu bulun (yukarıdan gelen yöntemi kullanarak).

S'yi m ve u'da b'ye bölün ve sonuçları m ile doğru sırada birleştirerek sol ve sağ kısımlarla tekrar tekrar çağırın.

U veya s boş olur olmaz durdurun.


Bunu anlamıyorum. s bir girdidir. S'nin sıralanmış düzende olduğunu varsayamazsınız. Algoritmanız olası tüm s değerleri için çalışmalıdır.
DW

Evet, ancak herhangi bir optimum çözümde, s öğelerinin her zaman yeni dizide artan bir şekilde sıralanması gerekir. "Sırala s" adımına dikkat edin. Yukarıdaki örneğe bakın. Şimdiye kadar kanıtladığım şey: a, b cinsinden s, a <b eğer a en uygun şekilde yerleştirilmişse, b için en uygun yer a'nın sağındadır.
trevore
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.