2.Есть ли более быстрый способ генерировать набор мощности или это оптимально?
Ваш алгоритм разумен, но ваша обработка строк может использовать улучшения.
string str = Convert.ToString(i, 2);
string pset = str;
for (int k = str.Length; k < input.Length; k++)
{
pset = "0" + pset;
}
Все, что вы здесь делаете, это настраивает битовое поле, но с использованием строки.Просто пропустите это и используйте переменную i
напрямую.
for (int j = 0; j < input.Length; j++)
{
if (i & (1 << j))
{
При создании строки используйте StringBuilder, а не создавайте несколько строк.
// At the beginning of the method
StringBuilder set = new StringBuilder(input.Length);
...
// Inside the loop
set.Clear();
...
set.Append(input[j]);
...
powerSet.Add(set.ToString());
Изменит ли это сложность вашего алгоритма?Нет. Но это значительно уменьшит количество создаваемых вами дополнительных объектов String, что обеспечит вам хорошее ускорение.