Форум программистов, компьютерный форум, киберфорум
Комбинаторика
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
55 / 40 / 18
Регистрация: 16.12.2019
Сообщений: 149
1

Количество разбиений строки на группы различной длины

16.12.2019, 16:43. Показов 2891. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть строка символов длиной n. Она может быть разбита разделителем на группы длиной m, где 1 <= m <= 2. Например, для строки 'aaa': 'a,a,a' или 'aa,a' или 'a,aa'.

- Прошу подсказать формулу расчета количества разбиений.

Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2019, 16:43
Ответы с готовыми решениями:

Даны три строки различной длины. Напечатать ту из них, где больше гласных латинских букв
прошу помочь! потерял код, найти не могу файл(

Удалить из строки группы одинаковых символов заданной длины
Дана строка S и дано натуральное n. Удалить из строки S все группы длиной n подряд стоящих...

Инициализировать 3 переменных различной длины
Инициализировать 3 переменных различной длины. В программе проинвертировать их и вывести результат...

Вычитание n-разрядных целых чисел различной длины.
Добрый вечер, помогите сделать блок схему на паскале для задачи: Напишите алгоритм вычитания...

10
Эксперт по математике/физике
6358 / 4065 / 1512
Регистрация: 09.10.2009
Сообщений: 7,550
Записей в блоге: 4
16.12.2019, 18:19 2
Лучший ответ Сообщение было отмечено udeep как решение

Решение

Цитата Сообщение от udeep Посмотреть сообщение
на группы длиной m, где 1 <= m <= 2
Судя по примеру, на группы длиной от 1 до m, где m - фиксированное число, например, m=2.

Добавлено через 21 минуту
https://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{k=\left \lceil \frac{n}{m} \right \rceil}^{n}\sum_{i=0}^{\left[\frac{n-k}{m} \right] }\left(-1 \right)^iC_k^iC_{n-mi-1}^{k-1}
k - количество групп. https://www.cyberforum.ru/cgi-bin/latex.cgi?\left \lceil \frac{n}{m} \right \rceil - округление вверх.
1
55 / 40 / 18
Регистрация: 16.12.2019
Сообщений: 149
16.12.2019, 19:53  [ТС] 3
Спасибо. - Пытаюсь осознать...
0
55 / 40 / 18
Регистрация: 16.12.2019
Сообщений: 149
17.12.2019, 09:46  [ТС] 4
Что-то не так...
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from  math import ceil, factorial
 
 
n = 70
m = 2
 
r = 0
for k in range(ceil(n / m), n + 1):
    for j in range(min(k, ceil((n - k - k) / m)) + 1):
        a = factorial(k) / factorial(k - j) / factorial(j)
 
        i = k - 1
        z = n - k - m*j - 1
        b = factorial(z) / factorial(z - i) / factorial(i)
 
        r += -1**j * a * b
        
 
print(r)

Результат: -1.0
0
Эксперт по математике/физике
6358 / 4065 / 1512
Регистрация: 09.10.2009
Сообщений: 7,550
Записей в блоге: 4
17.12.2019, 15:21 5
Лучший ответ Сообщение было отмечено udeep как решение

Решение

udeep, исправил формулу - верхний индекс по i и нижний индекс во 2-м биномильном коэффициенте. Для ваших значений параметров получается https://www.cyberforum.ru/cgi-bin/latex.cgi?3,08 \cdot 10^{14} - слишком большое число для отображения в целом формате.
Проверьте для меньших n. Например, для n=10 должно выйти 89 вариантов (m=2, как у вас).
0
55 / 40 / 18
Регистрация: 16.12.2019
Сообщений: 149
17.12.2019, 16:24  [ТС] 6
Для n=10 результат почему-то получается -805.0

Во втором цикле сделал округление в меньшую сторону, т.к. иначе будет ошибка "factorial() not defined for negative values".
Понятно что отрицательное значение дает: "-1**i". - Но не ясно, где ошибка в коде или в формуле...

Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from  math import ceil, factorial
 
 
n = 10
m = 2
 
r = 0
for k in range(ceil(n / m), n + 1):
    for i in range(int((n - k) / m) + 1):
 
        a = -1**i
 
        b = factorial(k) / factorial(k - i) / factorial(i)
 
        x = k - 1
        y = n - m*i - 1
        c = factorial(y) / factorial(y - x) / factorial(x)
 
        r += a * b * c
        
print(r)


PS. Если есть "правильный" код на любом языке программирования. - Я смогу понять.
0
Эксперт по математике/физике
6358 / 4065 / 1512
Регистрация: 09.10.2009
Сообщений: 7,550
Записей в блоге: 4
17.12.2019, 16:28 7
Лучший ответ Сообщение было отмечено udeep как решение

Решение

VBA в Экселе:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function DoubleSumma(n As Byte, m As Byte) As Double
DoubleSumma = 0
Dim k As Byte, i As Byte
For k = -Int(-n / m) To n
    For i = 0 To Int((n - k) / m)
        DoubleSumma = DoubleSumma + (-1) ^ i * BinomKoef(k, i) * BinomKoef(n - m * i - 1, k - 1)
    Next i
Next k
End Function
 
Function BinomKoef(n As Byte, k As Byte) As Double
BinomKoef = 1
For i = 1 To k
    BinomKoef = BinomKoef * (n - i + 1) / i
Next i
End Function
1
55 / 40 / 18
Регистрация: 16.12.2019
Сообщений: 149
17.12.2019, 17:56  [ТС] 8
Огромное спасибо! Разобрался. - Ступил и не взял "-1" в скобки в выражении "-1**i" и при вычислении "BinomKoef" надо применять целочисленное деление.
Замечу, что реализация функция BinomKoef дает ошибку (начиная с n = 20) по сравнению с: "factorial(n) // factorial(n - k) // factorial(k)" (BinomKoef1)

Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from  math import ceil, factorial
 
 
def BinomKoef(n, k):
    result = 1
    for i in range(1, k + 1):
        result *= (n - i + 1) / i
    return(result)
 
def BinomKoef1(n, k):
    return factorial(n) // factorial(n - k) // factorial(k)
 
def DoubleSumma(n, m):
    result = 0
    for k in range(ceil(n / m), n + 1):
        for i in range(int((n - k) / m) + 1):
            result += (-1)**i * BinomKoef(k, i) * BinomKoef(n - m * i - 1, k - 1)
    return(result)
        
print('n , m: result')
print(' 1, 2:', DoubleSumma(1, 2))
print(' 2, 2:', DoubleSumma(2, 2))
print(' 3, 2:', DoubleSumma(3, 2))
print(' 4, 2:', DoubleSumma(4, 2))
print(' 5, 2:', DoubleSumma(5, 2))
print('10, 2:', DoubleSumma(10, 2))
 
print('20, 2:', DoubleSumma(20, 2), 'Ошибка:', 10946 - DoubleSumma(20, 2))
print('70, 2:', DoubleSumma(70, 2), 'Ошибка:', 308061521170129 - DoubleSumma(70, 2))
n , m: result
1, 2: 1
2, 2: 2.0
3, 2: 3.0
4, 2: 5.0
5, 2: 8.0
10, 2: 89.0
20, 2: 10945.99999999996 Ошибка: 4.001776687800884e-11
70, 2: 308061518514577.0 Ошибка: 2655552.0
0
Эксперт по математике/физике
6358 / 4065 / 1512
Регистрация: 09.10.2009
Сообщений: 7,550
Записей в блоге: 4
17.12.2019, 18:54 9
udeep, в вашей 6-й строке диапазон по i должен быть до k, а не до k+1 - должно выйти произведение https://www.cyberforum.ru/cgi-bin/latex.cgi?1 \cdot \frac{n-1+1}{1} \cdot \frac{n-2+1}{2} \cdot ... \cdot \frac{n-k+1}{k}=\frac{n!}{\left(n-k \right)!k!}, а в вашей версии из-за строки 6 выходит https://www.cyberforum.ru/cgi-bin/latex.cgi?1 \cdot \frac{n-1+1}{1} \cdot \frac{n-2+1}{2} \cdot ... \cdot \frac{n-k-1+1}{k+1}=\frac{n!}{\left(n-k-1 \right)!\left( k+1\right)!}=C_n^{k+1}
В строке 15 обратно верхняя граница по переменной k до n+1 вместо n. Я не знаю Питон, может, верхняя граница не считается? То есть цикл на Питоне for k in range(1, 10): будет вычисляться 10 раз (как я это понимаю) или 9 раз?
0
55 / 40 / 18
Регистрация: 16.12.2019
Сообщений: 149
17.12.2019, 23:41  [ТС] 10
На Питоне for k in range(1, 10): будет вычисляться 9 раз. - Верхняя граница range() всегда не входит в диапазон.

Добавлено через 4 часа 18 минут

Не по теме:


Познакомился с python недавно. - Заинтересовался и вернулся к "студенческой скамье".
Кроме букварей в чем-то помогли бесплатные курсы:
https://stepik.org/course/67/syllabus
https://stepik.org/course/512/syllabus
...

PS. Неправда, что python простой для изучения. Но:
- код короче;
- поддерживаются вычисления с большими числами;
- много различных библиотек для мат.вычислений.

1
55 / 40 / 18
Регистрация: 16.12.2019
Сообщений: 149
18.12.2019, 09:04  [ТС] 11
Наверное, самый оптимальный вариант реализации функции:
Python
1
2
3
4
5
6
7
def BinomKoef2(n, k):
    x = y = 1
    for i in range(1, min(k, n - k) + 1):
        x *= n
        y *= i
        n -= 1
    return x // y
0
18.12.2019, 09:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2019, 09:04
Помогаю со студенческими работами здесь

Лексикографическая Сортировка Цепочек Последовательностей Различной Длины
Необходимо реализовать лексикографический алгоритм сортировки цепочек последовательностей различной...

TClient + TServer + отправление и получение record различной длины
Доброго времени суток. Дано: сервер, клиент, тср. Необходимо: обеспечить передачу типа...

Выравнивание столбцов в файле, содержащем числа различной длины
Всем добра! Вообщем, предстоит мне довольно интересная задачка. Есть файл, в нём произвольное...

Как сделать генератор паролей различной длины от 3 и более в заданном интервале
Как сделать генератор паролей различной длины от 3 и более в заданном интервале (например, цифры...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru