我应该如何从map <char,vector <char =“”>&gt;生成每个可能的地图<char,char =“”>组合?</char,> </char,>

时间:2010-03-09 23:56:41

标签: c++ vector map permutation combinations

我希望获取map<char, vector<char> >并从中生成每个map<char, char>

据我所知,这可能会占用大量内存并花费一些时间。

每个map<char, char>需要包含每个字母a-z,并映射到唯一的a-z字符。即。 AK BJ CP DY EV FH GA HB IR JQ KN 里 MX NC OO PZ QS RL SD TE UW VF WG XM 宇 ZT

以下是我迄今为止总结的结论:

如果vector<char>包含超过5个元素,要将可笑组合的数量减少到较低的数量,我只需将其替换为包含来自我的主人的单个字符的vector<char> '/'原创'map<char, char>

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

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

此“其他”矢量应用于不可能具有唯一a-z字符的情况,或者多个字符具有相同的单个可能字符的情况。

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

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

a:gjkpqvxz
b:gjkpqvxz
c:gjkpqvxyz
d:mw
e:gjkpqvxz
f:nr
g:在 h:cf
我:他的 j:gjkpqvxz
k:r
l:h
m:gjkpqvxz
n:gjkpquvxyz
o:是 p:gjkpqvxz
问:是 r:dl
s:l
t:e
你:dgkpuvy
v:cf
w:bcf
x:dguy
y:f
z:at

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

a: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
问:是 r:d
s:l
t:e
你:dguy
v:c
w:bc
x:dguy
y:f
z:at

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

我正在寻找帮助和指针,从map<char, char>生成map<char, vector<char> >s这样的格式。它们将在函数调用中用作参数。我不确定从哪里开始写一些在一般意义上有效的东西。我可能会用大量的for循环查看每个元素与其他所有元素相对于其他元素等等,我认为这样效率非常低,并且可能有更优雅的方法来解决这样的问题

很抱歉,如果这太过于文字或看起来过于具体或写得不好/被问到。

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

2 个答案:

答案 0 :(得分: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个可能的密钥对某个地图有点过分,每个密钥都必须出现在每个地图中?使用和复制矢量或阵列会相当便宜。

答案 1 :(得分:0)

  

据我所知,这可能会占用大量内存并花费一些时间。

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