{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# BitSets en OCaml\n", "\n", "Let *BitSets* sont une implémentation efficace pour représenter, stocker et manipuler des ensembles de *petits* entiers.\n", "\n", "Avec un seul entier 32 bits, on peut représenter *tous* les ensembles d'entiers de $\\{0,\\dots,31\\}$.\n", "\n", "On utilise les [opérations bit à bit (\"bitwise\")](caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin_int) de OCaml pour effectuer les opérations de base sur les ensembles.\n", "\n", "Cette implémentation est inspiré de [celle ci](http://ocaml-lib.sourceforge.net/doc/BitSet.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Type abstrait\n", "Je vais faire ça à l'arrache, mais on pourrait faire soit un module qui contient un type interne (caché), soit avec un champ d'enregistrement `{ n : int }`.\n", "\n", "Cette approche est la plus simple, mais montre un peu le fonctionnement interne (on pourrait vouloir l'éviter)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "type bit_set_32 = int;;" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "let max_size_bit_set_32 = 32;;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Avec [Int64](http://caml.inria.fr/pub/docs/manual-ocaml/libref/Int64.html) on pourrait faire la même chose avec des entiers sur 64 bits. La flemme." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## Implémentation\n", "Les ensembles ne seront pas mutables dynamiquement : comme une liste, toute fonction qui modifie un `bit_set_32` renvoit un nouveau `bit_set_32`." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "let empty () : bit_set_32 = 0\n", ";;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le singleton $\\{i\\}$ est codé comme $2^i$ donc $1$ au bit en $i$ème position.\n", "En Python, c'est `1 << i` (ou `2**i`), et en OCaml c'est `1 lsl i`." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "val create : int -> bit_set_32 =