r+树

 

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万个文档,

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值