Saya mencari implementasi .NET dari antrian prioritas atau struktur data tumpukan
Antrian prioritas adalah struktur data yang memberikan lebih banyak fleksibilitas daripada penyortiran sederhana, karena mereka memungkinkan elemen baru untuk memasuki sistem pada interval sewenang-wenang. Jauh lebih hemat biaya untuk memasukkan pekerjaan baru ke dalam antrian prioritas daripada mengurutkan kembali segala sesuatu pada setiap kedatangan tersebut.
Antrian prioritas dasar mendukung tiga operasi utama:
- Sisipkan (Q, x). Diberikan item x dengan kunci k, masukkan ke dalam antrian prioritas Q.
- Cari-Minimum (Q). Kembalikan pointer ke item yang nilai kuncinya lebih kecil dari kunci lainnya di antrian prioritas Q.
- Hapus-Minimum (Q). Hapus item dari antrian prioritas Q yang kuncinya minimum
Kecuali saya mencari di tempat yang salah, tidak ada satu pun di kerangka itu. Adakah yang tahu yang bagus, atau haruskah saya menggulung sendiri?
c#
.net
data-structures
heap
priority-queue
Doug McClean
sumber
sumber
Jawaban:
Saya suka menggunakan
OrderedBag
danOrderedSet
kelas di PowerCollections sebagai antrian prioritas.sumber
Anda mungkin menyukai IntervalHeap dari Perpustakaan Koleksi Generik C5 . Mengutip panduan pengguna
APInya cukup sederhana
Instal dari Nuget https://www.nuget.org/packages/C5 atau GitHub https://github.com/sestoft/C5/
sumber
Inilah upaya saya di tumpukan NET
Beberapa tes:
sumber
IEqualityComparer<T>
tidak akan cukup, karena itu hanya akan memberi tahu Anda apakah dua item sama, sedangkan Anda perlu tahu hubungan di antara mereka (siapa yang lebih kecil / lebih besar). Memang benar bahwa saya bisa menggunakanIComparer<T>
...inilah yang baru saja saya tulis, mungkin itu tidak dioptimalkan (hanya menggunakan kamus yang diurutkan) tetapi mudah dimengerti. Anda dapat memasukkan objek dari berbagai jenis, sehingga tidak ada antrian umum.
sumber
Saya menemukan satu oleh Julian Bucknall di blognya di sini - http://www.boyet.com/Articles/PriorityQueueCSharp3.html
Kami memodifikasinya sedikit sehingga item prioritas rendah pada antrian pada akhirnya akan 'melambung' ke atas seiring waktu, sehingga mereka tidak akan menderita kelaparan.
sumber
Seperti disebutkan dalam Microsoft Collections for .NET , Microsoft telah menulis (dan berbagi secara online) 2 kelas PriorityQueue internal dalam .NET Framework. Kode mereka tersedia untuk dicoba.
EDIT: Seperti yang dikomentari @ mathusum-mut, ada bug di salah satu kelas PriorityQueue internal Microsoft (tentu saja, komunitas SO telah menyediakan perbaikan untuknya): Bug di internal PriorityQueue <T>?
sumber
PriorityQueue<T>
dalam sumber bersama Microsoft ditandai dengan penentuinternal
akses. Jadi mereka hanya digunakan oleh fungsi internal kerangka kerja. Mereka tidak tersedia untuk konsumsi umum hanya dengan merujukwindowsbase.dll
pada proyek C #. Satu-satunya cara adalah menyalin sumber bersama ke proyek itu sendiri di dalam file kelas.Anda mungkin menemukan implementasi ini berguna: http://www.codeproject.com/Articles/126751/Priority-queue-in-Csharp-with-help-of-heap-data-st.aspx
itu generik dan berdasarkan pada tumpukan data
sumber
mudah.
sumber
for (var n2 = n / 2; n > 0 && comparer.Compare(v, heap[n2]) > 0; n = n2, n2 /= 2) heap[n] = heap[n2];
dan bertanya-tanya apakah itu layak satu lapisanGunakan penerjemah Java to C # pada implementasi Java (java.util.PriorityQueue) dalam kerangka Java Collections, atau lebih cerdas gunakan algoritme dan kode inti dan hubungkan ke kelas C # buatan Anda sendiri yang menganut kerangka kerja C # Collections API untuk Antrian, atau setidaknya Koleksi.
sumber
AlgoKit
Saya menulis perpustakaan open source bernama AlgoKit , tersedia melalui NuGet . Itu mengandung:
Kode telah diuji secara luas. Saya merekomendasikan Anda untuk mencobanya.
Contoh
Mengapa tiga tumpukan itu?
Pilihan implementasi yang optimal sangat bergantung pada input - seperti yang ditunjukkan Larkin, Sen, dan Tarjan dalam studi empiris back-to-basics tentang antrian prioritas , arXiv: 1403.0252v1 [cs.DS] . Mereka menguji tumpukan d-ary implisit, tumpukan pairing, tumpukan Fibonacci, tumpukan binomial, tumpukan d-ary eksplisit, tumpukan peringkat-pasangan, tumpukan gempa, tumpukan pelanggaran, tumpukan lemah santai-peringkat, dan tumpukan Fibonacci ketat.
AlgoKit menampilkan tiga jenis tumpukan yang tampaknya paling efisien di antara yang diuji.
Petunjuk pilihan
Untuk sejumlah kecil elemen, Anda mungkin akan tertarik menggunakan tumpukan implisit, terutama tumpukan kuaterner (implisit 4-ary). Dalam hal beroperasi pada ukuran tumpukan yang lebih besar, struktur yang diamortisasi seperti tumpukan binomial dan tumpukan pasangan harus bekerja lebih baik.
sumber
Berikut ini adalah implementasi lain dari tim NGenerics:
NGenerics PriorityQueue
sumber
Saya memiliki masalah yang sama baru-baru ini dan akhirnya membuat paket NuGet untuk ini.
Ini mengimplementasikan antrian prioritas berbasis heap standar. Ia juga memiliki semua koleksi BCL yang biasa:
ICollection<T>
danIReadOnlyCollection<T>
implementasi,IComparer<T>
dukungan khusus , kemampuan untuk menentukan kapasitas awal, danDebuggerTypeProxy
untuk membuat koleksi lebih mudah untuk digunakan dalam debugger.Ada juga versi Inline dari paket yang hanya menginstal file .cs tunggal ke proyek Anda (berguna jika Anda ingin menghindari mengambil dependensi yang terlihat secara eksternal).
Informasi lebih lanjut tersedia di halaman github .
sumber
Implementasi Max Heap Sederhana.
https://github.com/bharathkumarms/AlgorithmsMadeEasy/blob/master/AlgorithmsMadeEasy/MaxHeap.cs
sumber
Implementasi
PriorityQueue
penggunaan berikutSortedSet
dari perpustakaan Sistem.sumber
T x
danK key
? Saya menduga ini adalah trik untuk memungkinkan duplikatT x
, dan saya perlu membuat kunci unik (misalnya UUID)?