我应该如何去生成每一个可能的地图<字符,字符>组合从地图<字符,矢量<字符>>?
-
19-09-2019 - |
题
我期待从它采取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
的。这些字符需要找到并投入一些“其他”矢量。
这也应该包含字符,其中一个字符是一个以上的字符键唯一可能的字符(即兆瓦,我从工作的例子 - 我不知道该如何去了解这一点)。
此“其他”向量应该被用于在那里,不可能具有唯一的A-Z字符,或情况下多于一个字符具有相同的,单个的可能接受字符。
下面是什么我到目前为止的例子。
我将冒map<char, vector<char> >
,如:
一个:gjkpqvxz结果 B:gjkpqvxz结果 C:gjkpqvxyz结果 d:MW结果 E:gjkpqvxz结果 F:NR结果 G:在点击 H:CF结果 我:他的结果 记者:gjkpqvxz结果 K:[R结果 L:^ h点击 L:gjkpqvxz结果 N:gjkpquvxyz结果 ○:是点击 电话号码:gjkpqvxz结果 问:点击 R:DL点击 S:升点击 T:ê结果 U:dgkpuvy结果 五:CF结果 女:BCF结果 X:dguy结果 Ÿ:F点击 Z:在
这是我的起始图。切割出的大量特征向量超过5,并与最好的猜测替换它们后。凡为大小为1的vector<char>
,该字符映射只有一个组合,并且该字符无法在其他任何映射来使用,因为它会使它不是唯一的。我已修整它归结为:
一个:K,点击 B:Ĵ结果 Ç:对结果 d:MW结果 E:v结果 F:ñ点击 G:在点击 H:Ç结果 我:是点击 Ĵ:●点击 K:[R结果 L:^ h点击 L:X结果 N:家伙结果 ○:是点击 电话号码:ž结果 问:点击 R:d点击 S:升点击 T:ê结果 U:dguy结果 五:Ç结果 女:BC结果 X:dguy结果 Ÿ: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: - )