一些数随意选取,求可以异或出的第k大数。单纯枚举所有情况的话是 O ( 2 n ) O(2^n) O(2n),引入线性基后,可以把时间复杂度降低到 O ( n l o g n ) O(nlogn) O(nlogn)。
2. 什么是线性基&&为什么线性基可以降低时间复杂度:
把一堆数以二进制的形式纵向排列,形成了 n ∗ 64 n*64 n∗64 的 01 01 01 矩阵,由于矩阵的秩 r ( A ) ≤ m i n ( n , 64 ) r(A)\leq min(n,64) r(A)≤min(n,64) 。
可以证明这些数字组成的矩阵一定可以找到大小小于等于 64 64 64 的 Z 2 {Z}_2 Z2 域中的线性无关组。( 在 Z 2 {Z}_2 Z2 中的加法为异或,乘法为与,可以证明 Z 2 {Z}_2 Z2 是域。)
找到线性无关组之后,一个简单的想法就是枚举所有向量的组合,实际上起作用的向量只有64个, O ( 2 64 ) O(2^{64}) O(264) 就可以找到所有的情况了,这样的线性无关组就是线性基。实际上,如果只需要寻找一个数可不可以被构成,可以达到 O ( l o g n ) O(logn) O(logn) 的级别。
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. system V通信
前面我们所探究的通信方式都是基于管道文件的,而…