Как мне создать каждую возможную карту комбинация из карты >?

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

Вопрос

Я хочу взять map<char, vector<char> > и генерируйте все возможные map<char, char> от него.

Я понимаю, что это может использовать значительное количество памяти и занять немного времени.

Каждый map<char, char> Нужно сдержать каждую букву AZ и быть нанесенным на карту с уникальным символом AZ. т.е. 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

Вот что я до сих пор заключил:

Чтобы сократить смешное количество возможных комбинаций до более низкой суммы, если vector<char> содержит более 5 элементов, я просто замените его на vector<char> Содержит один чар из моего «Мастера»/«Оригинал» 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: в
H: Cf
я: его
J: GJKPQVXZ
K: R.
L: h
М: GJKPQVXZ
N: GJKPQUVXYZ
O: есть
P: GJKPQVXZ
Q: есть
R: DL
S: L.
Т: Е.
u: dgkpuvy
V: CF
W: BCF
X: Dguy
y: f
Z: в

Это моя стартовая карта. После вырезания больших векторов персонажей более 5 и замены их лучшим предположением. Где есть vector<char> Размер 1, это отображение символов имеет только одну комбинацию, и этот символ не может быть использован в любом другом отображении, поскольку оно не сделало бы его не уникальным. Я обрезал это до:

A: K.
B: J.
C: с
D: MW
E: V.
f: n
G: в
H: c
я: есть
J: Q.
K: R.
L: h
М: x
N: Парень
O: есть
P: Z.
Q: есть
R: D.
S: L.
Т: Е.
U: Dguy
V: C.
W: до н.э.
X: Dguy
y: f
Z: в

Вектор «Другие» содержит «О» (я думаю, важно отметить, что я думаю, что это должно содержать такие случаи, как 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 4611 000 000 000 000 000 000 000 :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top