''' pure storage buddy system bitmap
Given a complete binary tree with nodes of values of either 1 or 0, the following rules always hold:
(1) a node's value is 1 if and only if all its subtree nodes' values are 1
(2) a leaf node can have value either 1 or 0
Implement the following 2 APIs:
set_bit(offset, length), set the bits at range from offset to offset+length-1
clear_bit(offset, length), clear the bits at range from offset to offset+length-1
i.e. The tree is like:
0
/ \
0 1
/ \ / \
1 0 1 1
/\ / \ /
1 1 1 0 1
Since it's complete binary tree, the nodes can be stored in an array:
[0,0,1,1,0,1,1,1,1,1,0,1]
'''
def setbit_down(A, x, n):
if x>=n:
return
if 2*x+1<=n and A[2*x+1]==0:
A[2*x+1]=1
setbit_down(A,2*x+1,n)
if 2*x+2<=n and A[2*x+2]==0:
A[2*x+2]=1
setbit_down(A,2*x+2,n)
def set_bit(A, pos, length):
if not A or pos<0 or length<=0:
return
n = len(A)-1 #last index of A
for x in range(pos, min(n+1,min(pos+length, 2*pos+1))):
# set self
if A[x] == 1:
continue
A[x]=1
# set descendants
setbit_down(A,x,n)
# set ancestors
while x>0:
# make sure its sibling is 1, if its sibling is 0, cannot set ancestors
if (x%2==0 and A[x-1]==1) or (x%2==1 and x<n and A[x+1]==1):
A[(x-1)/2] = 1
x = (x-1)/2
def clear_bit(A, pos, length):
if not A or pos<0 or length<=0:
return
n = len(A)-1 #last index of A
for x in range(pos, min(n+1, pos+length)):
# clear self
if A[x]==0:
continue
A[x]=0
# clear descendants
while 2*x+1<=n:
A[2*x+1] = 0
x=2*x+1
# clear ancestors
while x>0:
if A[(x-1)/2]==0:
break
A[(x-1)/2] = 0
x = (x-1)/2
if __name__=='__main__':
A=[0,0,1,1,0,1,1,1,1,1,0,1]
test_cases = [(2, 3)]
for each_test_case in test_cases:
pos, length = each_test_case
A=[0,0,1,1,0,1,1,1,1,1,0,1]
set_bit(A,pos, length)
print 'after setting bit from ', pos, 'for ', length,'A is: ', A
A=[0,0,1,1,0,1,1,1,1,1,0,1]
clear_bit(A,pos, length)
print 'after clearing bit from ', pos, 'for ', length,'A is: ', A
JycnIHB1cmUgc3RvcmFnZSBidWRkeSBzeXN0ZW0gYml0bWFwCiAgICBHaXZlbiBhIGNvbXBsZXRlIGJpbmFyeSB0cmVlIHdpdGggbm9kZXMgb2YgdmFsdWVzIG9mIGVpdGhlciAxIG9yIDAsIHRoZSBmb2xsb3dpbmcgcnVsZXMgYWx3YXlzIGhvbGQ6CiAgICAoMSkgYSBub2RlJ3MgdmFsdWUgaXMgMSBpZiBhbmQgb25seSBpZiBhbGwgaXRzIHN1YnRyZWUgbm9kZXMnIHZhbHVlcyBhcmUgMQogICAgKDIpIGEgbGVhZiBub2RlIGNhbiBoYXZlIHZhbHVlIGVpdGhlciAxIG9yIDAKICAgIEltcGxlbWVudCB0aGUgZm9sbG93aW5nIDIgQVBJczoKICAgIHNldF9iaXQob2Zmc2V0LCBsZW5ndGgpLCBzZXQgdGhlIGJpdHMgYXQgcmFuZ2UgZnJvbSBvZmZzZXQgdG8gb2Zmc2V0K2xlbmd0aC0xCiAgICBjbGVhcl9iaXQob2Zmc2V0LCBsZW5ndGgpLCBjbGVhciB0aGUgYml0cyBhdCByYW5nZSBmcm9tIG9mZnNldCB0byBvZmZzZXQrbGVuZ3RoLTEKICAgIAogICAgaS5lLiBUaGUgdHJlZSBpcyBsaWtlOgogICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAvICAgICBcCiAgICAgICAgICAgICAwICAgICAgICAxCiAgICAgICAgICAgLyAgXCAgICAgIC8gIFwKICAgICAgICAgIDEgICAgMCAgICAxICAgIDEKICAgICAgICAgL1wgICAvIFwgICAvIAogICAgICAgIDEgIDEgMSAgIDAgMQogICAgICAgIFNpbmNlIGl0J3MgY29tcGxldGUgYmluYXJ5IHRyZWUsIHRoZSBub2RlcyBjYW4gYmUgc3RvcmVkIGluIGFuIGFycmF5OgogICAgICAgIFswLDAsMSwxLDAsMSwxLDEsMSwxLDAsMV0gCiAgICAgICAgCicnJwoKZGVmIHNldGJpdF9kb3duKEEsIHgsIG4pOgogICAgaWYgeD49bjoKICAgICAgICByZXR1cm4KICAgIGlmIDIqeCsxPD1uIGFuZCBBWzIqeCsxXT09MDoKICAgICAgICBBWzIqeCsxXT0xCiAgICAgICAgc2V0Yml0X2Rvd24oQSwyKngrMSxuKQogICAgaWYgMip4KzI8PW4gYW5kIEFbMip4KzJdPT0wOgogICAgICAgIEFbMip4KzJdPTEKICAgICAgICBzZXRiaXRfZG93bihBLDIqeCsyLG4pCiAgICAKCmRlZiBzZXRfYml0KEEsIHBvcywgbGVuZ3RoKToKICAgIGlmIG5vdCBBIG9yIHBvczwwIG9yIGxlbmd0aDw9MDoKICAgICAgICByZXR1cm4KICAgIG4gPSBsZW4oQSktMSAgICAjbGFzdCBpbmRleCBvZiBBCiAgICBmb3IgeCBpbiByYW5nZShwb3MsIG1pbihuKzEsbWluKHBvcytsZW5ndGgsIDIqcG9zKzEpKSk6CiAgICAgICAgIyBzZXQgc2VsZgogICAgICAgIGlmIEFbeF0gPT0gMToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBBW3hdPTEKICAgICAgICAjIHNldCBkZXNjZW5kYW50cwogICAgICAgIHNldGJpdF9kb3duKEEseCxuKQogICAgICAgICMgc2V0IGFuY2VzdG9ycwogICAgICAgIHdoaWxlIHg+MDoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgaXRzIHNpYmxpbmcgaXMgMSwgaWYgaXRzIHNpYmxpbmcgaXMgMCwgY2Fubm90IHNldCBhbmNlc3RvcnMKICAgICAgICAgICAgaWYgKHglMj09MCBhbmQgQVt4LTFdPT0xKSBvciAoeCUyPT0xIGFuZCB4PG4gYW5kIEFbeCsxXT09MSk6CiAgICAgICAgICAgICAgICBBWyh4LTEpLzJdID0gMQogICAgICAgICAgICB4ID0gKHgtMSkvMgoKZGVmIGNsZWFyX2JpdChBLCBwb3MsIGxlbmd0aCk6CiAgICBpZiBub3QgQSBvciBwb3M8MCBvciBsZW5ndGg8PTA6CiAgICAgICAgcmV0dXJuCiAgICBuID0gbGVuKEEpLTEgICAgI2xhc3QgaW5kZXggb2YgQQogICAgZm9yIHggaW4gcmFuZ2UocG9zLCBtaW4obisxLCBwb3MrbGVuZ3RoKSk6CiAgICAgICAgIyBjbGVhciBzZWxmCiAgICAgICAgaWYgQVt4XT09MDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBBW3hdPTAKICAgICAgICAjIGNsZWFyIGRlc2NlbmRhbnRzCiAgICAgICAgd2hpbGUgMip4KzE8PW46CiAgICAgICAgICAgIEFbMip4KzFdID0gMAogICAgICAgICAgICB4PTIqeCsxCiAgICAgICAgIyBjbGVhciBhbmNlc3RvcnMKICAgICAgICB3aGlsZSB4PjA6CiAgICAgICAgICAgIGlmIEFbKHgtMSkvMl09PTA6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBBWyh4LTEpLzJdID0gMAogICAgICAgICAgICB4ID0gKHgtMSkvMgogICAgICAgICAgICAgICAgCmlmIF9fbmFtZV9fPT0nX19tYWluX18nOgogICAgQT1bMCwwLDEsMSwwLDEsMSwxLDEsMSwwLDFdCiAgICB0ZXN0X2Nhc2VzID0gWygyLCAzKV0KICAgIAogICAgZm9yIGVhY2hfdGVzdF9jYXNlIGluIHRlc3RfY2FzZXM6CiAgICAgICAgcG9zLCBsZW5ndGggPSBlYWNoX3Rlc3RfY2FzZSAgICAgICAgCiAgICAgICAgQT1bMCwwLDEsMSwwLDEsMSwxLDEsMSwwLDFdCiAgICAgICAgc2V0X2JpdChBLHBvcywgbGVuZ3RoKQogICAgICAgIHByaW50ICdhZnRlciBzZXR0aW5nIGJpdCBmcm9tICcsIHBvcywgJ2ZvciAnLCBsZW5ndGgsJ0EgaXM6ICcsIEEKICAgICAgICBBPVswLDAsMSwxLDAsMSwxLDEsMSwxLDAsMV0KICAgICAgICBjbGVhcl9iaXQoQSxwb3MsIGxlbmd0aCkKICAgICAgICBwcmludCAnYWZ0ZXIgY2xlYXJpbmcgYml0IGZyb20gJywgcG9zLCAnZm9yICcsIGxlbmd0aCwnQSBpczogJywgQQogICAgICAgIA==