Saya memiliki beberapa objek dengan prioritas yaitu tipe majemuk dan hanya dipesan sebagian . Saya perlu memilih objek dalam urutan prioritas ini (yaitu menghasilkan item minimal setiap kali). Tetapi alih-alih menyelesaikan pesanan secara sewenang-wenang, saya lebih suka jika antrian stabil dalam arti bahwa jika ada lebih dari satu elemen minimal, itu harus mengembalikan yang tertua terlebih dahulu.
Apakah ada struktur tumpukan data yang akan berfungsi dengan pemesanan parsial? Atau modifikasi antrian prioritas reguler untuk bekerja dengannya? Pilihan umum untuk algoritma yang saya butuhkan adalah tumpukan biner atau 4-ary sederhana, tetapi itu tidak bekerja dengan pemesanan parsial.
Nilai-nilai prioritas mendukung:
- sebuah ≼ b b ≼ sebuah sebuah ⋚ ̸ b
- Menemukan infima (glb) dan suprema (lub). adalah y maksimal sehingga y \ preccurlyeq x_i . Menghitung nilai maksimum n membutuhkan O (n) waktu. Jumlah maksimum (dan supremum) dari setiap perangkat ada.y y ≼ x i n O ( n )
- Ekstensi linear untuk pemesanan parsial dapat ditentukan. Menggunakannya untuk antrian prioritas adalah jalan keluar yang mudah karena algoritme berfungsi seperti itu. Tetapi urutan mempengaruhi kinerja dan urutan penyisipan sepertinya yang terbaik dalam menghindari kasus terburuk.
Selain itu algoritma yang ingin saya gunakan ini perlu mengetahui infinite dari semua prioritas dalam antrian.
Prioritas memiliki beberapa makna dunia nyata, tetapi dapat berubah, sehingga tampaknya tidak layak untuk mengandalkan properti lain yang bisa mereka miliki.
Catatan: Biner tumpukan tidak berfungsi dengan pemesanan parsial. Asumsikan tumpukan biner dengan , dan , di mana dan dan . Mereka diposisikan dalam urutan itu, jadi
a (0)
/ \
b (1) c (2)
sekarang d dimasukkan. Posisi bebas berikutnya adalah 3, anak kiri dari , jadi kita dapatkan
a (0)
/ \
b (1) c (2)
/
d (3)
Jika (yang menyiratkan dari transitivitas, tetapi tidak mengatakan apa-apa tentang dan ) dan , maka tidak ditukar dengan , karena tidak kurang. Tapi itu sebenarnya kurang dari , tapi itu tidak dibandingkan dengan itu, jadi sekarang invarian tumpukan utama tidak berlaku; top tidak minimal.d ≼ c d b d ⋚ ̸ b d b a
Saya curiga ada tumpukan hutan dengan gaya tumpukan binomial yang bisa digunakan untuk bekerja. Pada dasarnya, penting untuk selalu membandingkan nilai-nilai baru dengan root dan hanya menghubungkan elemen-elemen yang sebanding. Itu akan membuat pohon-pohon di hutan berukuran acak dan dengan demikian membuat kerumitan tergantung pada jumlah set yang tak tertandingi di tumpukan. Saya agak curiga kerumitan tidak dapat diperbaiki (kita harus terus membandingkan sampai kita mencapai elemen yang sebanding) Saya mungkin telah melewatkan sesuatu, jadi saya membiarkan ini terbuka.
Catatan: Pemesanan sebagian dan meskipun ada cara untuk menentukan ekstensi linier untuk itu, menambahkan cap waktu dan menggunakannya sebagai kriteria sekunder bukan salah satunya. Misalkan kita menetapkan timestamp untuk masing-masing dan mendefinisikan urutan sebagai iff atau ( dan . Maka anggaplah kita memiliki berbeda , , , sehingga dan . Kemudian dansuatu ≼ ' a ≼ ' b a ≼ b b ⋠ sebuah t ( a ) ≤ t ( b ) a b c t ( a ) ≤ t ( b ) ≤ t ( c ) c ≤ a a ≼ ' b b ≼ ′ c c ≼ ′ a , tetapi , jadi relasinya tidak transitif dan karenanya bukan urutan sama sekali. Perpanjangan seperti ini hanya berfungsi untuk pesanan yang lemah, tetapi tidak untuk sebagian.
Sunting: Saya menyadari bahwa tidak hanya jumlah maksimum dari setiap set yang ditentukan, tetapi saya benar-benar harus dapat memperoleh elemen maksimum saat ini dalam antrian secara efisien. Jadi saya sekarang merenungkan apakah menambahkan node khusus yang mengandung infima subtree ke beberapa struktur heap umum akan membantu.
sumber
Jawaban:
Meskipun masalah yang diajukan dalam pertanyaan awal tampaknya sulit (dan saya akan tertarik pada solusi untuk masalah itu, terutama bagian penemuan infima). Saya hanya ingin mencatat bahwa jika set yang dipesan sebagian memang terdiri dari vektor menggunakan pesanan produk, dan jika itu cukup untuk hanya memiliki jaminan bahwa antrian prioritas mengembalikan nilai dalam urutan yang "kompatibel" dengan pesanan parsial ( artinya, elemen yang lebih kecil selalu dikembalikan sebelum elemen yang lebih besar), maka ada cara yang cukup mudah untuk melakukannya.
Idenya pada dasarnya adalah untuk menemukan pemesanan topologi dari set yang dipesan sebagian. Yaitu, total order ' ' sedemikian rupa sehingga . Untuk vektor yang menggunakan pesanan produk, ini cukup mudah: cukup gunakan urutan leksikografis ' ', di mana "komponen" pertama adalah jumlah semua komponen yang digunakan untuk pesanan produk (sisa komponen pada dasarnya sewenang-wenang, jadi Anda juga bisa tetap berpegang pada urutan yang lemah). Kita kemudian dapat melihat bahwa dan a ≤ b≤T ≤ S a < ba≤b⟹a≤Tb ≤S a = b
sumber
Apa yang salah dengan membuat pemesanan parsial Anda selesai?
Jika Anda lebih suka 'tertua dulu', maka pesanan Anda secara efektif selesai; item 'tak tertandingi' sebanding dengan usia.
Tambahkan stempel waktu (atau bilangan bulat lain yang tumbuh secara monoton) ke setiap item dan gunakan jika perbandingan 'nyata' tidak mungkin.
sumber
EDIT: ini tampaknya menjadi masalah yang menarik, dan saya punya sedikit riset tentang itu. Saya sarankan Anda membaca yang berikut:
Saya sarankan Anda membaca makalah ini: Daskalakis, Constantinos, et al. "Penyortiran dan seleksi dalam poset." Jurnal SIAM tentang Komputasi 40.3 (2011): 597-622.
Di sini penulis menyajikan struktur data yang disebut ChainMerge yang menerima poset dan dekomposisi rantai poset ke dalam rantai . Ukuran struktur data adalah O ( n q ) . Para penulis menyajikan algoritma untuk menemukan minimas yang berjalan di O ( w n ) di mana w adalah batas atas pada lebar poset. .. Saya pikir mungkin ini menarik.q O(nq) O(wn) w
Catatan: Saya menghapus jawaban naif sebelumnya. Silakan klik edit untuk melihatnya.
sumber
Penggunaan terminologi saya mungkin salah. Harap edit jawaban saya langsung untuk memperbaiki masalah yang Anda temukan.
Pertama, perangkat yang tidak dapat dibandingkan harus dideteksi dari input.
Misalnya, mungkin ada 5 objek
a, b, c, d, e
,, tetapi urutan parsialnya membentuk dua grafik yang terputus:a ≤ b ≤ c
d ≤ e
{a, b, c}
tidak ada bandingannya dengan{d, e}
.Set yang tidak tertandingi ini perlu dideteksi terlebih dahulu, sebelum objek dapat disimpan ke dalam struktur data yang sesuai. Ini dapat dilakukan dengan algoritma Union find
Untuk efisiensi, penyisipan objek baru perlu memiliki cara yang efisien untuk menemukan "daftar objek yang ada yang dapat dibandingkan dengan objek baru ini".
Sekarang, dalam setiap subset (masing
{a, b, c}
- masing dan{d, e}
), minimum harus didefinisikan dengan baik. (Untuk setiap subset mungkin ada satu atau lebih minimal, karena pemesanan parsial.)Saya melihat ini sebagai grafik asiklik terarah . Mencoba memasukkannya ke dalam tumpukan sepertinya merupakan bencana.
Untuk mengekstrak minima dari struktur data komposit ini, langkah selanjutnya adalah mendapatkan daftar semua minima dari semua himpunan bagian, pilih yang dengan cap waktu paling awal, dan hapus dan kembalikan objek ini.
sumber
Sebuah proyek yang sedang saya kerjakan melibatkan masalah yang sama (kebetulan saya juga menggunakan urutan sebagian vektor). Kami sudah memiliki algoritma waktu kuadrat untuk mengurutkan daftar yang diurutkan secara acak, dan saya mengembangkan algoritma penyisipan dengan mengamati perilakunya ketika hanya satu objek yang rusak. Kami tidak tahu apakah ini adalah implementasi secepat mungkin.
Inilah beberapa kodesemu.
sumber
Perilaku tumpukan biasa adalah menambahkan nilai baru ke belakang, dan kemudian menyaring sementara itu membandingkan lebih besar dari induknya.
Jika Anda menulis perbandingan yang mengembalikan yang sama untuk orang tua dan anak bukan kasus yang sebanding karena untuk orang tua lebih besar dari anak , pengayakan harus tetap berakhir pada titik yang tepat.
Apakah itu dianggap sebagai pemesanan yang cukup stabil untuk keperluan Anda?
Untuk memperjelas, ambil contoh dari komentar Anda: a> b , dan c tidak dapat dibandingkan dengan a atau b :
jadi, hasilnya tergantung pada urutan penyisipan - ini tampaknya cocok dengan yang Anda minta, tapi saya tidak yakin apakah itu benar-benar yang Anda inginkan. Jika tidak, bisakah Anda menunjukkan hasil yang ingin Anda lihat?
OK, jadi dari komentar Anda (dan edit untuk pertanyaan Anda), Anda ingin elemen "sebanding" melompati elemen "tidak sebanding" dan menemukan tempat yang tepat di bawah pemesanan, jika ada. Saya bertanya tentang ini karena saya tidak yakin bagaimana menafsirkannya
(d dan b secara berpasangan tak tertandingi dalam pengeditan Anda, tetapi Anda tidak menginginkannya dalam urutan yang dimasukkan).
Pertanyaan saya berikutnya adalah tentang hubungan antara elemen "sebanding" dan "tidak sebanding", tetapi saya melihat Anda telah mengungkapkan sekarang bahwa mereka adalah vektor dalam urutan produk (tidak jelas apakah beberapa elemen berpasangan- tidak sebanding dengan segalanya , seperti NaN, atau apa).
Jadi, jika saya mengambil contoh baru Anda dan menetapkan nilai vektor, apakah benar bahwa ini adalah contoh di mana b tidak dapat dibandingkan dengan yang lain:
dan itu harus diurutkan ke ini:
?
sumber