Каково время работы этого алгоритма набора мощности

У меня есть алгоритм для вычисления набора мощности набора с использованием всех битов между 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) = сумма от i = 0 до i = 2 ^ n из lg (i)

Но я не знаю, как это еще упростить, я знаю это может быть решен за O (2 ^ n) времени (не в пространстве) рекурсивно, поэтому мне интересно, лучше или хуже метод, описанный выше, по времени, так как он лучше в пространстве.

5
задан Bill the Lizard 23 May 2011 в 02:31
поделиться