这是问题 9.4 从 破解编码访谈 5th
问题: 编写一个方法来返回集合的所有子集。
这是我在Java中的解决方案。(测试过,它的工作原理!!!)
public static List<Set<Integer>> subsets(Set<Integer> s) {
Queue<Integer> copyToProtectData = new LinkedList<Integer>();
for(int member: s) {
copyToProtectData.add(member);
}
List<Set<Integer>> subsets = new ArrayList<Set<Integer>>();
generateSubsets(copyToProtectData, subsets, new HashSet<Integer>());
return subsets;
}
private static void generateSubsets(Queue<Integer> s,
List<Set<Integer>> subsets, Set<Integer> hashSet) {
if(s.isEmpty()) {
subsets.add(hashSet);
} else {
int member = s.remove();
Set<Integer> copy = new HashSet<Integer>();
for(int i:hashSet) {
copy.add(i);
}
hashSet.add(member);
Queue<Integer> queueCopy = new LinkedList<Integer>();
for(int i:s){
queueCopy.add(i);
}
generateSubsets(s, subsets, hashSet);
generateSubsets(queueCopy, subsets, copy);
}
}
我看了这个问题的解决方案,作者说这个算法的解决方案在O(2n)时间复杂度和O(2n)空间复杂度下运行。我同意她的观点,这个算法在O(2n)时间内运行,因为要解决这个问题,你必须考虑这样一个事实,对于任何元素,你都有两种可能性,它可以在集合中,也可以不在集合中。因为你有n个元素,你的问题将有2n可能性,所以问题将在O(2n)时间内解决。
然而,我相信我有一个令人信服的论点,即我的算法在O(n)空间中运行。我知道空间复杂度是“算法相对于输入大小占用的总空间”空间复杂度,并且相对于递归调用的深度(请记住我看过的一些Youtube视频)
我的一个例子是生成[1,2,3]作为[1,2,3]的子集。以下是用于生成该集合的递归调用集< br> generateSubsets([],Subsets,[1,2,3])
generateSubsets([3],Subsets,[1,2])
generateSubsets([2,3],subsets,[1])
generateSubsets([1,2,3],subsets,[])
这表明递归调用相对于原始集合大小n的最大深度是n本身。每个递归调用都有自己的堆栈框架。所以由此我得出空间复杂度为O(n)有人看出我的证明有什么瑕疵吗?
您需要考虑算法分配的所有内存(或者更确切地说,任何时候“正在使用”的最大分配内存量)——不仅在堆栈上,而且在堆上。每个生成的子集都存储在< code>subsets列表中,该列表最终将包含2n个集合,每个集合的大小介于0和n之间(大多数集合包含大约n / 2个元素),因此空间复杂度实际上为O(n 2n)。
问题内容: 这是第 5章破解编码面试中的问题9.4 问题: 编写一种方法以返回集合的所有子集。 这是我用Java编写的解决方案(经过测试,它可以正常工作!!!) 我看了这个问题的解决方案,作者说该算法的解决方案以 _O(2 n)_时间复杂度和 _O(2 n)_空间复杂度运行。我同意她的观点,该算法运行时间为 _O(2 n),_因为要解决此问题,您必须考虑以下事实:对于任何元素,您都有两种可能性,它
查找p的伪码算法为: 假设我有一个int值的数组H[1到m],其中“p”是峰值元素,如果: 基本上,如果H【p】大于或等于其相邻元素,则H【p】为峰值。 假设数组H在开始和结束时都大于1个元素,数组为H[0到m 1],其中H[0]=H[m 1]=无穷大。因此,H[0]和H[m 1]是哨兵。然后是元素p,其中1≤ p≤ n、 是一个峰值,如果H【p-1】≤ H【p】≥ H【p 1】。 我认为渐近时间
做O(h)算法的时间复杂度是多少?当h是节点的高度,以BST n倍为单位(树中的元素数),我相信是O(n),而不是O(n*h),但我不知道如何证明它。 在O(h)中工作的特定算法是在BST中查找元素的顺序前体。
我正在学习算法和数据结构课程。 今天,我的教授说下面算法的复杂度是2n。 我一直等到课程结束,走近他,告诉他我真的相信这是一个O(n)算法,我做了计算来证明它,并想给他们看,但他继续说它不是,没有给我任何令人信服的解释。 该算法是递归的,具有以下复杂性: 我计算它是一个,这样: 让我们展开 当T中的项为1时,我们停止,即: n/(2i)=1== 替换后,我们获得 由于该算法是从关于合并排序的课程中
给定一个整数数组arr,计算元素x,使得x 1也在arr中。如果arr中有重复项,请分别计数。 示例1:输入:arr=[1,2,3]输出:2说明:1和2被计数,因为2和3在arr中。 示例2:输入:arr=[1,1,2]输出:2解释:1计数两次,原因2在arr中。 示例3:输入:arr=[1,1,3,3,5,5,7,7]输出:0说明:没有计算数字,因为arr中没有2、4、6或8。 示例4:输入:a