首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    数据结构散列线性开型寻址(C++实现)插入,删除,查找

    插入x,若散列表已存在x,输出“Existed”,否则插入x到散列表中,输出所在的下标。 查询x,若散列表不含有x,输出“-1”,否则输出x对应下标。 删除x,若散列表不含有x,输出“Not Found”,否则输出删除x过程中移动元素的个数。 输入格式 第一行两个整数D(1≤\leq≤ D ≤\leq≤ 3000)和m(1≤\leq≤ m ≤\leq≤ 3000),其中D为散列函数的除数,m为操作数。 接下来的m行,每行两个整数opt和x,分别代表操作类型和操作数。 若opt为0,则代表向散列表中插入x; 若opt为1,代表查询散列表中x是否存在; 若opt为2,(如果散列表中含有x),删除x。 数据保证散列表不会溢出。 输出格式

    02

    Java HashMap 的那么多为什么

    其中方法 hashcode() 返回的是 Java 对象的 hash_code,这是一个 int 类型的值(32 位)。那么为什么在拿到这个值之后,还需要将自己右移 16 位与自己进行异或呢?因为容量较小的时候,在计算 index 那边,真正用到的其实就只有低几位,假如不融合高低位,那么假设 hashcode() 返回的值都是高位的变动的话,那么很容易造成散列的值都是同一个。但是,假如将高位和低位融合之后,高位的数据变动会最终影响到 index 的变换,所以依然可以保持散列的随机性。 那么在计算 index 的时候,为什么不使用 hash(key) % capacity 呢?这是因为移位运算相比取余运算会更快。那么为什么 hash(key) & (capacity - 1) 也可以呢?这是因为在 B 是 2 的幂情况下:A % B = A & (B - 1)。如果 A 和 B 进行取余,其实相当于把 A 那些不能被 B 整除的部分保留下来。从二进制的方式来看,其实就是把 A 的低位给保留了下来。B-1 相当于一个“低位掩码”,而与的操作结果就是散列值的高位全部置为 0 ,只保留低位,而低位正好是取余之后的值。我们取个例子,A = 24,B =16,那么 A%B=8,从二进制角度来看 A =11000 ,B = 10000。A 中不能被 B 整除的部分其实就是 1000 这个部分。接下去,我们需要将这部分保留下来的话,其实就是使用 01111 这个掩码并跟 A 进行与操作,即可将1000 保留下来,作为 index 的值。而 01111 这个值又等于 B-1。所以 A &(B-1)= A%B。但是这个前提是 B 的容量是 2 的幂,那么如何保证呢?我们可以看到,在设置初始大小的时候,无论你设置了多少,都会被转换为 2 的幂的一个数。之外,扩容的时候也是按照 2 倍进行扩容的。所以 B 的值是 2 的幂是没问题的。

    01
    领券