Вычисление биномиальных коэффициентов - EcsFlash/DataTypes GitHub Wiki
func BinomialCoefs(n int) []uint64 {
var triangle [][]uint64 //инициализируем двумерный список - он же наш треугольник
triangle = append(triangle, []uint64{1}) // добавляем на вершину треугольника 1
for i := 1; i <= n; i++ {
temp := make([]uint64, i+1) // создаем новую строку, которая затем попадет в треугольник
temp[0], temp[i] = 1, 1 // первый и последний элемент любой строки - 1, ставим их
for j := 1; j < i/2+1; j++ { // идем до середины строки(середину включаем)
temp[j] = triangle[i-1][j-1] + triangle[i-1][j] // jый элемент строки равен сумме j-1 и j элементов предыдущей строки(j >= 1 и j < len текущей строки)
temp[i-j] = temp[j] //коэфы в строке располагаются симметрично
}
triangle = append(triangle, temp) // добавляем получившуюся строку в треугольник
}
return triangle[n] // возвращаем треугольник
}
┌────────────┬────────────────┬──────────────────┬────────────────┐
│ │ Лучший случай │ Средний случай │ Худший случай │
├────────────┼────────────────┼──────────────────┼────────────────┤
│ **Время** │ O(n²) │ O(n²) │ O(n²) │
├────────────┼────────────────┼──────────────────┼────────────────┤
│ **Память** │ O(n²) │ O(n²) │ O(n²) │
└────────────┴────────────────┴──────────────────┴────────────────┘
А можно сократить потребление памяти, храня только текущую и предыдущую строку треугольника:
func BinomialCoefsOpt(n int) []uint64 {
if n == 0 {
return []uint64{1}
}
prev := []uint64{1, 1}
for i := 2; i <= n; i++ {
curr := make([]uint64, i+1)
curr[0], curr[i] = 1, 1
for j := 1; j < i/2+1; j++ {
curr[j] = prev[j-1] + prev[j]
curr[i-j] = curr[j]
}
prev = curr
}
return prev
}
┌────────────┬────────────────┬──────────────────┬────────────────┐
│ │ Лучший случай │ Средний случай │ Худший случай │
├────────────┼────────────────┼──────────────────┼────────────────┤
│ **Время** │ O(n²) │ O(n²) │ O(n²) │
├────────────┼────────────────┼──────────────────┼────────────────┤
│ **Память** │ O(n) │ O(n) │ O(n) │
└────────────┴────────────────┴──────────────────┴────────────────┘