Sortir array 5 bilangan bulat dengan maksimum 7 perbandingan

19

Bagaimana saya bisa mengurutkan daftar 5 bilangan bulat sehingga dalam kasus terburuk dibutuhkan 7 perbandingan? Saya tidak peduli berapa banyak operasi lain yang dilakukan. Saya tidak tahu apa-apa tentang bilangan bulat.

Saya telah mencoba beberapa pendekatan membagi dan menaklukkan yang membuat saya turun ke 8 perbandingan, seperti mengikuti pendekatan mergesort, atau menggabungkan mergesort dengan menggunakan pencarian biner untuk menemukan posisi penyisipan, tetapi setiap kali saya berakhir dengan 8 membandingkan kasus terburuk .

Saat ini saya hanya mencari petunjuk, bukan solusi.

Robert S. Barnes
sumber
Sudahkah Anda mencoba menulis pohon "bandingkan dengan"? Ini memiliki 5!=120 daun, masing-masing sesuai dengan permutasi bilangan bulat. Jika Anda tidak tahu apa yang saya maksud dengan pohon "bandingkan dengan", apakah Anda tahu bukti bahwa Anda perlu nlogn perbandingan? Ps, apa yang membuatmu berpikir itu mungkin?
Pål GD
1
Nah, dalam komplemen 8 bit dua, if(x > y)adalah sama dengan if((x - y) & 0x80)yang hampir tidak bisa dibandingkan. Saya kira kita harus lupa bahwa benda-benda itu bilangan bulat dan menganggap kita harus menggunakan beberapa compare(x, y)fungsi magis untuk membandingkan benda-benda itu ...
Karolis Juodelė
2
Apakah 'lihat bagian 5.3 pada pengurutan optimal dalam Volume 3 dari The Art Of Computer Programming , yang mencakup persis pertanyaan ini' dihitung sebagai petunjuk atau solusi? :-)
Steven Stadnicki
3
Batasnya benar-benar , dan 5 ! = 120 < 2 7 = 128 . Jadi adalah mungkin (pada prinsipnya). 2cn!5!=120<27=128
vonbrand

Jawaban:

23

Hanya ada satu cara untuk memulai proses ini (dan untuk hampir semua keputusan Anda tentang apa yang akan dibandingkan dalam langkah-langkah selanjutnya, hanya ada satu yang benar). Inilah cara mengatasinya. Pertama, perhatikan bahwa ada kemungkinan jawaban yang bisa Anda dapatkan untuk perbandingan, dan 5 ! = 120 permutasi berbeda yang perlu Anda bedakan.27=1285!=120

Perbandingan pertama itu mudah: Anda harus membandingkan dua kunci, dan karena Anda tidak tahu apa-apa tentang itu, semua pilihan sama baiknya. Jadi katakanlah Anda membandingkan dan b , dan menemukan bahwa sebuah b . Anda sekarang memiliki 2 6 = 64 kemungkinan jawaban tersisa, dan 60 kemungkinan permutasi tersisa (karena kami telah menghilangkan setengah dari mereka).abab26=6460

Selanjutnya, kita dapat membandingkan dan d , atau kita dapat membandingkan c dengan salah satu kunci yang kita gunakan dalam perbandingan pertama. Jika kita membandingkan c dan d , dan belajar itu c d , maka kita memiliki 32 jawaban yang tersisa dan 30 kemungkinan permutasi. Di sisi lain, jika kita membandingkan c dengan sebuah , dan kami menemukan bahwa sebuah c , kami memiliki 40 kemungkinan permutasi yang tersisa, karena kita telah dieliminasi 1 / 3 dari kemungkinan permutasi (orang-orang dengan c cdccdcd3230caac401/3 ). Kami hanya memiliki 32 kemungkinan jawaban yang tersisa, jadi kami kurang beruntung.cab32

Jadi sekarang kita tahu bahwa kita harus membandingkan kunci pertama dan kedua, dan kunci ketiga dan keempat. Kita bisa berasumsi bahwa kita memiliki dan c d . Jika kita membandingkan e ke salah satu dari empat tombol ini, dengan argumen yang sama kita gunakan pada langkah sebelumnya, kita mungkin hanya menghilangkan 1 / 3 dari permutasi yang tersisa, dan kami beruntung. Jadi kita harus membandingkan dua kunci a , b , c , d . Dengan mempertimbangkan simetri akun, kami memiliki dua pilihan, membandingkan a dan c atau membandingkan a dan dabcde1/3a,b,c,dacad. Argumen penghitungan serupa menunjukkan bahwa kita harus membandingkan dan c . Kita dapat mengasumsikan tanpa kehilangan umum bahwa sebuah c , dan sekarang kami memiliki sebuah b dan a c d .acacabacd

Karena Anda meminta petunjuk, saya tidak akan membahas seluruh argumen. Anda memiliki empat perbandingan tersisa. Gunakan dengan bijak.

Peter Shor
sumber
Bagaimana Anda mendapatkan bahwa membandingkan hingga c hanya membuat Anda turun ke 40 permutasi? ac
Robert S. Barnes
1
@ Robert: Misalkan Anda memiliki dan a c . Lalu ada dua permutasi dari a , b , c konsisten dengan kendala ini, a < b < c dan a < c < b . Untuk masing-masing dari dua permutasi ini, ada empat tempat yang dapat Anda tambahkan d dan lima tempat yang dapat Anda tambahkan e . abaca,b,ca<b<ca<c<bde
Peter Shor
8

Anda dapat menemukan ini di The Art of Computer Programming vol III, oleh D.Knuth, tetapi strateginya seperti ini (saya akan menganggap Anda memiliki array ): Jika Anda ingin petunjuk membaca hanya dua baris pertama jawaban saya{a,b,c,d,e}

  • Pasangan angka kelompok pertama: .(a,b),(c,d)
  • Bandingkan pasangan untuk mengurutkan mereka misalnya: .a<b,c<d
  • Bandingkan elemen terkecil dari pasangan, kita mendapatkan hasil misalnya .a<c
  • Bandingkan elemen terakhir , dengan elemen lebih besar dalam perbandingan terakhir ( c ) ec
    • Jika , mudah berakhir dengan 3 perbandingan tersisa. Jadi.e<c
    • Jika maka Anda harus mengurutkan { b , c , d , e } dengan pengetahuan c < e , c < d . e>c{b,c,d,e}c<e,c<d
      • , jika d < e maka Compare(d,e)d<e
        • , jika b > dCompare(b,d)b>d
          • . Jadi.Compare(b,e)
        • jika b<d
          • . Jadi.Compare(b,c)
      • jika d>e
        • jika b > eCompare(b,e)b>e
          • . Jadi.Compare(b,d)
        • jika b<e
          • . Jadi.Compare(b,c)

Semua cara yang disebutkan di atas menyebabkan paling banyak tiga perbandingan setelah perbandingan pertama dengan c . (Berarti paling banyak 7). ec

George
sumber
Apakah Anda yakin ini benar? Asumsikan Anda mendapatkan hasil berikut: a <b, c <d, a <c dan kemudian c <e, b <e, c <b dan d <e. Urutan a <c <b <d <e dan a <c <d <b <e keduanya konsisten dengan mereka. Alasannya adalah bahwa b dan d tidak pernah dibandingkan, secara implisit atau eksplisit. Mungkin saya salah di suatu tempat, kalau begitu tolong perbaiki saya.
George