0

我正在寻找并从中map<char, vector<char> >生成每一个可能map<char, char>的结果。

我知道这可能会使用大量内存并需要一些时间。

每个都map<char, char>需要包含每个字母 az,并映射到唯一的 az 字符。IE。ak bj cp dy ev fh ga hb ir jq kn li mx nc oo pz qs rl sd te uw vf wg xm yu zt

到目前为止,这是我为自己得出的结论:

为了将可能组合的荒谬数量减少到较低的数量,如果 avector<char>包含超过 5 个元素,我将简单地将其替换为vector<char>包含来自我的 'master'/'original' 的单个字符的 a map<char, char>

并非所有字符都会出现vector<char>s在地图的所有区域中。需要找到这些字符并将其放入一些“其他”向量中。

这还应该包含一个字符是多个字符键的唯一可能字符的字符(即我正在使用的示例中的 mw - 我不确定如何处理)。

此“其他”向量应用于不可能具有唯一 az 字符或多个字符具有相同的单个可能字符的情况。

这是我到目前为止的一个例子。

我将采取map<char, vector<char> >,例如:

a: gjkpqvxz
b: gjkpqvxz
c: gjkpqvxyz
d: mw
e: gjkpqvxz
f: nr
g: at
h: cf
i: his
j: gjkpqvxz
k: r
l: h
m: gjkpqvxz
n: gjkpquvxyz
o: is
p: gjkpqvxz
q:是
r: dl
s: l
t: e
u: dgkpuvy
v: cf
w:
bcf x: dguy
y: f
z: at

这是我的起始地图。在切出超过 5 个的大字符向量并用最佳猜测替换它们之后。如果 avector<char>的大小为 1,则该字符映射只有一个组合,并且该字符不能用于任何其他映射,因为它会使其不唯一。我已将其修剪为:

a: k
b: j
c: p
d: mw
e: v
f: n
g: at
h: c
i: is
j: q
k: r
l: h
m: x
n: guy
o: is
p: z
q:是
r: d
s: l
t: e
u: dguy
v: c
w: bc
x: dguy
y: f
z: at

'others' 向量包含 'o' (我认为重要的是要注意,我认为这应该包含上面示例中的 mw 等情况。因为 d 是唯一可以使用 mw 的地方,但显然需要每个字母只能使用一次,只能使用其中一个,而另一个则丢失在某个地方。我不知道如何编写一个一般案例来将这些添加到其他向量中。)

我正在寻找帮助和指示,以生成像这样和这种格式的所有可能map<char, char>map<char, vector<char> >s它们将用作函数调用中的参数。我不确定从哪里开始写一些一般意义上的东西。我可能会用大量的 for 循环来处理它.

对不起,如果这太像文字墙,或者看起来过于具体或写得不好/问得不好。

我感谢任何和所有的帮助。

4

2 回答 2

1

我想我希望我不需要它们同时存在。然后我可以:

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 个可能的键的映射有点矫枉过正,每个键都需要出现在每个映射中?使用和复制向量或数组会便宜得多。

于 2010-03-10T00:24:17.930 回答
0

我知道这可能会使用大量内存并需要一些时间。

是的,组合的数量约为 403,291,461,000,000,000,000,000,000 :-)

于 2010-03-10T00:21:18.637 回答