《Java编程入门》中生日猜测算法原理及集合构造解析
生日猜测算法的底层原理与集合构造解析
一、算法实现逻辑
这个算法的核心是二进制编码原理。1-31之间的任意数字,都可以用5位二进制数表示(比如5是00101,23是10111)。
每个集合的首个数字都是2的幂次:set1首数字1=2⁰,set2首数字2=2¹,set3首数字4=2²,set4首数字8=2³,set5首数字16=2⁴。这些数字恰好对应5位二进制数每一位的权重值。
当用户确认生日在某个集合中时,就代表生日的二进制数在对应位置上是1。把所有符合条件的集合首数字相加,本质就是将这些1对应的权重值累加,结果自然就是生日的十进制数值。
举个实际例子:如果生日是23,它的二进制是10111,对应:
- 第0位(权重1)为1 → 生日在set1里
- 第1位(权重2)为1 → 生日在set2里
- 第2位(权重4)为1 → 生日在set3里
- 第4位(权重16)为1 → 生日在set5里
将这些集合的首数字相加:1+2+4+16=23,完全匹配生日。
二、集合构造规则
每个集合的构造都对应二进制的某一位,规则非常明确:
- 给每个集合分配一个二进制位(set1对应第0位,set2对应第1位,直到set5对应第4位)
- 筛选1-31中,二进制该位为
1的所有数字,放入这个集合 - 集合的首个数字就是该位对应的权重值(2的幂次)
以set4为例,它对应第3位(权重8=2³),所有二进制第3位为1的数字包括8、9、10、11、12、13、14、15、24、25、26、27、28、29、30、31,这和示例里的set4内容完全一致。
所有集合都按这个规则筛选数字,确保只要用户准确确认生日所在的集合,相加首数字就能得到正确结果。
内容的提问来源于stack exchange,提问作者Nader Abd Alhamed
相关产品推荐
相关产品推荐

