Язык Go. Медиана


Сегодня вспомним, что такое медиана и накодим её нахождение на гошечке. Медиана — это число ровно посередине упорядоченного списка. Весьма полезная штука в статистике; нужна, чтобы получить не среднюю температуру по больнице, а реальное значение 🙂 Например, у нас список 55, 1, 22, 7, 92… чтобы найти медиану:

  1. упорядочиваем его. Получим: 1, 7, 22, 55, 92
  2. ищем то, что посередине.. это 22 (кэп одобряэ)

Если у нас четное количество элементов в списке, то медиана — среднее из суммы двух соседних значений. В общем, вот код самого простого варианта:

package main

import "fmt"

func main() {
	var median float64
	slice := []float64{3, 18, 49, 51, 121, 132}
	sliceLen := len(slice)
	center := sliceLen / 2

	if sliceLen%2 == 0 {
		median = (slice[center-1] + slice[center]) / 2
	} else {
		median = slice[center]
	}

	fmt.Println(median)
}

Упорядочивать список — это отдельная тема для разговора.. есть много разных алгоритмов сортировки (метод пузырька далеко не самый эффективный), потом их покурим в отдельном посте 🙂

А вот еще один вариант программы — где мы уже вводим значения самостоятельно. Эта версия работает только с нечетным числом членов:

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func getN(r *bufio.Reader, nums int) int {

	for i := 1; nums > i; i++ {

		nRaw, err := r.ReadString('\n')
		if err != nil {
			panic(err)
		}

		n, err := strconv.Atoi(strings.TrimSpace(nRaw))
		if err != nil {
			panic(err)
		}

		if i > nums/2 {
			return n
		}
	}

	return 0
}

func main() {
	r := bufio.NewReader(os.Stdin)

	fmt.Println("How much numbers for calc?")

	numsR, err := r.ReadString('\n')
	if err != nil {
		panic(err)
	}
	nums, err := strconv.Atoi(strings.TrimSpace(numsR))
	if err != nil {
		panic(err)
	}

	n := getN(r, nums)

	fmt.Println(n)
}

Домашнее задание: допилите эту версию до того, чтобы она корректно работала не только с нечетными значениями, но и с чётными 😉


Запись опубликована в рубрике Go. Добавьте в закладки постоянную ссылку.

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.