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.


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 nlog⁡n 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). 2c≥n!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).aba≤b26=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 ≤cdccdc≤d3230caa≤c401/3 ). Kami hanya memiliki 32 kemungkinan jawaban yang tersisa, jadi kami kurang beruntung.c≤a≤b32

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 da≤bc≤de1/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 .aca≤ca≤ba≤c≤d

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


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 . a≤ba≤ca,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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.