Сэмплирование из weighted histogram

MediumАлгоритмы
04:00
Лучше работает на десктопе
AlgorithmsProbabilityBinary SearchPrefix Sum
Мой собес5:41-19:08Silver Mont HFT Dina.m4aСтраница собеса

Дана гистограмма весов weights, где weights[i] — неотрицательный вес элемента i. Нужно выбирать индекс случайно пропорционально весу.

На собеседовании это формулировалось как live-coding задача про sampling из histogram. В тренажере вместо настоящего RNG передаются детерминированные значения samples из диапазона [0, 1), чтобы тесты были стабильными.

Для каждого sample верните индекс, в чей отрезок cumulative distribution он попадает.

Сигнатура

def weighted_histogram_sample(weights: list[float], samples: list[float]) -> list[int]:

Ограничения

  • len(weights) >= 1
  • хотя бы один вес положительный
  • 0 <= sample < 1 для каждого sample
  • нулевые веса не должны выбираться

Примеры

Пример 1

Вход:
weights = [20,50,30]
samples = [0,0.19,0.2,0.69,0.7,0.99]
Выход:[0,0,1,1,2,2]

Пример 2

Вход:
weights = [1,1,1,1]
samples = [0,0.24,0.25,0.5,0.75]
Выход:[0,0,1,2,3]

Пример 3

Вход:
weights = [0,2,0,3]
samples = [0,0.39,0.4,0.99]
Выход:[1,1,3,3]
Консоль
Нажмите Run или Ctrl+Enter для запуска