以合理有效的方式跟踪“在线”价值流的总体中值。
mediantracker的Python项目详细描述
合理有效地跟踪“在线”价值流的中值 时尚。
用法:
from mediantracker import MedianTracker tracker = MedianTracker() tracker.add(1) tracker.add(2) tracker.add(3) tracker.add(4) assert tracker.lower_median() == 2 assert tracker.upper_median() == 3
MedianTracker支持高效的中值查询和动态查询 添加到值列表中。它提供了上中位数和下中位数 到目前为止看到的所有价值观中。可以跟踪任何__cmp__()对象, 除了数字类型。add()tracker需要log(n)时间 使用n项;lower_median()和upper_median()在常量中运行 时间。由于必须存储所有值,因此内存使用量与 添加值的数目(o(n))。
可以通过MedianTracker上的迭代来访问这些值, 尽管它们不是以任何特定方式订购的:
sum = 0.0 for val in tracker: sum += val mean = sum / len(tracker)
如果要“在线”处理值,请使用此模块,一次一个,作为 它们到达后,需要知道每个新值之后的新中值(或 一批值)。如果你只想知道整个名单的中位数 更有效的线性时间中值(或更一般的第k次最小值 选择)算法。使用此模块需要o(nlogn)时间和 额外的o(n)空间来计算n项的中值。另一方面, 一个MedianTracker只需要o(nlogn+m)时间 n添加和m中间查询,而运行传统的 非增量中值算法m需要o(n*m)次。
最后,一些资料定义了偶数长度列表的中值为 中间两个值的平均值。这是容易和有效的计算 (恒定时间):
tracker = MedianTracker([1, 2, 3, 4]) median = (tracker.lower_median() + tracker.upper_median()) / 2.0 assert median == 2.5