MinHeap.cpp
上传用户:yli86818
上传日期:2014-07-15
资源大小:273k
文件大小:2k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. // MinHeap.cpp: implementation of the CMinHeap class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "TestSIFT.h"
  6. #include "MinHeap.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CMinHeap::CMinHeap()
  16. {
  17. }
  18. CMinHeap::~CMinHeap()
  19. {
  20. }
  21. void CMinHeap::insert (CMatchInfo info)
  22. {
  23. m_infos.push_back (info);
  24. percolateup (m_infos.size()-1);
  25. }
  26. CMatchInfo CMinHeap::deleteMin ()
  27. {
  28. CMatchInfo min = m_infos[0];
  29. m_infos[0] = m_infos[m_infos.size()-1];
  30. m_infos.pop_back();
  31. percolatedown (0);
  32. return min;
  33. }
  34. int CMinHeap::getSize ()
  35. {
  36. return m_infos.size();
  37. }
  38. void CMinHeap::percolatedown (int i)
  39. {
  40. while (i*2 < m_infos.size())
  41. {
  42. int downi = i*2;
  43. if (downi+1 < m_infos.size())
  44. if (m_infos[downi+1].m_distance < m_infos[downi].m_distance)
  45. downi++;
  46. if (m_infos[i].m_distance > m_infos[downi].m_distance)
  47. {
  48. CMatchInfo tmp = m_infos[i];
  49. m_infos[i] = m_infos[downi];
  50. m_infos[downi] = tmp;
  51. i = downi;
  52. }
  53. else
  54. break;
  55. }
  56. }
  57. void CMinHeap::percolateup (int i)
  58. {
  59. while (i > 0)
  60. {
  61. if (m_infos[i].m_distance < m_infos[i/2].m_distance)
  62. {
  63. CMatchInfo tmp = m_infos[i];
  64. m_infos[i] = m_infos[i/2];
  65. m_infos[i/2] = tmp;
  66. i /= 2;
  67. }
  68. else
  69. break;
  70. }
  71. }
  72. double CMinHeap::get2ndMin()
  73. {
  74. double secondMin = 1e10;
  75. if (m_infos.size() >= 2)
  76. {
  77. secondMin = m_infos[1].m_distance;
  78. if (m_infos.size() > 2 && secondMin > m_infos[2].m_distance)
  79. secondMin = m_infos[2].m_distance;
  80. }
  81. return secondMin;
  82. }