www.pudn.com > OPENCV_SIFT_VC6.rar > MinHeap.cpp


// MinHeap.cpp: implementation of the CMinHeap class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "TestSIFT.h" 
#include "MinHeap.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CMinHeap::CMinHeap() 
{ 
 
} 
 
CMinHeap::~CMinHeap() 
{ 
 
} 
 
void CMinHeap::insert (CMatchInfo info) 
{ 
	m_infos.push_back (info); 
	percolateup (m_infos.size()-1); 
} 
 
CMatchInfo CMinHeap::deleteMin () 
{ 
	CMatchInfo min = m_infos[0]; 
	m_infos[0] = m_infos[m_infos.size()-1]; 
	m_infos.pop_back(); 
	percolatedown (0); 
	return min; 
} 
 
int CMinHeap::getSize () 
{ 
	return m_infos.size(); 
} 
 
void CMinHeap::percolatedown (int i) 
{ 
	while (i*2 < m_infos.size()) 
	{ 
		int downi = i*2; 
		if (downi+1 < m_infos.size()) 
			if (m_infos[downi+1].m_distance < m_infos[downi].m_distance) 
				downi++; 
		if (m_infos[i].m_distance > m_infos[downi].m_distance) 
		{ 
			CMatchInfo tmp = m_infos[i]; 
			m_infos[i] = m_infos[downi]; 
			m_infos[downi] = tmp; 
			i = downi; 
		} 
		else 
			break; 
	} 
} 
 
void CMinHeap::percolateup (int i) 
{ 
	while (i > 0) 
	{ 
		if (m_infos[i].m_distance < m_infos[i/2].m_distance) 
		{ 
			CMatchInfo tmp = m_infos[i]; 
			m_infos[i] = m_infos[i/2]; 
			m_infos[i/2] = tmp; 
			i /= 2; 
		} 
		else 
			break; 
	} 
} 
 
double CMinHeap::get2ndMin() 
{ 
	double secondMin = 1e10; 
	if (m_infos.size() >= 2) 
	{	 
		secondMin = m_infos[1].m_distance; 
		if (m_infos.size() > 2 && secondMin > m_infos[2].m_distance) 
			secondMin = m_infos[2].m_distance;			 
	} 
	return secondMin; 
}