首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么数据结构的大小通常为2 ^ n?

数据结构的大小通常为2^n的原因是这样的数据结构具有良好的性能和效率。2^n是一个幂等数,它的特点是可以被2整除,这使得它们在计算机内存中的存储和操作更加高效。

首先,2^n可以表示为一个二进制数,其中只有一个位置上的比特位为1,其余位置上的比特位为0。这种表示方式使得计算机可以快速地进行位运算,例如AND、OR、XOR等。这些位运算是计算机硬件实现的基本操作,因此使用2^n作为数据结构的大小可以提高计算效率。

其次,2^n的数值具有良好的算术性质。例如,2^n可以表示为若干个2的乘积,这使得它们可以用于构建各种数据结构,例如二叉树、哈希表、位图等。此外,2^n的数值也可以用于构建缓存、内存分配等计算机系统组件,因为它们可以方便地进行位运算和掩码操作。

最后,2^n的数值也具有良好的可扩展性。当需要增加数据结构的大小时,可以通过增加n的值来实现,而不需要重新设计数据结构或更改硬件配置。这使得2^n成为了许多数据结构和算法的理论基础,例如快速排序、哈希表、二叉树等。

总之,数据结构的大小通常为2^n是因为这种大小具有良好的性能和效率,可以提高计算机硬件和软件的性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 HashMap 容量大小要设置2N次方?

我说小朋友:如果想指定 HashMap 对象容量得用2N次方 。假如不是2N次方那么在第一次put 元素时候也会自动把容量设置比传入参数大最小2N次方,并不是你指定这个值。...2N次方就简单多了。...假如初始容量23次方数字8,当哈希值与容量大小减一值进行与运算时可以保证结果比较均匀分布在数组上。   ...那么你想想,假如指定容量大小5又会怎么样呢?如果是5,那么就会出现非常严重哈希碰撞,所以为了避免这种情况出现。HashMap 并没有傻乎乎直接使用用户指定容量大小。...而是在实例化 HashMap 对象时,如果初始容量大小不是2N次方则会把 threshold 设置成比传入初始容量大最小2N次方。

