Я создал программу для решения Cryptarithmetics для класса по структурам данных. Профессор рекомендовал использовать стек, состоящий из связанных узлов, чтобы отслеживать, какие буквы мы заменили на какие числа, но я понял, что целое число может сделать то же самое. Вместо стека {A, 1, B, 2, C, 3, D, 4} я мог бы хранить ту же информацию в 1234.
Моя программа, похоже, работает намного медленнее, чем оценка, которую он дал нам. Может ли кто-нибудь объяснить, почему стек будет вести себя намного эффективнее? Я предположил, что, поскольку я не буду вызывать методы снова и снова (push, pop, top и т. Д.), А просто добавлю один к «решению», мое будет быстрее.
Это не открытый вопрос, поэтому не закрывайте его. Хотя вы можете реализовывать вещи по-разному, я хочу знать, почему в основе C ++ доступ к данным через стек имеет преимущества в производительности по сравнению с хранением в целых и извлечением с помощью модов.
Хотя это домашнее задание, мне на самом деле помощь не нужна, просто очень заинтригована и любопытна.
Спасибо и не могу дождаться, чтобы узнать что-то новое!
РЕДАКТИРОВАТЬ (добавить код)
letterAssignments - это массив int размера 26. для такой проблемы, как SEND + MORE = MONEY, A не используется, поэтому для letterAssignments [0] установлено значение 11. Все используемые символы инициализируются равными 10.
answerNum - это число с количеством цифр и количеством уникальных символов (в данном случае 8 цифр).
int Cryptarithmetic::solve(){
while(!solved()){
for(size_t z = 0; z < 26; z++){
if(letterAssignments[z] != 11) letterAssignments[z] = 10;
}
if(answerNum < 1) return NULL;
size_t curAns = answerNum;
for(int i = 0; i < numDigits; i++){
if(nextUnassigned() != '$') {
size_t nextAssign = curAns % 10;
if(isAssigned(nextAssign)){
answerNum--;
continue;
}
assign(nextUnassigned(), nextAssign);
curAns /= 10;
}
}
answerNum--;
}
return answerNum;
}
Два вспомогательных метода, если вы хотите их увидеть:
char Cryptarithmetic::nextUnassigned(){
char nextUnassigned = '$';
for(int i = 0; i < 26; i++) {
if(letterAssignments[i] == 10) return ('A' + i);
}
}
void Cryptarithmetic::assign(char letter, size_t val){
assert('A' <= letter && letter <= 'Z'); // valid letter
assert(letterAssignments[letter-'A'] != 11); // has this letter
assert(!isAssigned(val)); // not already assigned.
letterAssignments[letter-'A'] = val;
}