剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。
正剧开始:
星历2016年09月08日 13:04:01, 银河系厄尔斯星球中华帝国江南行省。
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。
正剧开始:
星历2016年09月08日 13:04:01, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[计算几何]]。
<span style="font-size:18px;">#
#!/usr/bin/env python
from random import randint, choice
from bisect import bisect_right, bisect_left
from collections import deque
class InitError(Exception):
pass
class ParaError(Exception):
pass
#生成键值对
class KeyValue(object):
__slots__=('key', 'value')
def __init__(self, key, value):
self.key=int(key) #一定要保证键值是整型
self.value=value
def __str__(self):
return str((self.key, self.value))
def __cmp__(self, key):
if self.key>key:
return 1
elif self.key < key:
return -1
else:
return 0
def __lt__(self, other):
if (type(self) == type(other)):
return self.key < other.key;
else:
return int(self.key) < int(other);
def __eq__(self, other):
if (type(self) == type(other)):
return self.key == other.key;
else:
return int(self.key) == int(other);
def __gt__(self, other):
return not self < other;
#B+树实现
#实现过程和btree很像,不过有几点显著不同。
#1.内节点不存储key-value,只存放key
#
#2.沿着内节点搜索的时候,查到索引相等的数要向树的右边走。所以二分查找要选择
#bisect_right
#
#3.在叶子节点满的时候,并不是先分裂再插入而是先插入再分裂。因为b+tree无法保证
#分裂的两个节点的大小都是相等的。在奇数大小的数据分裂的时候右边的子节点会比左
#边的大。如果先分裂再插入无法保证插入的节点一定会插在数量更少的子节点上,满足
#节点数量平衡的条件。
#
#4.在删除数据的时候,b+tree的左右子节点借数据的方式比btree更加简单有效,只把子
#节点的子树直接剪切过来,再把索引变一下就行了,而且叶子节点的兄弟指针也不用动。
#
class Bptree(object):
class __InterNode(object):
def __init__(self, M):
if not isinstance(M, int):
raise InitError('M must be int')
if M<=3:
raise InitError('M must be greater then 3')
else:
self.__M=M
self.clist=[] #存放区间
self.ilist=[] #存放索引/序号
self.par=None