1. 位或操作(|)的非递减性
位或操作(|)是一个位级操作,它对两个数的每一个二进制位独立进行逻辑或运算:
- 如果某一位是 1,则结果的该位一定是 1(因为 1 | x = 1)。
- 如果某一位是 0,则结果的该位取决于另一个数的对应位(0 | 0 = 0,0 | 1 = 1)。
为什么 a | b ≥ a 和 a | b ≥ b?
-
**a | b ≥ a**:
- 对于 a 的每一位:
- 如果 a 的某一位是 1,则 a | b 的该位一定是 1(因为 1 | x = 1),所以 a | b 的该位 ≥ a 的该位。
- 如果 a 的某一位是 0,则 a | b 的该位取决于 b 的对应位:
- 如果 b 的该位是 1,则 a | b 的该位是 1(比 a 的 0 大)。
- 如果 b 的该位是 0,则 a | b 的该位是 0(和 a 的 0 相同)。
- 结论:a | b 的每一位要么等于 a 的对应位,要么比 a 的对应位大,因此 a | b ≥ a(按数值比较)。
- 对于 a 的每一位:
-
**a | b ≥ b**:
- 同理,a | b 的每一位要么等于 b 的对应位,要么比 b 的对应位大,因此 a | b ≥ b。
推广到多个数字
对于多个数字 a₁, a₂, …, aₙ,逐步进行按位或操作:
- a₁ | a₂ ≥ a₁ 且 a₁ | a₂ ≥ a₂
- (a₁ | a₂) | a₃ ≥ (a₁ | a₂) 且 (a₁ | a₂) | a₃ ≥ a₃
- …
- a₁ | a₂ | … | aₙ ≥ a₁ | a₂ | … | aₙ₋₁ 且 a₁ | a₂ | … | aₙ ≥ aₙ
因此,最终的按位或结果 a₁ | a₂ | … | aₙ 是所有中间结果中的最大值,因为它不断累积更多的 1 位,而不会减少任何位。
2. 为什么最终最大的或结果是全部数字的或?
因为按位或操作是单调非递减的(即 x | y ≥ x 和 x | y ≥ y),所以:
- 每次进行 | 操作,结果只会增加或保持不变(不会减少)。
- 因此,最终所有数字的或 a₁ | a₂ | … | aₙ 会包含所有可能的 1 位,即最大的可能值。
例子
假设我们有三个数字:
- a = 5(0101)
- b = 3(0011)
- c = 6(0110)
逐步计算:
- 7 ≥ 5 且 7 ≥ 3(满足非递减性)
- 7 ≥ 7 且 7 ≥ 6(仍然满足非递减性)
最终结果 7 是所有数字的或,也是最大的可能值。
3. 贪心策略的解释
这个问题类似于贪心算法中的最大化二进制位问题:
- 我们希望结果的二进制表示中尽可能多的 1 位。
- 每次进行 | 操作,都会保留或增加 1 位,而不会减少 1 位。
- 因此,最终所有数字的或 a₁ | a₂ | … | aₙ 会包含所有可能的 1 位,即最大值。
结论
- 按位或操作 | 是非递减的,即 a | b ≥ a 和 a | b ≥ b。
- 逐步进行 | 操作,结果只会增加或保持不变,不会减少。
- 最终所有数字的或 a₁ | a₂ | … | aₙ 会包含所有可能的 1 位,因此是最大的可能值。
这就是为什么最终最大的或结果是全部数字的或。
评论前必须登录!
注册