読者です 読者をやめる 読者になる 読者になる

Javaで簡潔ビットベクトル(36)

Java

細かい改善ですが、シリアライズ可能にしました。
これで、簡潔ビットベクトルをファイルに保存することができます。
以下からダウンロードできます。

https://code.google.com/p/sbvj/

TRIEやウェーブレット木やFM-Indexで使おうと思うとファイルに保存したいと思うので、そのような場合に使えると思います。ただ、しばらくはフォーマットを予告なく変えるというエンタープライズではあり得ないやり方をするので、ご容赦願います。その場合は、作り直してください。

以下のように使えます。

    @Test
    public void test001() throws SuccinctBitVectorException {
        
        String fileName = "SimpleSBVData";
        
        long sbvSize = 1000000;
        
        SuccinctBitVector sbv1 = new SuccinctBitVector(sbvSize);
        
        for ( long pos = 0; pos < sbvSize; pos++ ) {
            if ( 0 == (pos % 2) ) {
                sbv1.setBit(pos, 1);
            }
        }
        
        sbv1.build(BuildType.SIMPLE);
        
        SuccinctBitVectorData sbvData1 = sbv1.getData();
        
        File file = new File(fileName);
        
        try {
            FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(sbvData1);
            oos.close();
        } catch (Exception e) {
            fail("エラー");
        }
        
        SuccinctBitVectorData sbvData2 = null;
        
        try {
            FileInputStream fis = new FileInputStream(file);
            ObjectInputStream ois = new ObjectInputStream(fis);
            sbvData2 = (SuccinctBitVectorData) ois.readObject();
            ois.close();
        } catch (Exception e) {
            fail("エラー");
        }
        
        assert( null != sbvData2 );
        
        SuccinctBitVector sbv2 = new SuccinctBitVector(sbvData2);
        
        // get
        for ( long pos = 0; pos < sbvSize; pos++ ) {
            int bit1 = sbv1.getBit(pos);
            int bit2 = sbv2.getBit(pos);
            assertThat( bit1, is(bit2) );
        }
        
        // rank
        for ( long pos = 0; pos < sbvSize; pos++ ) {
            long rank1 = sbv1.getRank(pos, 1);
            long rank2 = sbv2.getRank(pos, 1);
            assertThat( rank1, is(rank2) );
        }
        
        // select
        for ( long num = 0; num < sbv1.getBitVectorOneNum(); num++ ) {
            long select1 = sbv1.getSelect(num, 1);
            long select2 = sbv2.getSelect(num, 1);
            assertThat( select1, is(select2) );
        }
        
    }