[Tutor] calling a variable name

Ricardo Aráoz ricaraoz at gmail.com
Fri Oct 26 01:34:06 CEST 2007


Kent Johnson wrote:
> Dave Kuhlman wrote:
>> On Tue, Oct 23, 2007 at 10:10:24PM -0400, Kent Johnson wrote:
>>
>> [snip]
>>
>>> Perhaps I was a bit hasty.
>>>
>>> Lists are implemented as arrays of references. I believe they are
>>> - amortized O(1) for append - occasionally the list must be reallocated 
>>> and copied
>> OK. I'm groping here.  Wikipedia tells me that O(1) means constant
>> increase.  So, what does "amortized O(1)" mean.
>>
>> My understanding is that appending in lists is optimized in the
>> sense that when more space is needed, Python allocates space for
>> additional elements so that allocation does not need to happen at
>> every append.  Here is a comment from the Python source code
>> (Python-2.5.1/Objects/listobject.c):
>>
>>     /* This over-allocates proportional to the list size, making room
>>      * for additional growth.  The over-allocation is mild, but is
>>      * enough to give linear-time amortized behavior over a long
>>      * sequence of appends() in the presence of a poorly-performing
>>      * system realloc().
>>      * The growth pattern is:  0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
>>      */
>>
>> Hmmm.  There is that "amortized" thing again.  Very suspicious. 
>> For a non-math and non-financial type like me, is it sort of like
>> saying that the costs are averaged out over a sequence of appends?
> 
> Yes, that is exactly right. Most of the time - when there is room at the 
> end of the allocated block - append is O(1) and very fast. Occasionally, 
> when there is not enough room, append is O(n) and slow, requiring the 
> entire list to be copied. Because the size of the new allocation is 
> proportional to the size of the list, the reallocation happens only each 
> 1/n appends, so if you average out the cost of the reallocation, each 
> append is O(1) (with a higher constant). That is what amortized cost 
> means - sometimes the cost is greater than the specified cost but it 
> averages out.
> 
> Note that if the reallocation added a fixed amount of extra space each 
> time the cost would not average out over n inserts and it would not be 
> O(1) amortized cost. It's important that the new allocation be 
> proportional to the existing space.
> 

Actually if you would come to the point you need to make a distinction
between amotized O(1) and O(1) then you will certainly be concerned with
the initial amount of allocation and with the proportional constant.




More information about the Tutor mailing list