Число возможных результатов для 2 чисел, учитывая, что одно число больше другого - PullRequest
0 голосов
/ 17 января 2010

Я пытаюсь написать алгоритм для расчета результатов. Но мне нужна помощь с комбинаторикой.

Предположим, мне нужно выбрать 2 числа от 1 до 10. Согласно основному правилу подсчета, при отсутствии каких-либо ограничений количество возможных результатов составляет 10 * 10 = 100. (10 возможных результатов при выборе первого числа x 10 возможных результатов при выборе второго).

Какое количество возможных результатов с учетом того, что первое число должно быть больше второго?

Ответы [ 4 ]

11 голосов
/ 17 января 2010

45

Представьте себе сетку из 10х10 пар. Там диагональная линия от 1,1 до 10,10, где A = B, так что это не A> B. Линия делит остальные случаи на две половины: одну с A> B и одну с B B.

6 голосов
/ 17 января 2010

Если вы выберете:

  • 1: от 2 до 10 = 9 возможностей
  • 2: от 3 до 10 = 8 возможностей
  • ...
  • 9: 10 = 1 возможность

So

9 + 8 + ... + 2 + 1 = 45

Это называется арифметическая прогрессия сумма равна:

f(n) = n * (n+1) / 2 = 9 * 10 / 2 = 45
0 голосов
/ 25 сентября 2012

Ваш вопрос подпадает под биномиальный коэффициент. Чтобы рассчитать общее количество уникальных комбинаций из 10 предметов, взятых по 2 за раз, по формуле N! / (K! (N - K)!) Можно использовать. Подключение 10 для N и 2 для K дает 45.

Я написал класс для обработки общих функций для работы с биномиальным коэффициентом, к которому относится данная проблема. Он выполняет следующие задачи:

  1. Выводит все K-индексы в хорошем формате для любого N, выбирающего K, в файл. K-индексы могут быть заменены более описательными строками или буквами. Этот метод делает решение этого типа проблемы довольно тривиальным.

  2. Преобразует K-индексы в соответствующий индекс записи в отсортированной таблице биномиальных коэффициентов. Этот метод намного быстрее, чем старые опубликованные методы, основанные на итерации Это делается с помощью математического свойства, присущего треугольнику Паскаля. Моя газета говорит об этом. Я считаю, что я первый, кто открыл и опубликовал эту технику, но я могу ошибаться.

  3. Преобразует индекс в отсортированной таблице биномиальных коэффициентов в соответствующие K-индексы.

  4. Использует Mark Dominus метод для вычисления биномиального коэффициента, который с гораздо меньшей вероятностью переполняется и работает с большими числами.

  5. Класс написан на .NET C # и предоставляет способ управления объектами, связанными с проблемой (если таковые имеются), с использованием общего списка. Конструктор этого класса принимает значение bool, называемое InitTable, которое при значении true создаст общий список для хранения управляемых объектов. Если это значение равно false, таблица не будет создана. Таблицу не нужно создавать для выполнения 4 вышеуказанных методов. Методы доступа предоставляются для доступа к таблице.

  6. Существует связанный тестовый класс, который показывает, как использовать класс и его методы. Он был тщательно протестирован с 2 случаями, и никаких известных ошибок нет.

Чтобы прочитать об этом классе и загрузить код, см. Таблицу биномиального коэффициента .

Нетрудно преобразовать этот класс в C ++.

0 голосов
/ 26 января 2011

Я бы сказал

f(n) = n * (n-1) / 2

где n равно числу различных чисел, которые необходимо объединить. Таким образом, для n = 10 это будет:

10 * (10-1) / 2 = 45
...