PiecePicker.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:5k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // PiecePicker.cpp: implementation of the CPiecePicker class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testbt.h"
  6. #include "PiecePicker.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. void showlong(vector<long> vInsterest);
  13. void showvector(vector<vector<long> > vInsterest);
  14. long randlong(long b, long e);
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CPiecePicker::CPiecePicker(long lPiecesCount)
  19. {
  20. m_lPiecesCount = lPiecesCount;
  21. m_vInterests.push_back(vector<long>());
  22. for (long i=0; i<m_lPiecesCount; i++)
  23. {
  24. m_vNumInterests.push_back(0L);
  25. m_vPosInterest.push_back(i);
  26. m_vInterests[0].push_back(i);
  27. }
  28. m_bGotany = false;
  29. }
  30. CPiecePicker::~CPiecePicker()
  31. {
  32. }
  33. void CPiecePicker::got_have(long index)
  34. {
  35. assert(index < m_vNumInterests.size() && index >= 0 );
  36. if (m_vNumInterests[index] == -1)
  37. return;
  38. long lval = m_vInterests[m_vNumInterests[index]][m_vPosInterest[index]];
  39. assert(lval == index);
  40. vector<long>& vInsterest = m_vInterests[m_vNumInterests[index]];
  41. long lPos = m_vPosInterest[index];
  42. vInsterest[lPos] = vInsterest[vInsterest.size() - 1];
  43. m_vPosInterest[vInsterest[vInsterest.size() - 1]] = lPos;
  44. vInsterest.erase(vInsterest.begin() + (vInsterest.size() - 1));
  45. m_vNumInterests[index]++;
  46. if (m_vInterests.size() <= m_vNumInterests[index])
  47. m_vInterests.push_back(vector<long>());
  48. m_vPosInterest[index] = m_vInterests[m_vNumInterests[index]].size();
  49. m_vInterests[m_vNumInterests[index]].push_back(index);
  50. }
  51. void CPiecePicker::lost_have(long index)
  52. {
  53. assert(index < m_vNumInterests.size() && index >= 0 );
  54. if (m_vNumInterests[index] == -1)
  55. return;
  56. vector<long>& vInsterest = m_vInterests[m_vNumInterests[index]];
  57. long lPos = m_vPosInterest[index];
  58. vInsterest[lPos] = vInsterest[vInsterest.size() - 1];
  59. m_vPosInterest[vInsterest[vInsterest.size() - 1]] = lPos;
  60. vInsterest.erase(vInsterest.begin() + (vInsterest.size() - 1));
  61. m_vNumInterests[index]--;
  62. assert(m_vNumInterests[index] >= 0);
  63. m_vPosInterest[index] = m_vInterests[m_vNumInterests[index]].size();
  64. m_vInterests[m_vNumInterests[index]].push_back(index);
  65. }
  66. void CPiecePicker::came_in(long index)
  67. {
  68. assert(index < m_vNumInterests.size() && index >= 0 );
  69. if (m_vNumInterests[index] == -1)
  70. return;
  71. vector<long>& vInsterest = m_vInterests[m_vNumInterests[index]];
  72. long lPos = m_vPosInterest[index];
  73. vInsterest[lPos] = vInsterest[vInsterest.size() - 1];
  74. m_vPosInterest[vInsterest[vInsterest.size() - 1]] = lPos;
  75. vInsterest.erase(vInsterest.begin() + (vInsterest.size() - 1));
  76. m_vNumInterests[index] = -1;
  77. m_vFixed.push_back(index);
  78. }
  79. void CPiecePicker::complete(long index)
  80. {
  81. m_bGotany = true;
  82. came_in(index);
  83. vector<long>::iterator iter = find(m_vFixed.begin(), m_vFixed.end(), index);
  84. if (iter != m_vFixed.end())
  85. m_vFixed.erase(iter);
  86. }
  87. vector<long> CPiecePicker::GetResult()
  88. {
  89. vector<long> vRet = m_vFixed;
  90. // showlong(vRet);
  91. // showvector(m_vInterests);
  92. for (int i=1; i<m_vInterests.size(); i++)
  93. for (int j=0; j<m_vInterests[i].size(); j++)
  94. {
  95. long x = randlong(j, m_vInterests[i].size()-1);
  96. if (x != j)
  97. {
  98. long last = m_vInterests[i][j];
  99. m_vInterests[i][j] = m_vInterests[i][x];
  100. m_vInterests[i][x] = last;
  101. m_vPosInterest[m_vInterests[i][x]] = x;
  102. m_vPosInterest[m_vInterests[i][j]] = j;
  103. }
  104. vRet.push_back(m_vInterests[i][j]);
  105. }
  106. // showvector(m_vInterests);
  107. return vRet;
  108. }
  109. long randlong(long b, long e)
  110. {
  111. assert(e >= b);
  112. return rand()%(e-b+1) + b;
  113. }
  114. //////////////////////////////////////////////////////
  115. // following for test
  116. void showlong(vector<long> vInsterest)
  117. {
  118. TRACE("rnarray:{");
  119. for (int i=0; i<vInsterest.size(); i++)
  120. {
  121. TRACE("%d,", vInsterest[i]);
  122. }
  123. TRACE("}rn");
  124. }
  125. void showvector(vector<vector<long> > vInsterest)
  126. {
  127. TRACE("rntree:{");
  128. for (int i=0; i<vInsterest.size(); i++)
  129. {
  130. TRACE("{");
  131. for (int j=0; j<vInsterest[i].size(); j++)
  132. {
  133. TRACE("%d,", vInsterest[i][j]);
  134. }
  135. TRACE("}, ");
  136. }
  137. TRACE("}rn");
  138. }
  139. void PiecePickerTest()
  140. {
  141. long l = randlong(0, 10);
  142. l = randlong(0, 10);
  143. l = randlong(0, 10);
  144. l = randlong(0, 0);
  145. l = randlong(0, 0);
  146. /*
  147. CPiecePicker p(10);
  148. p.got_have(0);
  149.     p.got_have(2);
  150. p.GetResult();
  151.     p.got_have(4);
  152.     p.got_have(6);
  153.     p.came_in(1);
  154.     p.came_in(1);
  155.     p.came_in(3);
  156.     p.came_in(0);
  157.     p.came_in(6);
  158. for (int i=0; i<100; i++)
  159. {
  160. vector<long> v = p.GetResult();
  161. showlong(v);
  162. }
  163. return;
  164. //*/
  165. /*
  166. CPiecePicker p(10);
  167. p.got_have(0);
  168.     p.got_have(2);
  169.     p.got_have(4);
  170.     p.got_have(6);
  171.     p.lost_have(2);
  172. p.lost_have(6);
  173. p.GetResult();
  174. //*/
  175. //*
  176. CPiecePicker p(10);
  177. p.complete(8);
  178.     p.got_have(0);
  179.     p.got_have(2);
  180. p.got_have(2);
  181. p.got_have(2);
  182. p.got_have(3);
  183. p.got_have(3);
  184. p.got_have(3);
  185.     p.got_have(4);
  186.     p.got_have(6);
  187.     // p.lost_have(2);
  188. // p.lost_have(2);
  189.     p.lost_have(6);
  190. // p.complete(2);
  191.     for (int i=0; i<100; i++)
  192. {
  193. vector<long> v = p.GetResult();
  194. showlong(v);
  195. }
  196. return;
  197. //*/
  198. /*
  199. CPiecePicker p(1);
  200. p.got_have(0);
  201.     p.complete(0);
  202. p.GetResult();
  203. p.got_have(0);
  204.     p.lost_have(0);
  205. //*/
  206.     
  207. }