Я несколько дней ломал голову над тем, чтобы выработать уравнение для ряда или замкнутой формы для решения следующей задачи:
В частности: учитывая все строки длины N который рисует из алфавита из L букв (начиная с 'A', например, {A, B}, {A, B, C}, ...), сколько из этих строк содержит подстрокукоторый соответствует шаблону: «А», более 1 не-«А», «А».Стандартное регулярное выражение для этого шаблона будет A[^A][^A]+A
.
. Число возможных строк достаточно простое: L ^ N .Для небольших значений N и L также очень удобно просто создавать все возможные комбинации и использовать регулярное выражение для поиска подстрок, соответствующих шаблону;в R:
all.combinations <- function(N, L) {
apply(
expand.grid(rep(list(LETTERS[1:L]), N)),
1,
paste,
collapse = ''
)
}
matching.pattern <- function(N, L, pattern = 'A[^A][^A]+A') {
sum(grepl(pattern, all.combinations(N, L)))
}
all.combinations(4, 2)
matching.pattern(4, 2)
я придумал следующее, которое работает для N <7: </p>
M <- function(N, L) {
sum(
sapply(
2:(N-2),
function(g) {
(N - g - 1) * (L - 1) ** g * L ** (N - g - 2)
}
)
)
}
К сожалению, это работает только тогда, когда N <7, потому что это просто добавлениекомбинации, которые имеют подстроки A..A, A ... A, A .... A и т. д., и некоторые комбинации, очевидно, имеют несколько совпадающих подстрок (например, A..A..A, A..A ...А), которые учитываются дважды. </p>
Есть предложения?Я также открыт к процедурным решениям, если они не зависят от количества комбинаций (как мой код выше).Я хотел бы иметь возможность вычислить для значений N от 15 до 25 и L от 2 до 10.
Для чего это стоит, вот количество комбинаций и соответствующие комбинации для некоторых значений Nи L, которые можно определить путем генерации всех комбинаций и сопоставления с регулярным выражением:
N L combinations matching
-- - ------------ --------
4 2 16 1
5 2 32 5
6 2 64 17
7 2 128 48
8 2 256 122
9 2 512 290
10 2 1024 659
4 3 81 4
5 3 243 32
6 3 729 172
7 3 2187 760
8 3 6561 2996
9 3 19683 10960
10 3 59049 38076
4 4 256 9
5 4 1024 99
6 4 4096 729
7 4 16384 4410
8 4 65536 23778
9 4 262144 118854
10 4 1048576 563499