我应该如何去生成每一个可能的地图<字符,字符>组合从地图<字符,矢量<字符>>?

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

我期待从它采取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: - )

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top