2015-03-25 2 views
0

я написал следующую функцию, как реализация this algorithm/approach, для создания Powerset (множество всех подмножеств) данной строки:вектор размера остального статическим после буксировки() вызывает для функции POWERSET

vector<string> getAllSubsets(string a, vector<string> allSubsets) 
{ 
    if(a.length() == 1) 
    { 
    // Base case, 
    allSubsets.push_back(""); 
    allSubsets.push_back(a); 
    } 

    else { 
     vector<string> temp = getAllSubsets(a.substr(0,a.length()-1),allSubsets); 
     vector<string> with_n = temp; 
     vector<string> without_n = temp; 
     for(int i = 0;i < temp.size()-1;i++) 
     { 
      allSubsets.push_back(with_n[i] + a[a.length()-1]); 
      allSubsets.push_back(without_n[i]); 
     } 
    } 
    return allSubsets; 

} 

Однако, похоже, кто-то ошибается: размер temp и allSubsets остается статичным от рекурсивного вызова к рекурсивному вызову, когда они должны увеличиваться из-за вызовов push_back(). есть ли причина, почему это произойдет?

+3

Измените аргумент 'allSubsets', который будет передаваться по ссылке вместо значения. Используйте 'vector & allSubsets'. –

+2

Это не проблема, так как он возвращает свои изменения во всеSubsets, а затем возвращается в свои локальные allSubsets. Его ценность должна быть включена. – Puppy

+0

Кажется, с этим связано несколько разных проблем. Правильный ответ нужно будет решать со всеми из них. Будьте терпеливы, прежде чем отвечать! Честно говоря, меня немного смущает весь дизайн; не следует getAllSubsets просто взять один параметр, строку? –

ответ

3

Это связано с тем, что у вас есть ошибка «один за другим». Поскольку это происходит в вашем случае с базой данных, вы никогда не вставляете никаких записей.

Поскольку первый недопустимый индекс равен temp.size(), i < temp.size() означает, что у вас всегда будет действующий индекс. Вычитание 1 означает, что вам не хватает последнего элемента вектора.

Стоит отметить, что прохождение allSubsets в качестве параметра является своего рода глупым, потому что всегда пусто. Такой алгоритм просто не требует второго параметра. А во-вторых, вы можете быть более эффективными с помощью хэш-наборов, которые могут выполнять дедупликацию для вас просто и быстро.

+0

Упрощенный ответ и удаленный ответ. Хороший улов! –

Смежные вопросы