En fazla 7 karşılaştırmayla 5 tamsayı dizisini sırala


19

5 tamsayı bir listeyi nasıl sıralayabilirim, en kötü durumda 7 karşılaştırmayı alır? Başka kaç işlem gerçekleştirildiği umurumda değil. Tamsayılar hakkında özel bir şey bilmiyorum.

Ben bir birleştirme yaklaşımı izlemek veya ekleme konumunu bulmak için ikili arama kullanarak birleştirme ile birleştirmek gibi 8 karşılaştırmalar beni aşağı olsun birkaç farklı böl ve fethet yaklaşımları denedim, ama her 8 ben en kötü durumda karşılaştırır .

Şu anda sadece bir ipucu arıyorum, bir çözüm değil.


"Karşılaştır" ağacını yazmaya çalıştınız mı? It has yaprak, her biri tamsayıların permütasyonuna karşılık gelir. "Karşılaştır" ağacıyla ne demek istediğimi bilmiyorsanız, n log n karşılaştırmasına ihtiyacınız olduğunun kanıtını biliyor musunuz ? Ps, bunun mümkün olduğunu düşündüren nedir? 5!=120nlogn
Pål GD

1
Peki, 8 bit ikisinin tamamlayıcısı, neredeyse bir karşılaştırma ile if(x > y)aynıdır if((x - y) & 0x80). Sanırım nesnelerin tamsayı olduğunu unutmamalıyız ve compare(x, y)bu nesneleri karşılaştırmak için büyülü bir işlev kullanmalıyız ...
Karolis Juodelė

2
' Tam olarak bu soruyu kapsayan Bilgisayar Programlama Sanatı Cilt 3'teki optimum sıralama hakkındaki bölüm 5.3'e göz atın' bir ipucu veya çözüm olarak sayılır mı? :-)
Steven Stadnicki

3
Sınır gerçekten ve 5 ! = 120 < 2 7 = 128 . Bu yüzden olduğu (prensipte) mümkün. 2cn!5!=120<27=128
vonbrand

Yanıtlar:


23

Bu işleme başlamanın yalnızca bir yolu vardır (ve sonraki adımlarda nelerin karşılaştırılacağına dair neredeyse tüm kararlarınız için, tek bir doğru adım vardır). Bunu nasıl anlayacağınız aşağıda açıklanmıştır. İlk olarak, karşılaştırmalarınız için alabileceğiniz olası cevap olduğunu ve 5 ! = 120 farklı permütasyon arasında ayrım yapmanız gerekiyor.27=1285!=120

İlk karşılaştırma kolaydır: iki anahtarı karşılaştırmanız gerekir ve bunlar hakkında hiçbir şey bilmediğiniz için, tüm seçenekler eşit derecede iyidir. Diyelim ki ve b'yi kıyaslayın ve a b'yi bulun . Artık 2 6 = 64 olası yanıtınız kaldı ve 60 olası permütasyon kaldı (bunların yarısını ortadan kaldırdığımız için).abab26=6460

Daha sonra, ve d'yi karşılaştırabiliriz veya c'yi ilk karşılaştırmada kullandığımız anahtarlardan biriyle karşılaştırabiliriz. Biz karşılaştırırsanız c ve d ve öğrenmek c d , o zaman var 32 Kalan cevapları ve 30 olası permütasyon. Karşılaştırdıpımız Diğer yandan, c ile bir , ve bu bilgiye bir C , biz 40 biz ortadan çünkü, diğer olası permütasyon 1 / 3 olası permütasyon (olanlar c cdccdcd3230caac401/3 ). Sadece 32 olası cevabımızvar, bu yüzden şansımız kalmadı.cab32

Artık birinci ve ikinci anahtarları ve üçüncü ve dördüncü anahtarları karşılaştırmamız gerektiğini biliyoruz. Elimizdeki varsayabiliriz ve c d . Biz karşılaştırırsanız e bu dört tuşlarından herhangi birine, bir önceki adımda kullanılan aynı argüman, biz sadece ortadan kaldırabilir 1 / 3 Kalan permütasyon ve biz şans bitti. Bu yüzden a , b , c , d tuşlarından ikisini karşılaştırmalıyız . Simetri göz önünde bulundurulduğunda, iki seçeneğimiz var: a ve c'yi karşılaştırın veya a ve d'yi karşılaştırınabcde1/3a,b,c,dacad. Benzer bir sayım argümanı ve c'yi karşılaştırmamız gerektiğini gösterir . Biz o genelliği kaybetmeden varsayabiliriz bir c ve şimdi elimizde bir b ve bir c d .acacabacd

Bir ipucu istediğinden, tartışmanın geri kalanından geçmeyeceğim. Dört karşılaştırmanız kaldı. Bunları akıllıca kullanın.


ile c'yi karşılaştırmak sizi sadece 40 permütasyona indirdi? ac
Robert S. Barnes

1
@Robert: Eğer olduğunu varsayalım ve bir c . Sonra a , b , c'nin bu kısıtlamalarla tutarlı iki permütasyonu vardır , bir < b < c ve bir < c < b . Bu iki permütasyon her biri için, ekleyebilir dört yer vardır d ve ekleyebileceğiniz beş yerler e . abaca,b,ca<b<ca<c<bde
Peter Shor

8

Bunu D.Knuth'un Bilgisayar Sanatı Programlama Cilt III'te bulabilirsiniz, ancak strateji şöyle ( dizisine sahip olduğunuzu varsayacağım ): cevabımın ilk iki satırı{a,b,c,d,e}

  • İlk grup çiftleri: .(a,b),(c,d)
  • Eşleştirmek için çiftleri karşılaştırın, örneğin: .a<b,c<d
  • Çiftlerinin en küçük elemanlarını karşılaştırın, biz mesela sonucu olsun .a<c
  • Son eleman , son karşılaştırmada daha büyük elemanla karşılaştır ( c ) ec
    • Eğer , kalan 3 karşılaştırmayla sonuçlanması kolaydır. Bitirdi.e<c
    • Eğer o zaman gereken sıralama { b , c , d , e } bilgi ile c < e , c < d . e>c{b,c,d,e}c<e,c<d
      • , eğer d < e daha sonra Compare(d,e)d<e
        • B > d ise C o m p a r e ( b , d )Compare(b,d)b>d
          • . Bitirdi.Compare(b,e)
        • Eğer b<d
          • . Bitirdi.Compare(b,c)
      • Eğer d>e
        • B > e ise C o m p a r e ( b , e )Compare(b,e)b>e
          • . Bitirdi.Compare(b,d)
        • eğer b<e
          • . Bitirdi.Compare(b,c)

Yukarıda belirtilen yolların tümü, c ile ilk karşılaştırmasından sonra en fazla üç karşılaştırmaya neden olur . (en fazla 7 anlamına gelir). ec


Bunun doğru olduğundan emin misin? Aşağıdaki sonuçları aldığınızı varsayın: a <b, c <d, a <c ve sonra c <e, b <e, c <b ve d <e. A <c <b <d <e ve <c <d <b <e sıralarının ikisi de onlarla tutarlıdır. Bunun nedeni, b ve d'nin hiçbir zaman örtük veya açık bir şekilde karşılaştırılmamasıdır. Belki bir yerde yanılıyorum, eğer öyleyse lütfen beni düzeltin.
George
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.