Apa itu algoritma pengurutan kasus khusus?

13

Saya memiliki dataset yang merupakan sejumlah objek yang disusun dalam kotak 2-D. Saya tahu saya memiliki urutan ketat, meningkat saat Anda bergerak dari kiri ke kanan di setiap baris, dan meningkat dari atas ke bawah dalam setiap kolom. Sebagai contoh,

  • 1 2 3
  • 4 6 7
  • 5 8 9

Bisakah saya meningkatkan penyortiran naif untuk mengurutkan seluruh dataset secara linier (sebagaimana diukur dalam perbandingan)?

Bagaimana dengan set data nd? Dataset terbatas sewenang-wenang dengan subset perbandingan yang diketahui?

Zachary Vance
sumber
1
Bisakah Anda mengajukan pertanyaan yang lebih tepat? Paragraf pertama Anda dapat dibaca yang menyiratkan bahwa data Anda sudah diurutkan! Apa sebenarnya input Anda, dan output apa yang Anda inginkan?
Jacques Carette
1
Ya, bahasanya agak membingungkan. Butuh beberapa waktu untuk menyadari bahwa set data terdiri dari n angka yang akan diurutkan tetapi angka-angka ini disusun dalam kotak sqrt (n) x sqrt (n) sehingga setiap baris dan setiap kolom sudah diurutkan. Apakah itu yang kamu maksud?
Ya, itulah yang saya maksud. Saya akan mengedit untuk kejelasan.
Zachary Vance

Jawaban:

19

Sangat mudah untuk membuktikan Ω (n 2 log n) dengan batas bawah pada masalah ini (dalam model pengurutan perbandingan): jika elemen pada posisi (i, j) selalu dalam jarak 1/2 dari i + j, maka grid diagonal tidak saling tergantung satu sama lain, dan urutan yang diurutkan dalam setiap kisi diagonal adalah arbitrer. Jadi di bawah batasan ini, jumlah total pemesanan yang mungkin adalah produk (di atas semua diagonal grid) dari faktorial dari panjang diagonal, yang eksponensial dalam n 2 log n.

Yang mengatakan bahwa algoritma pengurutan perbandingan standar optimal asimtotik untuk kisi-kisi yang dipesan seperti yang Anda gambarkan.

David Eppstein
sumber
Jawaban lain memberikan algoritma eksplisit dengan kompleksitas ini, jadi saya akan mempertimbangkan masalah ini diselesaikan untuk grid 2-D dan, tanpa benar-benar memeriksa, mungkin untuk grid dimensi sewenang-wenang.
Zachary Vance
4

Jika saya memahami masalahnya dengan benar (dan saya mungkin tidak, jangan ragu untuk memberi tahu saya jika saya tidak) Anda ingin mengubah grid 2D menjadi array 1D yang diurutkan, sedangkan setiap baris dan kolom sudah diurutkan dalam grid 2D?

Elemen pertama dalam daftar dalam kasus ini harus sudut kiri atas ((0,0), dengan definisi masalah). Setelah ini, ia harus menjadi elemen (1,0) atau (0,1), karena semua yang lain akan lebih besar dari ini menurut definisi.

Anda dapat menggeneralisasi dengan mengatakan bahwa elemen terkecil berikutnya dalam kisi selalu langsung di bawah elemen yang sudah digunakan (atau tepi kisi), dan juga di sebelah kanan elemen yang sudah digunakan (atau tepi kisi), karena keduanya didefinisikan lebih kecil dari itu. Jadi pada setiap iterasi Anda hanya harus mempertimbangkan nilai terkecil yang memenuhi persyaratan ini.

Anda dapat menyimpan kandidat yang mungkin dalam urutan diurutkan saat Anda menemukannya (tidak lebih dari dua akan tersedia dalam satu iterasi), dan pada setiap iterasi periksa nilai-nilai baru yang disediakan (jika ada). Jika mereka lebih rendah dari yang terendah dari kandidat sebelumnya, tambahkan langsung ke daftar dan ulangi, jika tidak tambahkan kandidat sebelumnya yang terendah dan bandingkan dengan yang terendah berikutnya dll.

Sayangnya saya tidak mengklaim dapat memberikan kompleksitas yang tepat dari ini, saya juga tidak mengklaim itu adalah yang paling efisien, itu tampaknya lebih baik daripada pendekatan naif, dan saya harap saya menjelaskannya dengan cukup baik untuk Anda mengerti.

EDIT: Untuk grid nd seperti ini saya percaya prinsip dasar yang sama berlaku, tetapi setiap iterasi membuat hingga n kandidat baru yang tersedia, dan kandidat ini harus menjadi elemen terkecil yang tidak digunakan dalam setiap n dimensi pada saat ini.

Paul
sumber
Singkatnya, Anda dapat melakukan gabungan jalan sqrt (N), seperti di mergesort? Itu adalah metode terbaik saya, tetapi ternyata menjadi O (N log N) - Saya tidak memiliki konstanta yang pasti di sana, tetapi setidaknya ada 0,5 untuk log (sqrt (N)).
Zachary Vance