首页 > 其他分享 >阿斯蒂芬小技巧——枚举子集时间复杂度证明

阿斯蒂芬小技巧——枚举子集时间复杂度证明

时间:2024-08-10 15:17:09浏览次数:16  
标签:斯蒂芬 复杂度 证明 枚举 子集 二项式

在写 状压dp 时,经常会见到如下句子:

for(int i=0;i<(1<<n);i++){
	for(int j=i;j!=0;j=(j-1)&i){
			
	}
}

时间复杂度证明如下:

单个 \(x\) 枚举子集复杂度易证( 设 \(y=log_2(x)\) ):

\[∑_{i=0}^{y} C^i_y \]

使用二项式定理

\[(a+1)^n=∑_{i=0}^{n}C_n^i ~ a^i \]

将上面的 \(a\) 设为1,则有:

\[2^n=∑_{i=0}^{n}C_n^i \]

也就是说这一坨的复杂度就是 \(2^y\):

\[∑_{i=0}^{y} C^i_y \]

接着将 \(x\) 分别取 \(0\)~\(2^n-1\),复杂度即为:

PS:这里到 \(2^{n-1}\)是因为 \(2^{n-1}\) 最多有 \(n-1\) 个2

\[∑_{i=0}^{n-1} C^i_{n-1}~2^i \]

然后再使用二项式定理:

\[(a+1)^n=∑_{i=0}^{n}C_n^i ~ a^i \]

把 a=2 带进去会发现:

\[3^n=∑_{i=0}^{n}C_n^i ~ 2^i \]

于是就愉悦的证明出复杂度为:

\[3^{n-1} \]

耶耶耶耶耶耶!!

标签:斯蒂芬,复杂度,证明,枚举,子集,二项式
From: https://www.cnblogs.com/lewisak/p/18352308

相关文章

  • Java enum(枚举)
    在Java中,enum(枚举)是一种特殊的数据类型,允许你定义一组命名的常量。这些常量通常代表一个固定的、有限的集合。例如,一年中的季节、交通信号灯的状态,或者一副扑克牌的花色。基本用法一个基本的enum定义如下:publicenumSeason{WINTER,SPRING,SUMMER,FALL}这里,Season......
  • 堆排序以及向上、向下调整算法的时间复杂度推导及实现(超详细)
    什么是堆排序?堆排序是由堆这种数据结构所设计的一种排序算法堆的分类:大根堆:每个父结点的值都大于子结点小根堆 :每个父结点的值都小于子结点 在了解完堆之后,需要先了解建堆,建堆有向上建堆建大堆或者小堆,也有向下建堆建大堆或者小堆 建大堆还是小堆看子结点和父结点的......
  • 枚举的使用场景
    枚举的使用场景目录枚举的使用场景基本定义带属性的枚举使用枚举枚举方法枚举与switch语句枚举迭代枚举与Java反射枚举实现接口枚举序列化基本定义publicenumDay{SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;}带属性的枚举枚举可以拥有字段、......
  • `EnumSet` 和 `EnumMap` 枚举类
    EnumSet和EnumMap枚举类目录EnumSet和EnumMap枚举类EnumSet创建EnumSetEnumSet操作EnumMap创建EnumMapEnumMap操作EnumSetEnumSet是基于位向量(bitvector)的集合实现,专为枚举类型设计,提供了非常高效的内存和性能表现。EnumSet不允许包含null元素,并且所有元素都必......
  • 枚举
    枚举的定义在Java中,枚举(enum)是一种特殊的类,它可以用来定义一组常量。枚举类型是Java语言的关键字,用于定义枚举类型。枚举类型提供了一种方式,可以保证变量的值只能是预定义的常量集合中的一个。以下是枚举的一些基本特性和用法:定义枚举:枚举类型定义使用enum关键字publicenum......
  • 洛谷B3621枚举元组
    一道经典dfs题,很简单就是让你求1~k能组成多少个n位数。当然耐心足够的朋友可以尝试打表。dfs思路:1.定义数组a来存储每一次的组合,其中a[i]表示第i位的数字;3.递归一定要设定终止条件:如果枚举到了n+1位时,输出数组a并returnCode#include<bits/stdc++.h>usingnamespa......
  • 枚举
    枚举枚举(Enum)是Java中一种特殊的数据类型,它允许程序员定义一个有限的、可枚举的数据集。枚举类型提供了一种更强大、更安全和更易读的方式来表示一组相关的常量。以下是关于Java中枚举的详细解释:一、枚举的定义在Java中,枚举类型是通过使用enum关键字来定义的。枚举类型的定义通......
  • 枚举
    枚举1.枚举的定义Java中的枚举(Enumeration)是一种特殊的数据类型,用于定义一组有限的命名常量。枚举提供了一种更直观、更可读的方式来表示一组相关的常量,并且可以为这些常量绑定其他数据或行为。枚举是在JDK1.5(Java5)以后引入的,它是对之前使用常量(如publicstaticfinal变量)表示......
  • 枚举声明
    枚举Java枚举知识点概念enum的全称为enumeration,是JDK1.5中引入的新特性。在Java中,被enum关键字修饰的类型就是枚举类型。形式如下:enumColor{RED,GREEN,BLUE}如果枚举不添加任何方法,枚举值默认为从0开始的有序数值。以Color枚举类型举例,它的枚举常量依......
  • C语言day11(string函数族、递归函数、结构体、共用体、枚举)
    【1】string函数族1.strlen头文件:#include<string.h>格式:size_tstrlen(constchar*s);功能:计算字符串实际长度,不包括\0参数:s:目标字符串首地址返回值:字符串实际长度2.strcpy    头文件:#include<string.h>    格式:char*strcpy(char*dest,......