r+树
来源:互联网 发布:百度 mysql 编辑:程序博客网 时间:2024/05/01 12:06
1. 将经纬度填充矩形,最大值和最小值合一,矩形实为线段
2. 查找哈希表是否存在该点
哈希算法是,移位操作,高32位经度,低32位纬度
如果找到该键值,则将ID号填充如该键值下的记录序列
矩形框(经纬度不重复添加入R树)
如果查找不成功,则转步骤3
3. 将矩形填充入R树
4. int InsertRect
插入过程
// 哈希表为经度移位或纬度做为键值
// 将相同的经纬度值的点填入同一序列
// Determine best partition of a node to be split
double
Areas(
uint cut,
BRANCH ba[],
int axis,
uint *cuts)
// 以cut为中心点,沿axis为切分轴切分
{
…
for ( i = 0; i < NODECARD + 1 ; i++ )
// 遍历所有的树枝结点
{
// 找寻包含的矩形
if (ba[i].rect.boundary[axis+2] <= cut)
{
// 枝节点所含的矩形位于切分点左侧
// 如满足左侧则合并rect1中,统计合并矩形个数
// CombineRect函数取俩矩形的并集,涵盖俩矩形
rect1 = CombineRect(&rect1, &ba[i].minrect);
rect1cnt++;
}
else if (ba[i].rect.boundary[axis] >= cut)
{
// 枝节点所含的矩形位于切分点右侧
// 如满足右侧则合并rect2中,统计合并矩形个数
// CombineRect函数取俩矩形的并集,涵盖俩矩形
rect2 = CombineRect(&rect2, &ba[i].minrect);
rect2cnt++;
}
else
{ /* this rect overlaps the cut */
// 如果出现交叉重叠现象
if (ba[i].minrect.boundary[axis+2] <= cut)
rect1 = CombineRect(&rect1, &ba[i].minrect);
else if (ba[i].minrect.boundary[axis] >= cut)
rect2 = CombineRect(&rect2, &ba[i].minrect);
else
{ /* the minrect also overlaps the cut */
temprect = ba[i].minrect;
temprect.boundary[axis+2] = cut;
rect1 = CombineRect(&rect1, &temprect);
temprect = ba[i].minrect;
temprect.boundary[axis] = cut;
rect2 = CombineRect(&rect2, &temprect);
}
rect1cnt++;
rect2cnt++;
*cuts = *cuts + 1;
}
}
if (rect1cnt > NODECARD || rect2cnt > NODECARD)
return MAXAREA;
else
{
/* PrintRect(&rect1);
PrintRect(&rect2); */
return (RectArea(&rect1) + RectArea(&rect2));
}
}
// 决策应该选择切分的方向
bool
Partition ( BRANCH ba[] ,// 所有的枝
int cb, // 枝数
int ff , //
NODECUT *cc ,
NODECUT *dd )
{
…
// 从X轴开始
for ( i=0; i <= cb; i++)
{
for ( j = 0; j <= cb; j++ )
if ( ba[i].rect.boundary[axis] >= ba[j].rect.boundary[axis] )
{
left ++;// 沿X轴统计位于切分点左侧
if (ba[i].rect.boundary[axis] <= ba[j].rect.boundary[ axis + NUMDIMS ] )
right++;
// 沿X轴统计位于切分点右侧或者与切分点矩形重叠
}
else
right++;
if ( ( left <= NODECARD ) &&
( right <= NODECARD ) )
{
area = Areas(ba[i].rect.boundary[axis], ba, axis, &cuts);
dif = abs(left-right);//切差
//选择此切分点,左右矩形数相差大小。
// cc是什么 dd是什么
if (area < minAreas)
{
minAreas = area;
cc->axis = 'x';
cc->cut = ba[i].rect.boundary[axis];
}
if (cuts < minCuts ||
(cuts == minCuts &&
dif < minDif))
{
llll = left;
rrrr = right;
minDif = dif;
minCuts = cuts;
dd->axis = 'x';
dd->cut = ba[i].rect.boundary[axis];
}
}//if//
left = 0;
right = 0;
for (j = 0; j <= cb; j++)
if (ba[i].rect.boundary[axis+NUMDIMS] >= ba[j].rect.boundary[axis])
{
left ++;
// 位于切分点右侧至少与切分点矩形重叠
if (ba[i].rect.boundary[axis+NUMDIMS] <= ba[j].rect.boundary[axis+NUMDIMS])
right++;
//
}
else
right++;
if ( (left<=NODECARD) &&
(right<=NODECARD))
{
area = Areas(ba[i].rect.boundary[axis+NUMDIMS], ba, axis, &cuts);
dif = abs(left-right);
if (area < minAreas)
{
minAreas = area;
cc->axis = 'x';
cc->cut = ba[i].rect.boundary[axis+NUMDIMS];
}
if (cuts < minCuts || (cuts == minCuts && dif < minDif)) {
llll = left;
rrrr = right;
minDif = dif;
minCuts = cuts;
dd->axis = 'x';
dd->cut = ba[i].rect.boundary[axis+NUMDIMS];
}
}
}
axis = YAxis; /* axis is y */
for ( i=0; i<= cb; i++)
{
left = 0;
right = 0;
for (j = 0; j <= cb; j++)
if (ba[i].rect.boundary[axis] >= ba[j].rect.boundary[axis])
{
left ++;
if (ba[i].rect.boundary[axis] <= ba[j].rect.boundary[ axis+NUMDIMS ] )
right++;
}
else
right++;
if ( (left<=NODECARD) &&
(right<=NODECARD))
{
area = Areas(ba[i].rect.boundary[axis], ba, axis, &cuts);
dif = abs(left-right);
/* printf("FIRST Y try/tLEFT=%d/tRIGHT=%d/ti=%d/tArea=%f/tCuts=%d/n",left,right,i,area,cuts); */
if (area < minAreas)
{
minAreas = area;
cc->axis = 'y';
cc->cut = ba[i].rect.boundary[axis];
}
if (cuts < minCuts || (cuts == minCuts && dif < minDif))
{
llll = left;
rrrr = right;
minDif = dif;
minCuts = cuts;
dd->axis = 'y';
dd->cut = ba[i].rect.boundary[axis];
}
}
left = 0;
right = 0;
for (j = 0; j <= cb; j++)
if (ba[i].rect.boundary[axis+NUMDIMS] >= ba[j].rect.boundary[axis])
{
left ++;
if (ba[i].rect.boundary[axis+NUMDIMS] <= ba[j].rect.boundary[axis+NUMDIMS])
right++;
}
else
right++;
if ( (left<=NODECARD) && (right<=NODECARD) )
{
area = Areas(ba[i].rect.boundary[axis+NUMDIMS], ba, axis, &cuts);
dif = abs(left-right);
/* printf("SECOND Y try/tLEFT=%d/tRIGHT=%d/ti=%d/tArea=%f/tCuts=%d/n",left,right,i,area,cuts); */
if (area < minAreas)
{
minAreas = area;
cc->axis = 'y';
cc->cut = ba[i].rect.boundary[axis+NUMDIMS];
}
if (cuts < minCuts || (cuts == minCuts && dif < minDif))
{
llll = left;
rrrr = right;
minDif = dif;
minCuts = cuts;
dd->axis = 'y';
dd->cut = ba[i].rect.boundary[axis+NUMDIMS];
}
}
}
/* printf (" I DECIDE LEFT=%d RIGHT=%d/n",llll,rrrr); */
return true;
}
例如对13447023个文档的经纬度建立索引
1344万个文档,
- r+树
- R树
- R树
- R树
- R树
- R树
- R树
- R树
- R*树(一)
- R*树(二)
- R*树(三)
- R*树(四)
- R树 Rtree
- R树空间索引
- R树相关知识
- R树空间索引
- R树空间索引
- R树空间索引
- 使用samba用linux连接windows
- C# 开发PDA程序中软键盘(sip)覆盖录入区域的解决办法
- 两个文件之间的字符串匹配
- 基于内容的信息存取与MPEG-7
- .net关于xml文件命名空间的解析读取
- r+树
- Java 鼠标事件 plus 图形
- 质量管理八项原则及其应用指南
- 图片连续上下滚动代码JavaScript
- 逆向程序员这么值钱?
- 安装sql server 2008“性能计数器注册表配置单元一致性”失败的解决办法
- Debug和Release之区别
- 2009年5月20日星期三
- C# 转换图形为PCX 格式