1.4K00
  • 为什么Netty线程池默认大小CPU核数2

    有位工作5年小伙伴问我说,为什么Netty线程池默认大小CPU核数2倍,今天,我花2分钟时间给大家专门分享一下我对这个问题理解。...相当于 R = 1,代入上面的公式,就可以得出Netty默认设置线程池大小自然就是 默认线程池大小 = CPU核数 * (1 + 1) 也就2倍CPU核数大小。...3、总结与使用建议 通过前面的分析,我们已经知道了Netty线程池默认大小未CPU核数2原因,我们在实际开发中,如何来得到一个比较准确线程池大小呢? 我们可以提前压测,根据压测结果来进行微调。...一般情况下,保证生产环境压测环境75%即可。...如果修改Netty线程池大小,也一定要考虑ioRatio这个参数是否需要调整,因为2倍CPU核数大小是假设I/O耗时和CPU耗时1:1,调整线程大小之后,性能效果也不一定符合期望值。

    2.8K20

    HashMap容量为什么一定是2^n

    扩容性能更佳:HashMap 初始容量是2^n,扩容也是以 2形式进行扩容,这样在进行扩容重新分布元素时,我们只需要对参与计算最高位进行检测,如果 1 就向高位移动 2^(n-1) 位,...当我们指定容量大小时候,如果这个值不是 2^n,HashMap 就会将其处理 2^n。...每一步都将前面步骤中生成 1 向右扩散,确保从最初最高位 1 到最低位,所有位都被设置 1。为什么 HashMap 要进行这样操作呢 ?...而x % 2^n = x & (2^ - 1),可以把 % 运算转换为 & 运算,这样性能就大大提高了。那为什么 x % 2^n = x & (2^ - 1)呢?...为什么会出现这种情况?我们以 s hash (115 = 1110011)值例。

    7110

    HashMap 容量为什么总是 2 次幂?

    为什么要保证 capacity 是2次幂呢? 1)在get方法实现中,实际上是匹配链表中 Node[] tab 中数据。...2)因为 n 永远是2次幂,所以 n-1 通过 二进制表示,永远都是尾端以连续1形式表示(00001111,00000011) 当(n - 1) 和 hash 做与运算时,会保留hash中 后 x...- 1) & hash,当n2次幂时,会满足一个公式:(n - 1) & hash = hash % n 2.为什么要通过 (n - 1) & hash 决定桶索引呢?.... */ static final int tableSizeFor(int cap) { //cap-1后,n二进制最右一位肯定和cap最右一位不同,即一个0,一个1,例如cap=17...尽量避免 bug 手法2、HashMap 为什么线程不安全?3、3种骚操作,教你查看 Java 字节码! 4、疯了!同事又问我为什么不能用 isXXX5、不能用 + 拼接字符串?这次我要吊打面试官!

    1.7K20

    实习准备数据结构2)-- 详尽链表篇

    [在这里插入图片描述] C链表 链表在C语言数据结构地位可不低。后面很多数据结构,特别是树,都是基于链表发展。 所以学好链表,后面的结构才有看必要。...[在这里插入图片描述] 看啊,在相遇之前呢,慢指针走距离很好求:L1 = D+S1; 快指针走距离:设它在相遇前绕了n圈(n>1),那么:L2 = D+S1+n(S1+S2); 不过,还有一个等量关系...,不要忽略掉,快指针速度是慢指针两倍,所以:L2 = 2L1; 那么就是:n(S1+S2)-S1 = D; 再转换一下就是:(n-1)(S1+S2)+S2 = D; 那也就是说,在相遇时候,把一个=...2、从刚刚头往后遍历N个位置,N要旋转数。 3、环断开。 解决。 秀吧,我就是觉得解法好玩,就收藏了。...//去除重复元素至只保留一个副本 test.unique(); //已经过大小排序list才能使用 (2)合并list test.splice(test.end(),test2);//将test2

    28710

    一文看懂HashMap扩容为什么2n次幂

    如果存放相同Key,那么Value将会被覆盖,类似于QQ更改密码,账号不会变,只有密码会进行更改。 ? 运行结果如下所示 ? 2.为什么扩容2n次幂?...首先先看一下HashMap中putVal方法(存值)和resize方法(扩容),之所以HashMap扩容是2n次幂和这两个方法有千丝万缕联系。...之所以这样2n扩容和上面的两个方法有极大关系,首先他们都使用了按位与运算,按位与运算就是把值先变成二进制然后进行运算,如果有0则0,都为1时则输出1,HashMap默认容量16那么在存放到数组时就是...再看一下当容量不为11111111而是其他值时候,通过下面的结果可以看出,1、2、4跟不同值进行hash运算但是结果却是相同,也就是发生了hash碰撞。 ?...通过上面的对比可以看出来11111111和其他值 比较大大减少了hash碰撞发生,这样就是什 么HashMap为什么扩容采用2n次幂原因。

    6.3K90

    2021-08-26:长度N数组arr,一定可以组成N^2个数字

    2021-08-26:长度N数组arr,一定可以组成N^2个数字对。...第一维数据从小到大;第一维数据一样,第二维数组也从小到大,所以上面的数值对排序结果:(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)(3,1)(3,2)(3,3)。...给定一个数组arr,和整数k,返回第k小数值对。 福大大 答案2021-08-26: 1.暴力解。 时间复杂度:(N^2 * log(N^2)). 2.下标定位+bfprt算法。 2.1.k--。...2.2.定位下标i1和i2。 i1=k/N。 i2=k%N。 2.3.根据bfprt算法求出第i1小和第i2数。 时间复杂度:O(N)。 空间复杂度:O(1)。arr数组里元素顺序会发生变化。...[]int, k int) []int { N := len(arr) if k > N*N { return nil } // 在无序数组中,找到第K小

    41010

    Batch大小不一定是2n次幂!ML资深学者最新结论

    羿阁 编译整理 量子位 | 公众号 QbitAI Batch大小不一定是2n次幂? 是否选择2n次幂在运行速度上竟然也相差无几? 有没有感觉常识被颠覆?...因此,选取2n次幂作为batch大小,主要是为了将一个或多个批次整齐地安装在一个页面上,以帮助GPU并行处理。 其次,矩阵乘法和GPU计算效率之间也存在一定联系。...因此,假设在理论上,batch大小8倍数时,对于具有Tensor Cores和FP16混合精度训练GPU最有效,那么让我们调查一下这一说法在实践中是否也成立。...不用2n次幂也不影响速度 为了了解不同batch数值对训练速度影响,R教授在CIFAR-10上运行了一个简单基准测试训练——MobileNetV3(大)——图像大小224×224,以便达到适当...结论 可以看出,选择2n次幂或8倍数作为batch大小在实践中不会产生明显差异。 然而,由于在实际使用中已成为约定俗成,选择2n次幂作为batch大小,的确可以帮助运算更简单并且易于管理。

    59610

    jdk源码分析之HashMap--为什么初始容量是2n次幂

    数组长度)建议2n次幂呢?...我们举几个例子,length1=3(奇数),length2 = 6(偶数),length3 = 16(2n次幂),那么对应length-1二进制数组如下: ?...从以上例子中可知,奇数和偶数(非2n次幂),和任何keyhashcode按位与操作,总会有一些位置覆盖不到。...回到上述indexFor方法中,也就是说对于数组长度非2n次幂情况,永远会有一些数组位置辐射不到,再换一个角度来说,这些场景中,我们永远无法将Entry数组利用率提高到100%。...最后我们可以得出结论,使用HashMap时候建议指定容量是2n次幂(很多人习惯使用空构造器,默认容量16已经满足需求),具体还需要考虑业务场景而定。

    37610

    2021-08-25:给定数组father大小N,表示一共有N个节点,father = j 表示点i父亲是点j, fa

    2021-08-25:给定数组father大小N,表示一共有N个节点,father[i] = j 表示点i父亲是点j, father表示树一定是一棵树而不是森林,queries是二维数组,大小M...*2,每一个长度2数组都表示一条查询,[4,9], 表示想查询4和9之间最低公共祖先…,[3,7], 表示想查询3和7之间最低公共祖先…,tree和queries里面的所有值,都一定在0~N-1...返回一个数组ans,大小M,ans[i]表示第i条查询答案。 福大大 答案2021-08-25: 树链剖分。 代码用golang编写。...代码如下: package main import "fmt" func main() { father := []int{2, 3, 3, 3, 2, 1} queries :=...[]int{2, 2}, } ret := query3(father, queries) fmt.Println(ret) } // 在线查询最优解 -> 树链剖分 // 空间复杂度

    35730

    2021-07-31:给定数组father,大小N,表示一共有N个节点,father = j 表示点i父亲是点j, f

    2021-07-31:给定数组father,大小N,表示一共有N个节点,father[i] = j 表示点i父亲是点j, father表示树一定是一棵树而不是森林,给定数组values,大小N,...1)让某个子树所有节点值加上v,入参:int head, int v;2)查询某个子树所有节点值累加和,入参:int head;3)在树上从a到b整条链上所有加上v,入参:int a, int b,...int v;4)查询在树上从a到b整条链上所有节点值累加和,入参:int a, int b。...= 0 j i这个节点,重儿子是j son []int // siz[i] i这个节点子树,有多少个节点 siz []int // top[i] = j i这个节点...= this.son[u] { this.dfs2(v, v) } } } } // head子树上,所有节点值+

    62340

    2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和 n 组数 。 示例 1: 输入: n = 5 输出: 2 解释: 5 = 2 +

    2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和 n 组数 。...+ 2 + 3 + 4 + 5 答案2022-09-09: 如果有,N = (x+1) + (x+2) + ... + (x+k) 上式子可以化简N = kx + k(k+1)/2 左右两边同时乘以...k + 1),这个式子来说,只要给定不同一组x和k,就对应一种不同方案 进一步分析可以看出: 如果k偶数,那么2x + k + 1就是奇数 如果k奇数,那么2x + k + 1就是偶数 2N...= 左 K 右 2x + k + 1 2N 奇数因子K, 2x + k + 1 也就是说,对于每一种方案,k和2x + k + 1,一定是不同,并且连奇偶性都相反 所以2N里任何一个奇数因子,可能作为...一般来说,求N里有多少奇数因子,用O(根号N)方法肯定可以 但其实可以更加优化, 如果 N = 3^a 5^b 7^c * 9^d ....那么N一共会出现多少奇数因子呢?

    70710

    对于一个运行时间100n*n算法,要使其在同一台机器上,在比一个运行时间2^n算法运行很快,n最小值是多少

    在《算法导论》第一部分练习中,有这样一道算法题: 1.2-3 对于一个运行时间100n*n算法,要使其在同一台机器上,在比一个运行时间2^n算法运行很快,n最小值是多少?...下面给出我自己解题思路: 对于100n^22^n两个算法进行比较,我们可以这样做:对100n^2-2^n操作,如果结果小于0,那么此时n就是我们所求值。...-3:对于一个运行时间100n^2算法,要使其在同一台机器上,比一个运行时间2^n算 8 * 法运行得更快,n最小值是多少?...22^n两个算法进行比较,我们可以这样做:对100n^2-2^n操作,如果结果小于0,那么此时n就是我们所求值。...21 * java中求一个数n次方,方法Math.pow(x,y);即xy次方 22 */ 23 public static void getSum() { 24

    1.6K30

    给定一个长度偶数数组arr,假设长度N*2,左部分:arr,右部分:

    给定一个长度偶数数组arr,假设长度N*2,左部分:arr[L1……Ln],右部分:arr[R1……Rn],请把arr调整成arr[L1,R1,L2,R2,L3,R3,…,Ln,Rn]。...要求:时间复杂度O(N),额外空间复杂度O(1)。 福大大 答案2021-08-03: 这道题用自然智慧,很难想到。 i从1开始。下标循环怼。 3k次方-1。1,3,9……是环其中一个位置。...左部分:2*i。 右部分:(i-长/2)*2-1。 时间复杂度:O(N)。 空间复杂度:O(1)。 代码用golang编写。...- 1 } } // 数组长度len,调整前位置是i,返回调整之后位置 // 下标不从0开始,从1开始 func modifyIndex2(i int, len2 int) int...^k)-1数 // 也就是找到最大k,满足3^k <= len+1 for base (N+1)/3

    60440

    2022-08-26:用一个大小 m x n 二维网格 grid 表示一个箱子你有 n 颗球。箱子顶部和底部都是开着。箱

    2022-08-26:用一个大小 m x n 二维网格 grid 表示一个箱子 你有 n 颗球。箱子顶部和底部都是开着。...箱子中每个单元格都有一个对角线挡板,跨过单元格两个角, 可以将球导向左侧或者右侧。 将球导向右侧挡板跨过左上角和右下角,在网格中用 1 表示。...返回一个大小 n 数组 answer , 其中 answer[i] 是球放在顶部第 i 列后从底部掉出来那一列对应下标, 如果球卡在盒子里,则返回 -1。...]; for _ in 0..m { ans.push(0); } for col in 0..m { // (0,0) (0,1) (0,2)...let mut i = 0; let mut j = col; while i < n { // (i,j) 左上 -> 右下格子

    37430

    2023-06-26:在大小 n x n 网格 grid 上,每个单元格都有一盏灯,最初灯都处于 关闭 状态 给你一个由灯

    2023-06-26:在大小 n x n 网格 grid 上,每个单元格都有一盏灯,最初灯都处于 关闭 状态 给你一个由灯位置组成二维数组 lamps 其中 lamps[i] = [rowi,...] 是被照亮 则查询结果 1 ,否则为 0 。...3.遍历灯位置,将灯状态记录到相关map中,并将点状态记录到points map中。 4.创建一个结果数组 ans,用于存储每个查询结果。 5.对于每一个查询位置,初始化结果0。...• 因此,总时间复杂度 O(lamps + queries)。 空间复杂度分析: • maps 和 points 空间复杂度均为 O(lamps),其中 lamps 是灯数量。...• 结果数组 ans 空间复杂度 O(queries),其中 queries 是查询数量。 • 因此,总空间复杂度 O(lamps + queries)。

    24230
    领券