java 位向量

public class BitVectory {
    private int count;
    private int[] a;
    private static final int BIT_LEN = 32;
    private static final int MASK = 0x1f; //16禁止表示 10进制31
    private static final int SHIFT = 5;

    public BitVectory(int count) {
        this.count = count;
        init(count);
    }

    private void init(int count) {
        a = new int[(count - 1) / BIT_LEN + 1];
        for (int i = 0; i < count; i++) {
            clear(i);
        }
    }

    private void clear(int i) {
        a[i >> SHIFT] &= ~ (1 << (i & MASK));
    }

    //
    public void set(int i) {
        a[i >> SHIFT] |= (1 << (i & MASK));
    }

    public List<Integer> getSortedArray() {
        List<Integer> list = new ArrayList<>();
        StringBuilder s = new StringBuilder();
        for (int i = 0; i < count; i++) {
            s.append(get(i));
            if (get(i) == 1) {
                list.add(i);
            }
        }
        System.out.println(s.toString());
        return list;
    }

    private int get(int i) {
        return Integer.bitCount(a[i >> SHIFT] & (1 << (i & MASK)));
    }

    public static void main(String[] args) {
        BitVectory bitVectory = new BitVectory(38);

        List<Integer> list = new ArrayList<>(38);
        for (int i = 0; i < 38; i++) {
            list.add((int) (Math.random() * 36));
        }

        list.forEach(e -> {
            bitVectory.set(e);
        });

        List<Integer> sortedArray = bitVectory.getSortedArray();
        System.out.println(sortedArray.size() + "\t" + sortedArray);
        System.out.println(Integer.toBinaryString(bitVectory.a[0]));
        System.out.println(bitVectory.a.length);
        System.out.println(Arrays.toString(bitVectory.a));
    }

}

利用位向量对 0-N的数据进行排序 N / mask + 1个数组a来表示这些数

原文地址:https://www.cnblogs.com/lijiale/p/8502672.html

时间: 2024-11-09 10:30:49

java 位向量的相关文章

Java BitSet使用场景和示例

一.什么是BitSet? 注:以下内容来自JDK API: BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个boolean值.用非负的整数将BitSet的位编入索引.可以对每个编入索引的位进行测试.设置或者清除.通过逻辑与.逻辑或和逻辑异或操作,可以使用一个 BitSet修改另一个 BitSet的内容. 默认情况下,set 中所有位的初始值都是false. 每个位 set 都有一个当前大小,也就是该位 set 当前所用空间的位数.注意,这个大小与位 set 的实现有关,所以

20145229吴姗珊《Java程序设计》第二周学习总结

教材学习内容总结 一.类型.变量与运算符 1.类型 整数:可细分为short整数.int整数和long整数.不同长度的整数可储存的整数范围也不同. 字节:byte类型顾名思义.长度就是一字节,需要逐字节处理数据时则需要使用.用于整数时,可表示-128~127的整数. 浮点数:主要用来储存小数数值,主要分为float和double. 字符:char类型用来储存‘A','B','林'等字符符号. 布尔:boolean类型可表示true和false,分别表示真和假. 2.变量 基本规则:用关键词来声明

(部分转载,部分原创) java大数类(1)

头文件: import java.io.*; import java.util.*; import java.math.*; BigInteger属于java.math.BigInteger 读入:  Scanner cin = Scanner (System.in); while(cin.hasNext())//等价于!=EOF n=cin.nextInt(x);//读入一个int型x进制的数,一般x缺省,默认十进制 n=cin.nextBigInteger(x);//读入一个x进制的大整数,

java语法糖

语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用了.这些语法糖虽然不会提供实质性的功能改进,但是它们或能提高性能.或能提升语法的严谨性.或能减少编码出错的机会.Java提供给了用户大量的语法糖,比如泛型.自动装箱.自动拆箱.foreach循环.变长参数.内部类.枚举类.断言(assert)等 断言(as

Code Review:C#与JAVA的哈希表内部机制的一些区别

看C#与JAVA源码时发现C#与JAVA哈希表的实现略有不同,特此分享一下. 我觉得看哈希表的机制可以从"碰撞"这里划线分为两部分来分析. 1,发生碰撞前 在发生碰撞前决定get与put的速度唯一因素是通过哈希函数计算键值位置的速度.而占用空间大小取决于需要的桶的数量(取决于极限装载值(load factor)(假设已知需要放入哈希表中元素的数量)),和桶的大小. C#的默认装载系数=0.72 // Based on perf work, .72 is the optimal load

20145320 《Java程序设计》第2周学习总结

20145320 <Java程序设计>第2周学习总结 教材学习内容总结 3.1 类型.变量与运算符 基本类型 整数(short.int.long) .字节(byte) .浮点数(float/double) .字符(char):汉字.英文字符都是双字节的 布尔(boolean):boolean类型中的true/false不能与其他类型进行运算 注释 三种注释 //:单行./** /:多行./** */:javadoc文档注释 常量 整数可以用二进制(0bdddd),八进制(0ddd).十进制(d

布尔运算--java位图搜索实现

前言 布尔运算是伟大的布尔发明的代数运算,只有简单的逻辑与或非,一开始人们没发现没啥用,后来对计算机的影响太大了,从基础设施到搜索引擎无处不在. 场景 身为码农,在日常工作中,我也遇到了涉及它的需求.场景是这样的,我们的后台服务有一个复杂的配置,涉及到对用户多个维度的匹配,因为变化不会很频繁, 每次都查询数据库显然不划算,数据量也不是太多,不到万的级别,人配置的嘛.    这样很自然的,缓存到服务器的内存吧,但是总不能蛮力的一个个匹配吧,也太啰嗦,效率也会很低,而且逻辑判断会有点复杂,配置主要是

【读书笔记】《编程珠玑》第一章之位向量&amp;位图

此书的叙述模式是借由一个具体问题来引出的一系列算法,数据结构等等方面的技巧性策略.共分三篇,基础,性能,应用.每篇涵盖数章,章内案例都非常切实棘手,解说也生动有趣. 自个呢也是头一次接触编程技巧类的书籍,而且算法数据结构方面的知识储备实在是薄弱,这么看来,纯粹找虐啊orz.今此行为,歇业养伤,实属无聊.也可说是自打毕业后,看书如打仗,自视身处"安安稳稳的和平年代",闲来了也就闲着,忧患意识甚少,有也退退缩缩.话说回来,这本书不像CLRS那种难打的硬仗(现在想想都脑仁疼啊),<Pr

Java中BitSet使用(转)

java.util.BitSet,采用位运算: 官方API:http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html 摘要: BitSet的使用场景及简单示例,可用于在JAVA程序中实现unqiue功能. BitSet简介 类实现了一个按需增长的位向量.位 set 的每个组件都有一个boolean值.用非负的整数将BitSet的位编入索引.可以对每个编入索引的位进行测试.设置或者清除.通过逻辑与.逻辑或和逻辑异或操作,可以使用一