データ構造のクラスの暗号演算を解くプログラムを作成しました。教授は、リンクされたノードで構成されるスタックを利用して、どの文字をどの数字に置き換えたかを追跡することを勧めましたが、整数でも同じことができることに気付きました。スタック {A, 1, B, 2, C, 3, D, 4} の代わりに、1234 で同じ情報を保持できます。
しかし、私のプログラムは、彼が私たちに与えた見積もりよりもはるかに遅く実行されているようです. スタックがはるかに効率的に動作する理由を誰かが説明できますか? メソッド (push、pop、top など) を何度も呼び出すのではなく、「ソリューション」にメソッドを 1 つ追加するだけで、より高速になると想定していました。
これは自由回答形式の質問ではないため、クローズしないでください。さまざまな方法で実装できますが、C++ の中心部で、Stack を介してデータにアクセスすると、int に格納して mod によって抽出するよりもパフォーマンスが向上する理由を知りたいと思います。
これは宿題ですが、私は実際に助けを必要としていません。
ありがとう。新しいことを学ぶのが待ちきれません!
編集(いくつかのコードを追加)
letterAssignments はサイズ 26 の int 配列です。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;
}
見たい場合の 2 つのヘルパー メソッド:
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;
}