0 から 2^n までのすべてのビットを使用して、セットのパワーセットを計算するアルゴリズムがあります。
public static <T> void findPowerSetsBitwise(Set<T> set, Set<Set<T>> results){
T[] arr = (T[]) set.toArray();
int length = arr.length;
for(int i = 0; i < 1<<length; i++){
int k = i;
Set<T> newSubset = new HashSet<T>();
int index = arr.length - 1;
while(k > 0){
if((k & 1) == 1){
newSubset.add(arr[index]);
}
k>>=1;
index --;
}
results.add(newSubset);
}
}
私の質問は: このアルゴリズムの実行時間は? ループは 2^n 回実行され、各反復で while ループは lg(i) 回実行されます。だから私は実行時間は
T(n) = the sum from i=0 to i=2^n of lg(i)
しかし、これをさらに単純化する方法がわかりません。これは O(2^n) 時間 (空間ではない) で再帰的に解決できることを知っているので、上記の方法がこれよりも良いか悪いか、時間的に宇宙の方がいいです。