#algorithm #vector #bit #bitset
#алгоритм #вектор #бит #набор битов
Вопрос:
Есть ли какой-нибудь хороший текст, книги, pdf или веб-сайт, который объясняет, как реализовать битовый вектор, особенно на Java?
Я задаю этот вопрос, потому что хотел бы создать свою собственную реализацию набора битов на Java. Причина в том, что я хочу добавить дополнительные функции и настройки, которые невозможно выполнить, если я изменю Java-класс BitSet из java.util. Более того, я хочу создать свою собственную реализацию, чтобы я мог использовать ее в своем проекте с открытым исходным кодом без необходимости иметь дело с лицензиями.
Спасибо!
Комментарии:
1. Apache Mahout имеет набор битов с открытым исходным кодом.
2. почему не использовать другие наборы битов и просто наследовать их?
Ответ №1:
Если вам нужна необычная производительность или другие необычные функции для вашего битового вектора или набора битов, то, как кто-то уже предлагал, вы должны наследовать существующую реализацию битового вектора / набора. Или вы можете обратиться к некоторым реализациям с открытым исходным кодом. Однако, если вы хотите изучить механизм битового вектора, это довольно просто. Вот реализация в качестве примера:
class BitSet{
private Byte[] p;
private BitSet(){
p = null;
}
public BitSet(int n){
assert n > 0;
p = new Byte[(n - 1) >> 3 1];
}
public BitSet Complement(){
BitSet bs = new BitSet();
bs.p = new Byte[p.length];
for(int i = 0; i < p.length; i ){
bs.p[i] = ~ p[i];
}
return bs;
}
public BitSet Union(BitSet bs2){
assert p.length == bs2.p.length;
BitSet bs = new BitSet();
bs.p = new Byte[p.length];
for(int i = 0; i < p.length; i ){
bs.p[i] = p[i] | bs2.p[i];
}
return bs;
}
public BitSet Intersection(BitSet bs2){
assert p.length == bs2.p.length;
BitSet bs = new BitSet();
bs.p = new Byte[p.length];
for(int i = 0; i < p.length; i ){
bs.p[i] = p[i] amp; bs2.p[i];
}
return bs;
}
}
Вы можете реализовать и добавить свои собственные функции настройки параметров в приведенный выше пример.
Ответ №2:
Быстрая реализация для вашего требования. Надеюсь, это поможет.
public class BitSet
{
int[] numbers;
public BitSet(int k){
numbers = new int[(k >> 5) 1];
}
public void set(int k)
{
int remender = k amp; 0x1F;
int devide = k >> 5;
result[devide] = result[devide] | (1<<remender);
}
public void unset(int k)
{
int remender = k amp; 0x1F;
int devide = k >> 5;
result[devide] = result[devide] amp; (~(1<<remender));
}
public boolean isSet(int k)
{
int remender = k amp; 0x1F;
int devide = k >> 5;
return (result[devide] amp; (1<<remender))!=0;
}
}
Комментарии:
1. где инициализируется ваш результат