random.choices() Suggest that the code confirm that cum_weights sequence is in ascending order

Steven D'Aprano steve+comp.lang.python at pearwood.info
Mon May 14 08:59:12 EDT 2018


On Mon, 14 May 2018 22:27:24 +1000, Chris Angelico wrote:

> On Mon, May 14, 2018 at 9:59 PM, Paul Moore <p.f.moore at gmail.com> wrote:
>> The problem is that supplying cum_weights allows the code to run in
>> O(log n) by using bisection. This is significantly faster on large
>> populations. Adding a test that the cumulative weights are
>> nondecreasing would add an O(n) step to the code.
>>
>>
> Hang on - are the 'n' and 'log n' there referring to the same n?

Yes -- the number of values you are choosing from, hence the number of 
weights.

If there are N values (and N weights), an upfront check would need to 
look at all N of them in the worst case that they were already in non-
descending order. (Of course it can bail out early if the check fails.)

Whereas the choice itself can use bisect to do a binary search of the 
values, which on average takes only log N comparisons.


-- 
Steve




More information about the Python-list mailing list