首页 > 编程知识 正文

java向上取整,bigdecimal取余数

时间:2023-05-05 00:32:45 阅读:161862 作者:3875

Hash Table散列表是基于对象特征定位的一种数据结构。 一个简单的实现方法是通过某种运算得到对象的整数,将该整数除以哈希表的大小,然后取剩下的数,以此作为对象的存储位置。

很多书认为,散列表的大小最好选择较大的素数,不要接近2的整数幂。 《算法导论》认为,最坏的选择是哈希表大小正好为2的整数幂。 关于这一点的描述(只记得大意)意味着计算机是以二进制数存储的,将二进制数除以2的整数幂会导致前一位丢失,从而导致部分信息丢失,散列表中的元素分布不均匀。

这个解释看起来很合理,但我不同意。 不仅是我,Java开发团队的人也不同意。 Java的HashSet类特意将哈希表的大小设置为2的整数幂。 想象一下,对于自然数集合中的任意数x,对于正整数m,x mod M成为某个值的概率会变高。 显然不是这样。 由于x是自然数集合中的任意值,因此如果选择次数非常多,则x mod M的结果应该平均分布在[0,M-1]中。 我想《算法导论》的错误在于二进制文件是先引入的,其实二进制文件和散列表的“冲突”完全没有关系。 而且,相对于除以2^n的馀数,比特丢失,信息丢失这一说法显然也是错误的。 因为如果x=M,则x mod M的结果总是“丢失一些信息”。 根据《算法导论》,如果计算机采用十进制,散列表的容量为10^n,岂不更糟? 这个说明明显不成立。

我认为对x mod M这样的散列函数来说,好坏取决于x的生成方法和m的值。 例如,对于字符串“ABC”,如果我将x(ABC ) )视为=65*128^2 66*128 67,即字符串为128进制整数,那么M=128就麻烦了。 因为不管是什么字符串,最终结果都只取决于最后一个字符,所以分布会不均匀。

链表是一种常见的数据结构,通常由一系列节点组成。 每个节点包含两个信息域和指针域。 信息域用于存储相关数据项,而指针域用于指向链表中的下一个节点。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。