Saya mencari struktur data persisten yang mirip dengan array (tetapi tidak bisa diubah), memungkinkan untuk pengindeksan cepat, menambahkan, prepend, dan operasi iterasi (good locality) operasi.
Clojure menyediakan vektor persisten, tetapi hanya untuk penambahan cepat. Scala's Vector secara efektif menambahkan dan menambah waktu, tetapi saya tidak dapat menerapkannya, karena ini didasarkan pada struktur data yang sama (bit-mapped vector trie) seperti vektor Clojure, dan, seperti yang saya mengerti, bit-mapped vector trie tidak dapat memiliki cepat cepat tanpa beberapa trik.
Saya tertarik bukan pada implementasi siap pakai tetapi pada deskripsi bagaimana mengimplementasikan struktur data sendiri.
Saya telah menggambarkan satu implementasi dari struktur data seperti itu dalam artikel saya tentang pencocokan ekspresi reguler tambahan - lihat http://jkff.info/articles/ire/#ropes-strings-with-fast-concatenation dan teks di bawah dan di atas bagian itu .
Beragam pohon dengan tinggi konstan (seperti pohon B atau 2-3 pohon). Pada dasarnya itu adalah pohon (2,3), yang daunnya (N, 2N-1) array, untuk menghindari overhead per-elemen. (A (N, 2N-1) array adalah array yang panjangnya di kisaran N..2N-1.) Lebih besar N memberi Anda overhead yang lebih kecil tetapi secara linear meningkatkan kompleksitas pemisahan dan penggabungan. Operasi seperti pengindeksan, pemisahan dan penggabungan sangat mirip dengan cara mereka bekerja di 2-3 pohon, generalisasi ke (N, 2N-1) di tingkat daun.
sumber