⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtnode.cpp

📁 实现内存数据库的源代码
💻 CPP
字号:
// -*- Mode: C++ -*-

//         RTnode.cpp
//
// Copyright (c) 1996, Regents of the University of California
// $Header: /usr/local/devel/GiST/libGiST/RTree/RTnode.cpp,v 1.1.1.1 1996/08/06 23:47:25 jmh Exp $


#include <string.h>
#include "RT.h"

GiSTnode *
RTnode::PickSplit()
{
  int i;
  int j;
  double max = -1, tmp;
  int seed1 = -1, seed2 = -1;
  RTkey cover1, cover2, *expand1, *expand2;
  RTnode *rightnode;
  RTentry *tmpentry1, *tmpentry2;
  int rightdeletes = 0, leftdeletes = 0;
  int *rightvec, *leftvec;

  // Guttman's poly-time split algorithm
  // first, pick furthest-distance seeds
  for (i = 0; i < NumEntries(); i++)
    for (j = i+1; j < NumEntries(); j++) {
      tmpentry1 = (RTentry *)((*this)[i].Ptr());
      tmpentry2 = (RTentry *)((*this)[j].Ptr());
      tmp = ((RTkey)tmpentry1->bbox()).dist(tmpentry2->bbox());
      if (tmp > max) {
	seed1 = i;
	seed2 = j;
	max = tmp;
      }
    }
  tmpentry1 = (RTentry *)((*this)[seed1].Ptr());
  tmpentry2 = (RTentry *)((*this)[seed2].Ptr());
  cover1 = tmpentry1->bbox();
  cover2 = tmpentry2->bbox();

  // copy current node into rightnode; we'll delete from the nodes
  // as appropriate
  rightnode = (RTnode *)Copy();

  // now assign entries to the appropriate deletion vectors
  rightvec = new int[NumEntries()];
  leftvec = new int[NumEntries()];
  for (i = 0; i < NumEntries(); i++) {
    if (i == seed1) {
      rightvec[rightdeletes++] = i;
      continue;
    }
    if (i == seed2) {
      leftvec[leftdeletes++] = i;
      continue;
    }
    tmpentry1 = (RTentry *)((*this)[i].Ptr());
    expand1 = cover1.expand(tmpentry1->bbox());
    expand2 = cover2.expand(tmpentry1->bbox());
    if (expand2->area() > expand1->area()) 
      leftvec[leftdeletes++] = i;
    else
      rightvec[rightdeletes++] = i;
    delete expand1;
    delete expand2;
  }

  // given the deletion vectors, do bulk deletes
  DeleteBulk(leftvec, leftdeletes);
  rightnode->DeleteBulk(rightvec, rightdeletes);
  delete leftvec;
  delete rightvec;

  // Return the right node
  return rightnode;
}

GiSTentry * 
RTnode::Union() const
{
  RTentry *u = new RTentry;
  int first = 1;

  u->InitKey();
  for (int i=0; i<NumEntries(); i++) {
      RTentry *rte = (RTentry*) (*this)[i].Ptr();
      if (first || rte->xlower() < u->xlower())
	  u->setxlower(rte->xlower());
      if (first || rte->xupper() > u->xupper())
	  u->setxupper(rte->xupper());
      if (first || rte->ylower() < u->ylower())
	  u->setylower(rte->ylower());
      if (first || rte->yupper() > u->yupper())
	  u->setyupper(rte->yupper());
      first = 0;
  }

  return u;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -