AI笔记: 数学基础之排列与组合

计数原理

1 ) 分类相加

做一件事情,完成它有n类办法,在第一类办法中有m1m_1种不同方法,第二类有m2m_2种不同方法 … 在第n类办法中有mnm_n种不同的方法,完成这件事共有 N=m1+m2+m3+...+mnN = m_1 + m_2 + m_3 + ... + m_n 种不同方法

2 ) 分步相乘

做一件事情,完成它有n个步骤,做第一个步骤有m1m_1种不同方法,第二个步骤有m2m_2种不同方法…做第n个步骤有mnm_n种不同的方法. 那么完成这件事共有 N=m1m2...mnN = m_1 * m_2 * ... * m_n 种不同的方法

排列

1 )概念

  • 排列:从n个不同元素中,任取m(m<=n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列
  • 排列数:从n个不同元素中,取出m(m<=n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数 AnmA_n^m
  • 排列是有序的

2 ) 公式

  • Anm=n(n1)(n2)...(nm+1)A_n^m = n(n-1)(n-2)...(n-m+1)
  • Anm=n!(nm)!A_n^m = \frac{n!}{(n-m)!}
  • Anm=n!A_n^m = n!
  • 规定 0! = 1

组合

1 )概念

  • 组合:从n个不同元素中,任取m(m<=n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合
  • 组合数:从n个不同元素中,取出m(m<=n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数 CnmC_n^m
  • 组合不考虑顺序

2 )公式

  • Cnm=n(n1)(n2)...(nm+1)m!C_n^m = \frac{n(n-1)(n-2)...(n-m+1)}{m!}Cnm=n!m!(nm)!C_n^m = \frac{n!}{m!(n-m)!}
  • Cnm=CnnmC_n^m = C_n^{n-m}
  • 规定 Cn0=1C_n^0 = 1

排列与组合的关系

  • Anm=CnmAmmA_n^m = C_n^m * A_m^m
  • 排列就是先组合再全排列
  • Cnm=AnmAmm=n(n1)...(nm+1)m(m1)...21=n!m!(nm)!C_n^m = \frac{A_n^m}{A_m^m} = \frac{n(n-1)...(n-m+1)}{m(m-1)...2*1} = \frac{n!}{m!(n-m)!} (m <= n)
  • 排列 An+1m=Anm+mAnm1A_{n+1}^m = A_n^m + mA_n^{m-1}
  • 组合 Cn+1m=Cnm+Cnm1C_{n+1}^m = C_n^m + C_n^{m-1}

使用python来测试排列和组合

import itertools

x = list(range(7))
print(x) # [0, 1, 2, 3, 4, 5, 6]

a = itertools.permutations(x, 3)# 测试排列
b = itertools.combinations(x, 3) # 测试组合

print(len(list(a))) # 210
print(len(list(b))) # 35
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章