您现在的位置是:主页 > news > 在那个网站做直播好赚钱/适合seo优化的网站

在那个网站做直播好赚钱/适合seo优化的网站

admin2025/6/2 3:53:19news

简介在那个网站做直播好赚钱,适合seo优化的网站,网站免费主机申请,旅游网站开发需求在数据结构中,位图肯定是占有一席之地的。位图的优点在于节约内存。比如说一个字段的取值,可能只有少数几种,那么就可以只用几位二进制来表示,这样可以将多个字段压缩在一个字段内进行存储。实际开发中,图片、视频、音…

在那个网站做直播好赚钱,适合seo优化的网站,网站免费主机申请,旅游网站开发需求在数据结构中,位图肯定是占有一席之地的。位图的优点在于节约内存。比如说一个字段的取值,可能只有少数几种,那么就可以只用几位二进制来表示,这样可以将多个字段压缩在一个字段内进行存储。实际开发中,图片、视频、音…

  在数据结构中,位图肯定是占有一席之地的。位图的优点在于节约内存。比如说一个字段的取值,可能只有少数几种,那么就可以只用几位二进制来表示,这样可以将多个字段压缩在一个字段内进行存储。实际开发中,图片、视频、音频等大容量信息都是用位图这种数据结构存储的。
  本文不会讲所有的位图算法,用典型的位集Bitset来讲。因为有和无只有两种情况,所以一位的0和1表示就够了。而Bitset就是用1为的0和1表示有和无的数据结构。
  位集也可以用来解决算法问题,最明显的例子是子集合问题,这个问题我在数学算法专栏里讲过,这里就简单给个链接吧。
  位集解决子集合问题
  在Jdk中有这么一个类EnumSet就是位集的最好例子。Java中的枚举,一个重要的特性是实例的总个数是固定的。比如性别,只有男女两种,再没更多了。再比如星期,只有星期一到星期天七种。那么用一个集合,来表示所有的工作日,完全不需要用一个数组、链表之类的结构去存储。只需要用7位去存储,最低位代表星期一,从右到左的第七位代表星期天,0代表集合内没有这个元素,1代表集合有这个元素。Jdk的EnumSet就是用这种算法存储数据的。所以位集解决集合问题可以节省大量的内存。从数学视角看,位集是解决有限集的子集的最好算法。
  但是计算机界的有限和无限,与数学里的有限无限有点不一样。比如整数,计算机视角的整数是−232∼232−1-2^{32} \sim 2^{32}-12322321,数学视角是 −∞∼∞-\infty \sim \infty。而无限,从计算机角度看,就是代价非常高。再举个例子,21282^{128}2128,数学角度是一个有限的数,但是从计算机的角度看,这个数量已经超过了地球上所有沙子的数量,那就等于无限了。
  说起EnumSet,我们自然想起了EnumMap。EnumMap和EnumSet的实现机制完全不一样哈,不是位图实现的,而是用数组实现的。还以星期为例子。假如我们做每个星期的值日表,完全没必要用哈希表和红黑树、跳表等结构去存储。只需要做一个长度7的数组,索引0存星期一的值日生,索引6存储星期天的值日生就可以了。这种存储结构不是位集,但是给大家提供了一个有限集的思路。
  此外,jdk还提供了一个更一般的位集的实现java.util.BitSet。以下是简单用法:

package com.youngthing.bitmap.test.JdkBitSetTest;import java.util.BitSet;/*** created at 09/02/2022** @author 花书粉丝* <a href="mailto://yujianbo@chtwm.com">yujianbo@chtwm.com</a>* @since*/
public class JdkBitSetTest {public static void main(String[] args) {final BitSet set = new BitSet();set.set(16, true);set.set(40, true);System.out.println(set);}
}

  执行结果为:

{16, 40}

  位图,需要对位运算有数量的掌握,以下是我用Java写的一个简单的位图:

public class BitSet {private byte[] bitmap;public BitSet(int size) {if (size < 1) {throw new IllegalArgumentException("size只能为正数");}int length = size / 8;if (size % 8 != 0) {length++;}bitmap = new byte[length];}public void add(int index) {if (index >= bitmap.length * 8) {throw new IllegalArgumentException("index超出范围");}int arrayIndex = index / 8;int bitMapIndex = index % 8;bitmap[arrayIndex] |= (1 << bitMapIndex);}public void remove(int index) {if (index >= bitmap.length * 8) {throw new IllegalArgumentException("index超出范围");}int arrayIndex = index / 8;int bitMapIndex = index % 8;bitmap[arrayIndex] |= (1 << bitMapIndex);}@Overridepublic String toString() {final StringBuilder sb = new StringBuilder();boolean isFirst = true;for (int i = 0; i < bitmap.length; i++) {byte b = this.bitmap[i];for (int j = 0; j < 8; j++) {if ((b & (1 << j)) > 0) {if (isFirst) {isFirst = false;} else {sb.append(",");}sb.append(i * 8 + j);}}}return sb.toString();}public static void main(String[] args) {final BitSet bitSet = new BitSet(15);bitSet.add(8);bitSet.add(12);bitSet.add(15);System.out.println(bitSet);}
}