- °³¿ä
- »ùÇÃ
- ¸µÅ©
- ´Ù¿î·Îµå
1 °³¿ä
N Â÷¿øÀÇ °ø°£¿¡¼ ÀÓÀÇÀÇ ¿µ¿ª¿¡ Æ÷ÇԵǴ Á¡µéÀ» È¿À²ÀûÀ¸·Î ã±â À§ÇÑ Æ®¸®.
³ëµå Ãß°¡¿Í °Ë»öÀº »ó´çÈ÷ ºü¸£³ª, »èÁ¦°¡ ´À¸®´Ù. Áï µ¿ÀûÀ¸·Î ¿òÁ÷ÀÌ´Â Á¡µéÀ» °ü¸®ÇÏ´Â µ¥¿¡´Â Àû´çÇÏÁö ¾Ê´Ù.
2 »ùÇÃ
//////////////////////////////////////////////////////////////////////////////
/// \class KdTree
/// \brief N Â÷¿øÀÇ °ø°£¿¡¼ ÀÓÀÇÀÇ ¿µ¿ª¿¡ Æ÷ÇԵǴ Á¡µéÀ» È¿À²ÀûÀ¸·Î ã±â
/// À§ÇÑ Æ®¸® ÀÚ·á ±¸Á¶
///
/// T : ÁÂÇ¥¸¦ ³ªÅ¸³»´Â µ¥ »ç¿ëÇÒ µ¥ÀÌÅÍÀÇ Å¸ÀÔ (e.g : int, float...)
/// DIMENSION : Â÷¿øÀÇ ¼ö. ÃÖ¼Ò 1º¸´Ù´Â Ä¿¾ßÇÑ´Ù.
//////////////////////////////////////////////////////////////////////////////
template <class T, int DIMENSION>
class KdTree
{
private:
/// ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ´Â ³ëµå
struct NODE
{
T data[DIMENSION]; ///< ½ÇÁ¦ ÁÂÇ¥
NODE* left; ///< ÁÂÃø ÀÚ½Ä
NODE* right; ///< ¿ìÃø ÀÚ½Ä
/// \brief »ý¼ºÀÚ
/// \param value[DIMENSION]
NODE(const T value[DIMENSION])
: left(NULL), right(NULL)
{
memcpy(data, value, sizeof(T) * DIMENSION);
}
/// \brief ¼Ò¸êÀÚ
~NODE()
{
SAFE_DELETE(left);
SAFE_DELETE(right);
}
};
NODE* m_pRoot; ///< ·çÆ® ³ëµå
public:
/// \brief »ý¼ºÀÚ
KdTree() : m_pRoot(NULL) {}
/// \brief ¼Ò¸êÀÚ
virtual ~KdTree() { SAFE_DELETE(m_pRoot); }
public:
/// \brief ÁÂÇ¥°ªÀ» Æ®¸®¿¡´Ù Áý¾î³Ö´Â´Ù.
/// \param value[DIMENSION] ÁÂÇ¥°ª
void insert(const T value[DIMENSION])
{
insert(value, m_pRoot, 0);
}
/// \brief ƯÁ¤ ¹üÀ§ ¾È¿¡ µé¾î¿À´Â Á¡µéÀ» Ãâ·ÂÇÑ´Ù.
/// \param low[DIMENSION] ¹üÀ§ ÃÖ¼Ò°ª
/// \param high[DIMENSION] ¹üÀ§ ÃÖ´ë°ª
/// \return int ºñ±³ ¿¬»êÀÇ È½¼ö
int search(const T low[DIMENSION], const T high[DIMENSION])
{
return search(low, high, m_pRoot, 0);
}
private:
/// \brief ÁÂÇ¥°ªÀ» Æ®¸®¿¡´Ù Áý¾î³Ö±â À§ÇØ ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ´Â ÇÔ¼ö
/// \param value[DIMENSION] ÁÂÇ¥°ª
/// \param pParent ºÎ¸ð ³ëµå
/// \param level ºñ±³ÇÒ Ãà À妽º
void insert(const T value[DIMENSION], NODE*& pParent, int level)
{
if (pParent == NULL)
{
pParent = new NODE(value);
}
else if (value[level] < pParent->data[level])
{
insert(value, pParent->left, (level + 1) % DIMENSION);
}
else
{
insert(value, pParent->right, (level + 1) % DIMENSION);
}
}
/// \brief ƯÁ¤ ¹üÀ§ ¾È¿¡ µé¾î¿À´Â Á¡µéÀ» Ãâ·ÂÇϱâ À§ÇØ ³»ºÎÀûÀ¸·Î
/// »ç¿ëÇÏ´Â ÇÔ¼ö
/// \param low[DIMENSION] ¹üÀ§ ÃÖ¼Ò°ª
/// \param high[DIMENSION] ¹üÀ§ ÃÖ´ë°ª
/// \param pParent ºÎ¸ð ³ëµå
/// \param level ºñ±³ÇÒ Ãà À妽º
/// \return int ºñ±³ ¿¬»êÀÇ È½¼ö
int search(const T low[DIMENSION], const T high[DIMENSION], NODE* pParent, int level)
{
if (pParent == NULL) return 0;
int comparison = 1;
bool bSuitable = true;
for (int i=0; i<DIMENSION; ++i)
{
if (pParent->data[i] < low[i] || high[i] < pParent->data[i])
{
bSuitable = false;
break;
}
}
if (bSuitable)
{
cout << "(";
for (int i=0; i<DIMENSION; ++i)
{
cout << pParent->data[i];
if (i != DIMENSION - 1) cout << ",";
}
cout << ")" << endl;
}
if (low[level] <= pParent->data[level])
comparison += search(low, high, pParent->left, (level + 1) % DIMENSION);
if (pParent->data[level] <= high[level])
comparison += search(low, high, pParent->right, (level + 1) % DIMENSION);
return comparison;
}
};
void test( )
{
KdTree<int, 3> t;
for( int i = 0; i < 1000; i++ )
{
int it[3] = { i, i, i };
t.insert(it);
}
int low[3] = { 10, 10, 10 };
int high[3] = { 15, 15, 15 };
cout << "=============================" << endl;
int total = t.search(low, high);
cout << "=============================" << endl;
cout << "Total comparison: " << total << endl;
}
3 ¸µÅ©
4 ´Ù¿î·Îµå
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)