どのように私はマップから可能なすべてのマップ組み合わせ<文字、ベクトル<文字>>を生成して行くべきですか?

StackOverflow https://stackoverflow.com/questions/2413533

質問

私はmap<char, vector<char> >を取ると、それから、それぞれの可能map<char, char>を生成するのを楽しみにしています。

私は、これは、メモリのかなりの量を使用し、少し時間がかかる場合があります理解します。

map<char, char>は-zのすべての文字が含まれているために、ユニークな-Zの文字にマップすることが必要です。すなわち。 AK BJ CP DY EV FH GA HB IR情報 JQ KN 李 MX NC OO PZ 適量 RL SD TE UW VF WG XM 湯 ZT

ここで私はこれまで自分のために締結したものです。

vector<char>が5つの以上の要素が含まれている場合は、下の量に可能な組み合わせのとんでもない数を削減するために、私は単に私の「マスター」/「オリジナル」vector<char>から単一文字を含むmap<char, char>と交換します。

ないすべての文字は、マップ内のvector<char>sのすべての上に存在することになります。これらの文字が見つかりました。そして、いくつかの「その他」ベクターに貼り付ける必要があります。

これは、1つの文字が(。 - 私はこれについて移動する方法がわからないよつまり、私はから働いている例ではMw)は複数の文字キーのための唯一の可能な文字で文字をも含まれている必要があります。

この「他人のベクトルは、ユニークな-Zの文字、またはどこつ以上の文字が同じで、単一の可能な文字を持っているを持つことができない場合に使用する必要があります。

ここで私がこれまで持っているものの一例です。

私は、次のような、map<char, vector<char> >を服用されます

A:gjkpqvxz
B:gjkpqvxz
C:gjkpqvxyz
D:MW
E:gjkpqvxz
F:NR
G:
で H:CF
I:彼の
J:gjkpqvxz
K:R
L:H
M:gjkpqvxz
N:gjkpquvxyz
O:
です P:gjkpqvxz
Q:
です R:DL
S:L
T:E
U:dgkpuvy
V:CF
W:
BCF X:dguy
Y:F
Zます:

これは私の出発マップです。 5以上の大きな文字のベクトルを切り出し、最良の推測でそれらを交換した後。サイズ1のvector<char>ある場合は、その文字のマッピングが一つだけの組み合わせを持っており、それがユニークでなくなるように、その文字は、他のマッピングで使用することはできません。私はそれをトリミングしています:

:K
B:Jの
C:P
D:MW
E:V
F:N
G:
で H:C
私は:
です J:Q
K:R
L:H
M:X
N:男
O:
です P:Z
Q:
です R:D
S:L
T:E
U:dguy
V:C
W:BCの
X:dguy
Y:F
Zます:

'他人のベクトルは、「O」を含んでいる(私は私が、これは上記の例からMWとして例を含めるべきだと思うことに注意することが重要であると考えています。dはMwが使用されるが、明らかとすることができる唯一の場所であるとして私は他の人のベクトルにこれらを追加する一般的なケースをプログラミングについては移動するかどうかはわかりません。だけでどこかに失われたように他を残して、それらの一方のみを使用することができ、一度使用すると、各文字のために必要があります。)

私はこのようにして、この形式でmap<char, char>からあらゆる可能map<char, vector<char> >sを生成して、ヘルプとポインタを探しています。これらは、関数呼び出しの引数として使用されます。私は一般的な意味で仕事と何かを書き始めるためにどこ本当にわかりません。私はおそらく、私は非常に非効率的だろうと仮定し、他のすべての要素...などなど、に対する他のすべての要素に対してすべての要素を見ループの大量のそれに近づくだろうと、このような問題を解決する、おそらくはるかにエレガントな方法があります。ます。

これはあまりにもテキストっぽいの壁であるか、過度に特定のか下手に書かれたと思われる場合は、

申し訳ありません/尋ねます。

私は、あらゆる支援を感謝します。

役に立ちましたか?

解決

私は私が同時に存在し、それらのすべてを必要としないことを願っていたいと思います。そして、私ができるます:

1)各文字に最初可能要素を割り当てることによって、最初のマップを作成します。

for (char c = 'a'; c <= 'z'; ++c) {  // yes, I assume ASCII
   new_map[c] = old_map[c][0];
}
int indexes[26] = {0};

2)を繰り返し、既存のマップを変更することで、順番に残りのマップを作成します:

++indexes[0];
if (indexes[0] < old_map['a'].size()) {
    new_map['a'] = old_map['a'][indexes[0]];
} else {
    indexes[0] = 0;
    new_map['a'] = old_map['a'][0];
    // "carry the 1" by applying the same increment process to indexes[1]
}
do_something_with(new_map);

do_something_withがマップから「その他」のベクトルを毎回再構築することができ、または他のあなたはそれをあなたが文字を変更するたびに更新することができます。置き換えます:

    new_map['a'] = something;

    char removed = new_map['a'];
    --counts[removed];
    if (counts[removed] == 0) others.add(removed);
    ++counts[something];
    if (counts[something] == 1) others.remove(something);
    new_map['a'] = something;

あなたのトリミングダウンの例で飛ぶべきではわずか約6000の可能性があります。あなたがそれらを必要としなかった場合は実際には、すべて同時にあなたはすべてのステップで、前のマップをコピーすることができ、そしてそれは正確に次の氷河期までは取らないでしょう。

ところで、あなたはマップは、すべてのマップに存在することが要求され、それぞれがわずか26可能なキーのためのビットやり過ぎであると考えがありますか?ベクトルまたは配列を使用し、コピーすることはかなり安くなります。

他のヒント

  

私は、これは、メモリのかなりの量を使用し、少し時間がかかる場合があります理解します。

はい、組み合わせの数は、約403,291,461,000,000,000,000,000,000ある: - )

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top