当前位置:   article > 正文

C++实现R*树_r tree c++

r tree c++

R*树是对空间数据结构R树的改进

具体见链接中两个文件

链接:https://pan.baidu.com/s/1tq0q0LWUnwWjPl2MxXDmDw?pwd=ff0f 
提取码:ff0f

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <utility>
  5. #include <list>
  6. #include <functional>
  7. #include <stack>
  8. #include <random>
  9. using namespace std;
  10. using namespace std::placeholders;
  11. template <typename T>
  12. struct RStarTreeNode
  13. {
  14. vector<vector<pair<T, T>>> enclosed_rectangle_group;
  15. vector<RStarTreeNode<T> *> pointer_to_sub_tree;
  16. RStarTreeNode(const size_t M) :enclosed_rectangle_group(), pointer_to_sub_tree() { enclosed_rectangle_group.reserve(M + 1); pointer_to_sub_tree.reserve(M + 1); }
  17. };
  18. template <typename T>
  19. class Sort_for_interval_and_dimension
  20. {
  21. public:
  22. bool operator()(const size_t left, const size_t right)
  23. {
  24. if (left_point_or_right_point)
  25. {
  26. return enclosed_rectangle_group[left][d].first < enclosed_rectangle_group[right][d].first;
  27. }
  28. else
  29. {
  30. return enclosed_rectangle_group[left][d].second < enclosed_rectangle_group[right][d].second;
  31. }
  32. }
  33. Sort_for_interval_and_dimension(const vector<vector<pair<T, T>>>& e, const size_t d, bool l) :enclosed_rectangle_group(e), d(d), left_point_or_right_point(l) {}
  34. private:
  35. const vector<vector<pair<T, T>>>& enclosed_rectangle_group;
  36. const size_t d;
  37. bool left_point_or_right_point;
  38. };
  39. template <typename T>
  40. struct AssistInfo
  41. {
  42. size_t num;
  43. T endpoint;
  44. AssistInfo() = default;
  45. AssistInfo(size_t n, const T& e) :num(n), endpoint(e) {}
  46. };
  47. template <typename T>
  48. class RStarTree
  49. {
  50. public:
  51. void insertData(vector<pair<T, T>>& be_inserted);
  52. bool remove(vector<pair<T, T>>& key);
  53. bool isRTree();
  54. RStarTree(size_t dm, size_t min, size_t Max, T z, T o, size_t f):d(dm), m(min), M(Max), zero(z), one(o), first_p(f)
  55. {
  56. if (dm == 0)
  57. {
  58. cout << "ERROR:RStarTree维度无效!" << endl;
  59. exit(-1);
  60. }
  61. if (min <= 1 || min > (Max + 1)/2)
  62. {
  63. cout << "ERROR:m或M无效!" << endl;
  64. exit(-1);
  65. }
  66. if (f == 0 || f > M - m + 1)
  67. {
  68. cout << "ERROR:first_p值无效!" << endl;
  69. exit(-1);
  70. }
  71. }
  72. private:
  73. RStarTreeNode<T>* root = nullptr;
  74. const size_t d; //数据维度
  75. const size_t m;
  76. const size_t M;
  77. const T zero;
  78. const T one;
  79. const size_t first_p; //first_p在1到M-M/2+1之间,表示重新插入时要删除的条目数目
  80. size_t height = 0; //R*树高度
  81. void insert(vector<pair<T, T>>& be_inserted, RStarTreeNode<T>* be_inserted_pointer, size_t h, vector<bool> &level_has_overflow_process);
  82. void re_insert(RStarTreeNode<T>* node, size_t h, vector<bool>& level_has_overflow_process, vector<pair<RStarTreeNode<T>*, size_t>>& work_stack, size_t index);
  83. void find_leaf(vector<pair<T, T>>& key, vector<pair<RStarTreeNode<T>*, size_t>> &work_stack, size_t &index, RStarTreeNode<T>* cur); //vector大小初始化为height
  84. pair<pair<vector<pair<T, T>>, vector<pair<T, T>>>, RStarTreeNode<T>*> spilit(RStarTreeNode<T>* node);
  85. size_t chooseSubTree(RStarTreeNode<T>* node, vector<pair<T, T>>& insert);
  86. void upAdjustRect(vector<pair<RStarTreeNode<T>*, size_t>>& work_stack, vector<pair<T, T>>& cur_rect, size_t index);
  87. RStarTreeNode<T>* findNodeInSelectedLevel(size_t h, vector<pair<T, T>> &insert, vector<pair<RStarTreeNode<T>*, size_t>> &work_stack);
  88. bool compute_patial_sort_result(size_t j, vector<size_t>& patial_sort_result_for_different_d, vector<size_t>& sort_result, vector<vector<pair<T, T>>>& enclosed_rectangle_group, bool compare_first);
  89. bool computeRect(vector<pair<T, T>>& left, vector<pair<T, T>>& right);
  90. void computeReactAll(vector<pair<T, T>>& left, vector<size_t>& right , size_t l, size_t r, vector<vector<pair<T, T>>>& enclosed_rectangle_group);
  91. T margin(vector<pair<T, T>>& cur);
  92. void compute_assist(size_t j, vector<size_t>& patial_sort_result_for_different_d, vector<vector<pair<T, T>>>& enclosed_rectangle_group, vector<vector<AssistInfo<T>>>& assist_info_left, vector<vector<size_t>>& rank_left);
  93. void compute_assist_right(size_t j, vector<size_t>& patial_sort_result_for_different_d_right, vector<vector<pair<T, T>>>& enclosed_rectangle_group, vector<vector<AssistInfo<T>>>& assist_info_right, vector<vector<size_t>>& rank_right);
  94. T computeArea(vector<pair<T, T>>& cur);
  95. bool getInterRect(vector<pair<T, T>>& be_filled, vector<pair<T, T>>& A, vector<pair<T, T>>& B);
  96. T compute_margin_sum(bool left_left, size_t i, vector<size_t>& sort_result_left, vector<vector<pair<T, T>>>& enclosed_rectangle_group, vector<vector<AssistInfo<T>>>& assist_info_left_left, vector<vector<size_t>>& rank_left_left, vector<vector<AssistInfo<T>>>& assist_info_left_right, vector<vector<size_t>>& rank_left_right,
  97. vector<pair<vector<pair<T, T>>, vector<pair<T, T>>>>& rect_pair, vector<size_t>& spilit_point_for_every_different_rect_pair);
  98. void findBestSpilit(vector<size_t>& spilit_point_for_every_different_rect_pair, list<pair<vector<pair<T, T>>, vector<pair<T, T>>>>& best_spilit_react, list<size_t>& best_spilit_point, T& best_inter_area, vector<pair<vector<pair<T, T>>, vector<pair<T, T>>>>& left_rect_pair);
  99. bool rectEqual(vector<pair<T, T>>& left, vector<pair<T, T>>& right);
  100. bool rectContain(vector<pair<T, T>>& judge_object, vector<pair<T, T>>& test);
  101. void computeAndAdjust(vector<pair<RStarTreeNode<T>*, size_t>>& work_stack, vector<vector<pair<T, T>>>& cur, size_t m, size_t index);
  102. void deleteAndReinsert(size_t index, vector<pair<RStarTreeNode<T>*, size_t>>& work_stack);
  103. bool checkRTree(RStarTreeNode<T>* cur, bool isRoot, size_t& height, vector<pair<T, T>>& enclosedRect);
  104. void adjustRect(vector<pair<RStarTreeNode<T>*, size_t>>& work_stack, vector<pair<T, T>>& be_inserted, size_t index);
  105. T findBestSpilitPlan(list<pair<vector<pair<T, T>>, vector<pair<T, T>>>>& best_spilit_react, list<size_t>& best_spilit_point, size_t& best_spilit_point_value, pair<vector<pair<T, T>>, vector<pair<T, T>>>& best_spilit_react_pair);
  106. };
  107. template <typename T>
  108. void RStarTree<T>::find_leaf(vector<pair<T, T>>& key, vector<pair<RStarTreeNode<T>*, size_t>>& work_stack, size_t &index, RStarTreeNode<T>* cur) //index可用来判断搜索是否成功
  109. {
  110. if (cur->pointer_to_sub_tree.empty() == false)
  111. {
  112. for (size_t i = 0; i < cur->enclosed_rectangle_group.size(); ++i)
  113. {
  114. if (rectContain(key, cur->enclosed_rectangle_group[i]))
  115. {
  116. work_stack[index] = make_pair(cur, i);
  117. --index;
  118. find_leaf(key, work_stack, index, cur->pointer_to_sub_tree[i]);
  119. if (index == 0)
  120. return;
  121. }
  122. }
  123. }
  124. else
  125. {
  126. for (size_t i = 0; i < cur->enclosed_rectangle_group.size(); ++i)
  127. {
  128. if (rectEqual(key, cur->enclosed_rectangle_group[i]))
  129. {
  130. work_stack[index] = make_pair(cur, i);
  131. return;
  132. }
  133. }
  134. }
  135. ++index;
  136. }
  137. template <typename T>
  138. bool RStarTree<T>::rectEqual(vector<pair<T, T>>& left, vector<pair<T, T>>& right)
  139. {
  140. for (size_t i = 0; i < d; ++i)
  141. {
  142. if (left[i].first != right[i].first || left[i].second != right[i].second)
  143. {
  144. return false;
  145. }
  146. }
  147. return true;
  148. }
  149. template <typename T>
  150. bool RStarTree<T>::rectContain(vector<pair<T, T>>& judge_object, vector<pair<T, T>>& test)
  151. {
  152. for (size_t i = 0; i < d; ++i)
  153. {
  154. if (judge_object[i].first < test[i].first || judge_object[i].second > test[i].second)
  155. {
  156. return false;
  157. }
  158. }
  159. return true;
  160. }
  161. template <typename T>
  162. bool RStarTree<T>::computeRect(vector<pair<T, T>>& left, vector<pair<T, T>>& right)
  163. {
  164. bool equal = true;
  165. for (size_t i = 0; i < d; ++i)
  166. {
  167. if (left[i].first > right[i].first)
  168. {
  169. left[i].first = right[i].first;
  170. equal = false;
  171. }
  172. if (left[i].second < right[i].second)
  173. {
  174. left[i].second = right[i].second;
  175. equal = false;
  176. }
  177. }
  178. return equal;
  179. }
  180. template <typename T>
  181. void RStarTree<T>::computeAndAdjust(vector<pair<RStarTreeNode<T>*, size_t>> &work_stack, vector<vector<pair<T, T>>> &cur, size_t m, size_t index) //
  182. {
  183. vector<pair<T, T>> cur_rect = cur[0];
  184. for (size_t i = 1; i <= m; ++i)
  185. {
  186. computeRect(cur_rect, cur[i]);
  187. }
  188. upAdjustRect(work_stack, cur_rect, index);
  189. }
  190. template <typename T>
  191. void RStarTree<T>::deleteAndReinsert(size_t index, vector<pair<RStarTreeNode<T>*, size_t>> &work_stack)
  192. {
  193. if (index != 0)
  194. {
  195. {
  196. size_t mid = work_stack[0].second;
  197. vector<bool> level_has_overflow_process(height, false);
  198. level_has_overflow_process.back() = true;
  199. for (size_t j = 0; j < work_stack[0].first->enclosed_rectangle_group.size(); ++j)
  200. {
  201. if (j != mid)
  202. {
  203. insert(work_stack[0].first->enclosed_rectangle_group[j], nullptr, 1, level_has_overflow_process);
  204. }
  205. }
  206. delete work_stack[0].first;
  207. }
  208. }
  209. for (size_t i = 1; i < index; ++i)
  210. {
  211. size_t mid = work_stack[i].second;
  212. vector<bool> level_has_overflow_process(height, false);
  213. level_has_overflow_process.back() = true;
  214. for (size_t j = 0; j < work_stack[i].first->enclosed_rectangle_group.size(); ++j)
  215. {
  216. if (j != mid)
  217. {
  218. insert(work_stack[i].first->enclosed_rectangle_group[j], work_stack[i].first->pointer_to_sub_tree[j], i + 1, level_has_overflow_process);
  219. }
  220. }
  221. delete work_stack[i].first;
  222. }
  223. }
  224. template <typename T>
  225. bool RStarTree<T>::remove(vector<pair<T, T>>& key)
  226. {
  227. if (root == nullptr)
  228. return false;
  229. vector<pair<RStarTreeNode<T>*, size_t>> work_stack(height, pair<RStarTreeNode<T>*, size_t>());
  230. size_t index = height - 1; //height
  231. find_leaf(key, work_stack, index, root);
  232. if (index == height)
  233. {
  234. return false;
  235. }
  236. index = 0;
  237. while (true)
  238. {
  239. RStarTreeNode<T>* cur = work_stack[index].first;
  240. if (cur == root || cur->enclosed_rectangle_group.size() > m)
  241. {
  242. size_t i = work_stack[index].second;
  243. cur->enclosed_rectangle_group.erase(cur->enclosed_rectangle_group.begin() + i);
  244. if (index != 0)
  245. {
  246. cur->pointer_to_sub_tree.erase(cur->pointer_to_sub_tree.begin() + i);
  247. }
  248. if (cur != root)
  249. {
  250. vector<pair<T, T>>& enclosed_rectangle_cur = work_stack[index + 1].first->enclosed_rectangle_group[work_stack[index + 1].second];
  251. computeAndAdjust(work_stack, cur->enclosed_rectangle_group, cur->enclosed_rectangle_group.size() - 1, index + 1);
  252. }
  253. else
  254. {
  255. if (height == 1)
  256. {
  257. if (root->enclosed_rectangle_group.empty())
  258. {
  259. delete root;
  260. root = nullptr;
  261. height = 0;
  262. }
  263. return true;
  264. }
  265. else
  266. {
  267. if (root->enclosed_rectangle_group.size() == 1)
  268. {
  269. root = root->pointer_to_sub_tree.back();
  270. delete cur;
  271. --height;
  272. }
  273. }
  274. }
  275. deleteAndReinsert(index, work_stack);
  276. return true;
  277. }
  278. else
  279. {
  280. ++index;
  281. }
  282. }
  283. }
  284. template <typename T>
  285. class Sort_for_central_distance
  286. {
  287. public:
  288. bool operator()(const size_t left, const size_t right)
  289. {
  290. return central_distance[left] > central_distance[right];
  291. }
  292. Sort_for_central_distance(const vector<T>& e): central_distance(e) {}
  293. private:
  294. const vector<T>& central_distance;
  295. };
  296. template <typename T>
  297. void RStarTree<T>::upAdjustRect(vector<pair<RStarTreeNode<T>*, size_t>>& work_stack, vector<pair<T, T>> &cur_rect, size_t index)
  298. {
  299. RStarTreeNode<T>* cur = work_stack[index].first;
  300. enum class need_compute {need, noneed, unknown};
  301. vector<need_compute> need_compute(d, need_compute::unknown);
  302. while (true)
  303. {
  304. vector<vector<pair<T, T>>>& enclosed_rectangle_group = cur->enclosed_rectangle_group;
  305. size_t i;
  306. vector<pair<T, T>>& cur_rect_after_change = enclosed_rectangle_group[i = work_stack[index++].second];
  307. bool changed = false;
  308. for (size_t k = 0; k < d; ++k)
  309. {
  310. if (need_compute[k] == need_compute::noneed)
  311. continue;
  312. if (need_compute[k] == need_compute::unknown || need_compute[k] == need_compute::need)
  313. {
  314. if (cur_rect_after_change[k].first != cur_rect[k].first || cur_rect_after_change[k].second != cur_rect[k].second)
  315. {
  316. cur_rect_after_change[k].first = cur_rect[k].first;
  317. cur_rect_after_change[k].second = cur_rect[k].second;
  318. need_compute[k] = need_compute::need;
  319. }
  320. else
  321. need_compute[k] = need_compute::noneed;
  322. }
  323. if (need_compute[k] == need_compute::need)
  324. {
  325. changed = true;
  326. for (size_t j = 0; j < enclosed_rectangle_group.size(); ++j)
  327. {
  328. if (j == i)
  329. continue;
  330. if (cur_rect[k].first > enclosed_rectangle_group[j][k].first)
  331. {
  332. cur_rect[k].first = enclosed_rectangle_group[j][k].first;
  333. }
  334. if (cur_rect[k].second < enclosed_rectangle_group[j][k].second)
  335. {
  336. cur_rect[k].second = enclosed_rectangle_group[j][k].second;
  337. }
  338. }
  339. }
  340. }
  341. if (index == work_stack.size() || changed == false)
  342. break;
  343. cur = work_stack[index].first;
  344. }
  345. }
  346. template <typename T>
  347. void RStarTree<T>::re_insert(RStarTreeNode<T>* node, size_t h, vector<bool>& level_has_overflow_process, vector<pair<RStarTreeNode<T>*, size_t>>& work_stack, size_t index) //重新插入只会重插至非根节点层
  348. {
  349. vector<vector<pair<T, T>>>& enclosed_rectangle_group = node->enclosed_rectangle_group;
  350. vector<pair<T, T>>& enclosed_rectangle_parent = work_stack[index].first->enclosed_rectangle_group[work_stack[index].second];
  351. vector<size_t> sort_result(M + 1);
  352. for (size_t j = 0; j <= M; ++j)
  353. {
  354. sort_result[j] = j;
  355. }
  356. vector<T> central_parent(d);
  357. for (size_t i = 0; i < d; ++i)
  358. {
  359. central_parent[i] = (enclosed_rectangle_parent[i].second + enclosed_rectangle_parent[i].first) / 2;
  360. }
  361. vector<T> central_distance(M + 1, zero);
  362. for (size_t i = 0; i <= M; ++i)
  363. {
  364. for (size_t j = 0; j < d; ++j)
  365. {
  366. T cental_part = (enclosed_rectangle_group[i][j].second + enclosed_rectangle_group[i][j].first) / 2;
  367. T t = max(cental_part, central_parent[j]) - min(cental_part, central_parent[j]);
  368. central_distance[i] += t * t;
  369. }
  370. }
  371. sort(sort_result.begin(), sort_result.end(), Sort_for_central_distance<T>(central_distance));
  372. vector<vector<pair<T, T>>> first_first_p(first_p);
  373. for (size_t i = 0; i < first_p; ++i)
  374. {
  375. first_first_p[i] = enclosed_rectangle_group[sort_result[i]];
  376. }
  377. vector<vector<pair<T, T>>> after_first_p(M + 1 - first_p);
  378. for (size_t i = first_p; i <= M; ++i)
  379. {
  380. after_first_p[i - first_p] = enclosed_rectangle_group[sort_result[i]];
  381. }
  382. computeAndAdjust(work_stack, after_first_p, M - first_p, index);
  383. vector<RStarTreeNode<T>*>& pointer = node->pointer_to_sub_tree;
  384. if (pointer.empty() == false)
  385. {
  386. vector<RStarTreeNode<T>*> first_first_p_p(first_p);
  387. vector<RStarTreeNode<T>*> after_first_p_p(M + 1 - first_p);
  388. for (size_t i = 0; i < first_p; ++i)
  389. {
  390. first_first_p_p[i] = pointer[sort_result[i]];
  391. }
  392. for (size_t i = first_p; i <= M; ++i)
  393. {
  394. after_first_p_p[i - first_p] = pointer[sort_result[i]];
  395. }
  396. pointer = after_first_p_p;
  397. enclosed_rectangle_group = after_first_p;
  398. for (size_t i = 0; i < first_p; ++i)
  399. {
  400. insert(first_first_p[i], first_first_p_p[i], h, level_has_overflow_process);
  401. }
  402. }
  403. else
  404. {
  405. enclosed_rectangle_group = after_first_p;
  406. for (size_t i = 0; i < first_p; ++i)
  407. {
  408. insert(first_first_p[i], nullptr, h, level_has_overflow_process);
  409. }
  410. }
  411. }
  412. template <typename T>
  413. void RStarTree<T>::insertData(vector<pair<T, T>>& be_inserted)
  414. {
  415. if (root == nullptr)
  416. {
  417. root = new RStarTreeNode<T>(M);
  418. root->enclosed_rectangle_group.push_back(be_inserted);
  419. height = 1;
  420. return;
  421. }
  422. vector<bool> level_has_overflow_process(height, false);
  423. level_has_overflow_process.back() = true;
  424. insert(be_inserted, nullptr, 1, level_has_overflow_process);
  425. }
  426. template<typename T>
  427. void RStarTree<T>::adjustRect(vector<pair<RStarTreeNode<T>*, size_t>> &work_stack, vector<pair<T, T>>& be_inserted, size_t index)
  428. {
  429. while (index != work_stack.size())
  430. {
  431. vector<vector<pair<T, T>>>& enclosed_rectangle_group = work_stack[index].first->enclosed_rectangle_group;
  432. size_t i = work_stack[index++].second;
  433. if (computeRect(enclosed_rectangle_group[i], be_inserted))
  434. {
  435. return;
  436. }
  437. }
  438. }
  439. template <typename T>
  440. void RStarTree<T>::insert(vector<pair<T, T>>& be_inserted, RStarTreeNode<T>* be_inserted_pointer, size_t h, vector<bool>& level_has_overflow_process)
  441. {
  442. vector<pair<RStarTreeNode<T>*, size_t>> work_stack(height - h);
  443. RStarTreeNode<T>* cur = findNodeInSelectedLevel(h, be_inserted, work_stack);
  444. size_t run_h = h;
  445. cur->enclosed_rectangle_group.push_back(be_inserted);
  446. if (be_inserted_pointer != nullptr)
  447. cur->pointer_to_sub_tree.push_back(be_inserted_pointer);
  448. size_t index = 0;
  449. while (true)
  450. {
  451. if (cur->enclosed_rectangle_group.size() <= M)
  452. {
  453. adjustRect(work_stack, be_inserted, index);
  454. return;
  455. }
  456. if (index != work_stack.size())
  457. {
  458. if (level_has_overflow_process[run_h] == false)
  459. {
  460. level_has_overflow_process[run_h] = true;
  461. re_insert(cur, run_h, level_has_overflow_process, work_stack, index);
  462. return;
  463. }
  464. }
  465. pair<pair<vector<pair<T, T>>, vector<pair<T, T>>>, RStarTreeNode<T>*> spilit_result = spilit(cur);
  466. if (index != work_stack.size())
  467. {
  468. vector<vector<pair<T, T>>>& enclosed_rectangle_group = work_stack[index].first->enclosed_rectangle_group;
  469. enclosed_rectangle_group[work_stack[index].second] = spilit_result.first.first;
  470. enclosed_rectangle_group.push_back(spilit_result.first.second);
  471. vector<RStarTreeNode<T>*>& pointer = work_stack[index].first->pointer_to_sub_tree;
  472. if (pointer.empty() == false)
  473. pointer.push_back(spilit_result.second);
  474. cur = work_stack[index++].first;
  475. ++run_h;
  476. }
  477. else
  478. {
  479. root = new RStarTreeNode<T>(M);
  480. root->enclosed_rectangle_group.push_back(spilit_result.first.first);
  481. root->enclosed_rectangle_group.push_back(spilit_result.first.second);
  482. root->pointer_to_sub_tree.push_back(cur);
  483. root->pointer_to_sub_tree.push_back(spilit_result.second);
  484. ++height;
  485. level_has_overflow_process.push_back(true);
  486. return;
  487. }
  488. }
  489. }
  490. template <typename T>
  491. RStarTreeNode<T>* RStarTree<T>::findNodeInSelectedLevel(size_t h, vector<pair<T, T>>& be_inserted, vector<pair<RStarTreeNode<T>*, size_t>> &work_stack)
  492. {
  493. if (h == 0)
  494. {
  495. cerr << "ERRO0R:无效的高度参数" << endl;
  496. exit(-1);
  497. }
  498. if (height == 0)
  499. {
  500. cerr << "空树,搜索失败" << endl;
  501. exit(-1);
  502. }
  503. if (h > height)
  504. {
  505. cerr << "ERRO0R:无效的高度参数" << endl;
  506. exit(-1);
  507. }
  508. RStarTreeNode<T>* p = root;
  509. size_t stack_index = work_stack.size();
  510. while (stack_index != 0)
  511. {
  512. size_t i = chooseSubTree(p, be_inserted);
  513. work_stack[--stack_index] = make_pair(p, i);
  514. p = p->pointer_to_sub_tree[i];
  515. }
  516. return p;
  517. }
  518. template <typename T>
  519. void updateRelatedInfo(size_t i, size_t min_i, vector<size_t> &min_i_area_diff, vector<T> &min_area, T &min_area_diff, const T &a, const T &area_diff)
  520. {
  521. if (i == 0 || min_area_diff > area_diff || min_area_diff == area_diff)
  522. {
  523. if (i == 0 || min_area_diff > area_diff)
  524. {
  525. if (i != 0)
  526. {
  527. min_i_area_diff.clear();
  528. min_area.clear();
  529. }
  530. min_area_diff = area_diff;
  531. }
  532. min_i_area_diff.push_back(min_i);
  533. min_area.push_back(a);
  534. }
  535. }
  536. template <typename T>
  537. size_t RStarTree<T>::chooseSubTree(RStarTreeNode<T>* node, vector<pair<T, T>>& insert)
  538. {
  539. vector<vector<pair<T, T>>>& enclosed_rectangle_group = node->enclosed_rectangle_group;
  540. vector<size_t> min_i; min_i.reserve(enclosed_rectangle_group.size());
  541. vector<size_t> min_i_area_diff;
  542. vector<T> min_area;
  543. if (node->pointer_to_sub_tree[0]->pointer_to_sub_tree.empty())
  544. {
  545. vector<vector<T>> inter_section_area(enclosed_rectangle_group.size(), vector<T>(enclosed_rectangle_group.size()));
  546. T min_add_overlap;
  547. vector<vector<pair<T, T>>> rect_after_insert; rect_after_insert.reserve(enclosed_rectangle_group.size());
  548. vector<bool> contain; contain.reserve(enclosed_rectangle_group.size());
  549. for (size_t i = 0; i < enclosed_rectangle_group.size() - 1; ++i)
  550. {
  551. T sum_area_value = zero;
  552. for (size_t j = i + 1; j < enclosed_rectangle_group.size(); ++j)
  553. {
  554. vector<pair<T, T>> be_filled(d);
  555. if (getInterRect(be_filled, enclosed_rectangle_group[i], enclosed_rectangle_group[j]))
  556. {
  557. T area = computeArea(be_filled);
  558. sum_area_value += area;
  559. inter_section_area[i][j] = area;
  560. }
  561. else
  562. {
  563. inter_section_area[i][j] = zero;
  564. }
  565. }
  566. for (size_t j = 0; j < i; ++j)
  567. {
  568. sum_area_value += inter_section_area[j][i];
  569. }
  570. vector<pair<T, T>> R = enclosed_rectangle_group[i];
  571. T add_overlap;
  572. bool temp;
  573. if ((temp = computeRect(R, insert)) == false)
  574. {
  575. T sum_area_value_after_insert = zero;
  576. for (size_t j = 0; j < enclosed_rectangle_group.size(); ++j)
  577. {
  578. if (j == i)
  579. continue;
  580. vector<pair<T, T>> be_filled(d);
  581. if (getInterRect(be_filled, enclosed_rectangle_group[j], R))
  582. sum_area_value_after_insert += computeArea(be_filled);
  583. }
  584. add_overlap = sum_area_value_after_insert - sum_area_value;
  585. }
  586. else
  587. {
  588. add_overlap = zero;
  589. }
  590. if (i == 0 || min_add_overlap > add_overlap || min_add_overlap == add_overlap)
  591. {
  592. if (i == 0 || min_add_overlap > add_overlap)
  593. {
  594. if (i != 0)
  595. {
  596. min_i.clear();
  597. rect_after_insert.clear();
  598. contain.clear();
  599. }
  600. min_add_overlap = add_overlap;
  601. }
  602. min_i.push_back(i);
  603. if (temp == false)
  604. {
  605. rect_after_insert.push_back(R);
  606. }
  607. contain.push_back(temp);
  608. }
  609. }
  610. size_t j = 0;
  611. T min_area_diff;
  612. min_i_area_diff.reserve(min_i.size());
  613. min_area.reserve(min_i.size());
  614. for (size_t i = 0; i < min_i.size(); ++i)
  615. {
  616. T area_diff;
  617. T a = computeArea(enclosed_rectangle_group[min_i[i]]);
  618. if (contain[i] == false)
  619. {
  620. area_diff = computeArea(rect_after_insert[j++]) - a;
  621. }
  622. else
  623. {
  624. area_diff = zero;
  625. }
  626. updateRelatedInfo(i, min_i[i], min_i_area_diff, min_area, min_area_diff, a, area_diff);
  627. }
  628. }
  629. else
  630. {
  631. T min_area_diff;
  632. min_i_area_diff.reserve(enclosed_rectangle_group.size());
  633. min_area.reserve(enclosed_rectangle_group.size());
  634. for (size_t i = 0; i < enclosed_rectangle_group.size(); ++i)
  635. {
  636. T area_diff;
  637. bool temp;
  638. vector<pair<T, T>> be_filled = enclosed_rectangle_group[i];
  639. T a;
  640. if ((temp = computeRect(be_filled, insert)) == false)
  641. {
  642. area_diff = computeArea(be_filled) - (a = computeArea(enclosed_rectangle_group[i]));
  643. }
  644. else
  645. {
  646. area_diff = zero;
  647. }
  648. updateRelatedInfo(i, i, min_i_area_diff, min_area, min_area_diff, a, area_diff);
  649. }
  650. }
  651. size_t index = min_i_area_diff[0];
  652. T m_area_value = min_area[0];
  653. for (size_t i = 1; i < min_i_area_diff.size(); ++i)
  654. {
  655. if (m_area_value > min_area[i])
  656. {
  657. m_area_value = min_area[i];
  658. index = min_i_area_diff[i];
  659. }
  660. }
  661. return index;
  662. }
  663. template <typename T>
  664. bool RStarTree<T>::compute_patial_sort_result(size_t j, vector<size_t> &patial_sort_result_for_different_d, vector<size_t> &sort_result, vector<vector<pair<T, T>>>& enclosed_rectangle_group, bool compare_first)
  665. {
  666. patial_sort_result_for_different_d.insert(patial_sort_result_for_different_d.end(), sort_result.begin() + m, sort_result.begin() + M + 1 - m + 1);
  667. vector<size_t> patial_sort_result_for_after_m(sort_result.begin() + m, sort_result.end());
  668. sort(patial_sort_result_for_after_m.begin(), patial_sort_result_for_after_m.end(), Sort_for_interval_and_dimension<T>(enclosed_rectangle_group, j, compare_first));
  669. size_t low = 0;
  670. size_t up = M - m;
  671. size_t i = 0;
  672. size_t k;
  673. if (compare_first)
  674. {
  675. sort(patial_sort_result_for_different_d.begin(), patial_sort_result_for_different_d.end(), Sort_for_interval_and_dimension<T>(enclosed_rectangle_group, j, compare_first));
  676. if (patial_sort_result_for_after_m[low] != patial_sort_result_for_different_d.front())
  677. return true;
  678. for (k = low + 1, ++i; i < patial_sort_result_for_different_d.size(); ++k)
  679. {
  680. if (patial_sort_result_for_after_m[k] != patial_sort_result_for_different_d[i])
  681. break;
  682. ++i;
  683. }
  684. }
  685. else
  686. {
  687. sort(patial_sort_result_for_different_d.begin(), patial_sort_result_for_different_d.end(), bind(Sort_for_interval_and_dimension<T>(enclosed_rectangle_group, j, compare_first),_2, _1));
  688. if (patial_sort_result_for_after_m[up] != patial_sort_result_for_different_d.front())
  689. return true;
  690. for (k = up - 1, ++i; i < patial_sort_result_for_different_d.size(); --k)
  691. {
  692. if (patial_sort_result_for_after_m[k] != patial_sort_result_for_different_d[i])
  693. break;
  694. ++i;
  695. }
  696. }
  697. patial_sort_result_for_different_d.erase(patial_sort_result_for_different_d.begin() + i, patial_sort_result_for_different_d.end());
  698. patial_sort_result_for_different_d.push_back(patial_sort_result_for_after_m[k]);
  699. if (compare_first)
  700. reverse(patial_sort_result_for_different_d.begin(), patial_sort_result_for_different_d.end());
  701. return false;
  702. }
  703. template <typename T>
  704. T RStarTree<T>::margin(vector<pair<T, T>>& cur)
  705. {
  706. T sum = zero;
  707. for (size_t i = 0; i < d; ++i)
  708. {
  709. sum += cur[i].second - cur[i].first;
  710. }
  711. return sum;
  712. }
  713. template <typename T>
  714. void RStarTree<T>::computeReactAll(vector<pair<T, T>>& left, vector<size_t>& right, size_t l, size_t r, vector<vector<pair<T, T>>>& enclosed_rectangle_group)
  715. {
  716. left = enclosed_rectangle_group[right[l]];
  717. for (size_t i = l + 1; i <= r; ++i)
  718. {
  719. computeRect(left, enclosed_rectangle_group[right[i]]);
  720. }
  721. }
  722. template <typename T>
  723. void RStarTree<T>::compute_assist(size_t j, vector<size_t>& patial_sort_result_for_different_d, vector<vector<pair<T, T>>>& enclosed_rectangle_group, vector<vector<AssistInfo<T>>>& assist_info_left, vector<vector<size_t>>& rank_left)
  724. {
  725. size_t k = 0;
  726. while (k < patial_sort_result_for_different_d.size())
  727. {
  728. assist_info_left[j].push_back(AssistInfo<T>(1, enclosed_rectangle_group[patial_sort_result_for_different_d[k]][j].first));
  729. while (true)
  730. {
  731. rank_left[j][patial_sort_result_for_different_d[k]] = assist_info_left[j].size() - 1;
  732. if (k >= patial_sort_result_for_different_d.size() - 1 || enclosed_rectangle_group[patial_sort_result_for_different_d[k]][j].first != enclosed_rectangle_group[patial_sort_result_for_different_d[k + 1]][j].first)
  733. {
  734. ++k;
  735. break;
  736. }
  737. ++assist_info_left[j].back().num;
  738. ++k;
  739. }
  740. }
  741. }
  742. template <typename T>
  743. void RStarTree<T>::compute_assist_right(size_t j, vector<size_t>& patial_sort_result_for_different_d_right, vector<vector<pair<T, T>>>& enclosed_rectangle_group, vector<vector<AssistInfo<T>>>& assist_info_right, vector<vector<size_t>>& rank_right)
  744. {
  745. size_t k = 0;
  746. while (k < patial_sort_result_for_different_d_right.size())
  747. {
  748. assist_info_right[j].push_back(AssistInfo<T>(1, enclosed_rectangle_group[patial_sort_result_for_different_d_right[k]][j].second));
  749. while (true)
  750. {
  751. rank_right[j][patial_sort_result_for_different_d_right[k]] = assist_info_right[j].size() - 1;
  752. if (k >= patial_sort_result_for_different_d_right.size() - 1 || enclosed_rectangle_group[patial_sort_result_for_different_d_right[k]][j].second != enclosed_rectangle_group[patial_sort_result_for_different_d_right[k + 1]][j].second)
  753. {
  754. ++k;
  755. break;
  756. }
  757. ++assist_info_right[j].back().num;
  758. ++k;
  759. }
  760. }
  761. }
  762. template <typename T>
  763. T RStarTree<T>::compute_margin_sum(bool left_left, size_t i, vector<size_t> &sort_result_left, vector<vector<pair<T, T>>>& enclosed_rectangle_group, vector<vector<AssistInfo<T>>> &assist_info_left_left, vector<vector<size_t>> &rank_left_left, vector<vector<AssistInfo<T>>>& assist_info_left_right, vector<vector<size_t>>& rank_left_right,
  764. vector<pair<vector<pair<T, T>>, vector<pair<T, T>>>> &rect_pair, vector<size_t> &spilit_point_for_every_different_rect_pair)
  765. {
  766. vector<pair<T, T>> rect_left;
  767. computeReactAll(rect_left, sort_result_left, 0, m - 1, enclosed_rectangle_group);
  768. vector<pair<T, T>> rect_right;
  769. computeReactAll(rect_right, sort_result_left, m, M, enclosed_rectangle_group);
  770. T cur_margin_sum_for_rect_pair_left = margin(rect_left);
  771. T cur_margin_sum_for_rect_pair_right = margin(rect_right);
  772. T margin_sum_value = cur_margin_sum_for_rect_pair_left + cur_margin_sum_for_rect_pair_right;
  773. rect_pair.push_back(make_pair(rect_left, rect_right));
  774. spilit_point_for_every_different_rect_pair.push_back(m - 1);
  775. T cur_margin_sum_for_rect_pair = margin_sum_value;
  776. for (size_t j = m; j <= M - m; ++j)
  777. {
  778. bool equal_left = computeRect(rect_left, enclosed_rectangle_group[sort_result_left[j]]);
  779. bool equal_right = true;
  780. for (size_t q = 0; q < d; ++q)
  781. {
  782. if (q == i)
  783. {
  784. if (assist_info_left_left[q].empty()) ///注意
  785. {
  786. if (left_left && enclosed_rectangle_group[sort_result_left[j]][i].first != enclosed_rectangle_group[sort_result_left[j + 1]][i].first)
  787. {
  788. rect_right[i].first = enclosed_rectangle_group[sort_result_left[j + 1]][i].first;
  789. equal_right = false;
  790. }
  791. if (assist_info_left_right[q].empty())
  792. continue;
  793. }
  794. }
  795. if (assist_info_left_left[q].empty() == false)
  796. {
  797. if (rank_left_left[q][sort_result_left[j]] != M + 1)
  798. {
  799. --assist_info_left_left[q][rank_left_left[q][sort_result_left[j]]].num;
  800. if (enclosed_rectangle_group[sort_result_left[j]][q].first == rect_right[q].first)
  801. {
  802. if (assist_info_left_left[q][rank_left_left[q][sort_result_left[j]]].num == 0)
  803. {
  804. size_t z = rank_left_left[q][sort_result_left[j]] + 1;
  805. for (; ; ++z)
  806. {
  807. if (assist_info_left_left[q][z].num != 0)
  808. break;
  809. }
  810. rect_right[q].first = assist_info_left_left[q][z].endpoint;
  811. equal_right = false;
  812. }
  813. }
  814. }
  815. }
  816. if (assist_info_left_right[q].empty() == false)
  817. {
  818. if (rank_left_right[q][sort_result_left[j]] != M + 1)
  819. {
  820. --assist_info_left_right[q][rank_left_right[q][sort_result_left[j]]].num;
  821. if (enclosed_rectangle_group[sort_result_left[j]][q].second == rect_right[q].second)
  822. {
  823. if (assist_info_left_right[q][rank_left_right[q][sort_result_left[j]]].num == 0)
  824. {
  825. size_t z = rank_left_right[q][sort_result_left[j]] - 1;
  826. for (; ; --z)
  827. {
  828. if (assist_info_left_left[q][z].num != 0)
  829. break;
  830. }
  831. rect_right[q].second = assist_info_left_right[q][z].endpoint;
  832. equal_right = false;
  833. }
  834. }
  835. }
  836. }
  837. }
  838. if (equal_left)
  839. {
  840. if (equal_right == false)
  841. {
  842. cur_margin_sum_for_rect_pair_right = margin(rect_right);
  843. }
  844. }
  845. else
  846. {
  847. if (equal_right)
  848. {
  849. cur_margin_sum_for_rect_pair_left = margin(rect_left);
  850. }
  851. else
  852. {
  853. cur_margin_sum_for_rect_pair_left = margin(rect_left);
  854. cur_margin_sum_for_rect_pair_right = margin(rect_right);
  855. }
  856. }
  857. if (equal_left == false || equal_right == false)
  858. {
  859. cur_margin_sum_for_rect_pair = cur_margin_sum_for_rect_pair_left + cur_margin_sum_for_rect_pair_right;
  860. rect_pair.push_back(make_pair(rect_left, rect_right));
  861. spilit_point_for_every_different_rect_pair.push_back(j);
  862. }
  863. margin_sum_value += cur_margin_sum_for_rect_pair;
  864. }
  865. return margin_sum_value;
  866. }
  867. template <typename T>
  868. pair<size_t, size_t> getIntersection(pair<T, T> l, pair<T, T> j)
  869. {
  870. if (l.second < j.first)
  871. {
  872. return { j.first, l.second};
  873. }
  874. else if (l.first > j.second)
  875. {
  876. return {l.first, j.second};
  877. }
  878. if (j.first <= l.first)
  879. {
  880. if (j.second < l.second)
  881. return { l.first, j.second };
  882. return l;
  883. }
  884. if (j.second <= l.second)
  885. return j;
  886. return { j.first, l.second };
  887. }
  888. template <typename T>
  889. T RStarTree<T>::computeArea(vector<pair<T, T>> &cur)
  890. {
  891. bool zero_s = true;
  892. T add_area = one;
  893. for (size_t i = 0; i < d; ++i)
  894. {
  895. if (cur[i].first < cur[i].second)
  896. {
  897. add_area *= cur[i].second - cur[i].first;
  898. zero_s = false;
  899. }
  900. }
  901. if (zero_s)
  902. return zero;
  903. return add_area;
  904. }
  905. template <typename T>
  906. bool RStarTree<T>::getInterRect(vector<pair<T, T>> &be_filled, vector<pair<T, T>> &A, vector<pair<T, T>> &B)
  907. {
  908. for (size_t i = 0; i < d; ++i)
  909. {
  910. pair<T, T> inter = getIntersection(A[i], B[i]);
  911. if (inter.first > inter.second)
  912. return false;
  913. be_filled[i] = inter;
  914. }
  915. return true;
  916. }
  917. template <typename T>
  918. void RStarTree<T>::findBestSpilit(vector<size_t> &spilit_point_for_every_different_rect_pair, list<pair<vector<pair<T, T>>, vector<pair<T, T>>>> &best_spilit_react, list<size_t> &best_spilit_point, T &best_inter_area, vector<pair<vector<pair<T, T>>, vector<pair<T, T>>>> &left_rect_pair)
  919. {
  920. for (size_t i = 0; i < left_rect_pair.size(); ++i)
  921. {
  922. vector<pair<T, T>> be_filled(d);
  923. T area;
  924. if (getInterRect(be_filled, left_rect_pair[i].first, left_rect_pair[i].second))
  925. {
  926. area = computeArea(be_filled);
  927. }
  928. else
  929. {
  930. area = zero;
  931. }
  932. if (i == 0 || area < best_inter_area || area == best_inter_area)
  933. {
  934. if (i == 0 || area < best_inter_area)
  935. {
  936. if (i != 0)
  937. {
  938. best_spilit_point.clear();
  939. best_spilit_react.clear();
  940. }
  941. best_inter_area = area;
  942. }
  943. best_spilit_point.push_back(spilit_point_for_every_different_rect_pair[i]);
  944. best_spilit_react.push_back(make_pair(left_rect_pair[i].first, left_rect_pair[i].second));
  945. }
  946. }
  947. }
  948. template <typename T>
  949. T RStarTree<T>::findBestSpilitPlan(list<pair<vector<pair<T, T>>, vector<pair<T, T>>>> &best_spilit_react, list<size_t> &best_spilit_point, size_t &best_spilit_point_value, pair<vector<pair<T, T>>, vector<pair<T, T>>> &best_spilit_react_pair)
  950. {
  951. T best_area_sum;
  952. list<size_t>::iterator run2 = best_spilit_point.begin();
  953. typename list<pair<vector<pair<T, T>>, vector<pair<T, T>>>>::iterator run = best_spilit_react.begin();
  954. best_area_sum = computeArea(run->first) + computeArea(run->second);
  955. best_spilit_point_value = best_spilit_point.front();
  956. best_spilit_react_pair = *run;
  957. for (++run, ++run2; run != best_spilit_react.end(); ++run, ++run2)
  958. {
  959. T a = computeArea(run->first) + computeArea(run->second);
  960. if (a < best_area_sum)
  961. {
  962. best_area_sum = a;
  963. best_spilit_point_value = *run2;
  964. best_spilit_react_pair = *run;
  965. }
  966. }
  967. return best_area_sum;
  968. }
  969. template <typename T>
  970. pair<pair<vector<pair<T, T>>, vector<pair<T, T>>>, RStarTreeNode<T>*> RStarTree<T>::spilit(RStarTreeNode<T>* node) //注意该函数中没有删除node节点
  971. {
  972. T d_margin;
  973. vector<size_t> sort_result_best_left;
  974. vector<size_t> sort_result_best_right;
  975. vector<pair<vector<pair<T, T>>, vector<pair<T, T>>>> left_rect_pair;
  976. vector<pair<vector<pair<T, T>>, vector<pair<T, T>>>> right_rect_pair;
  977. vector<size_t> spilit_point_for_every_different_rect_pair_left_best;
  978. vector<size_t> spilit_point_for_every_different_rect_pair_right_best;
  979. vector<vector<pair<T, T>>>& enclosed_rectangle_group = node->enclosed_rectangle_group;
  980. for (size_t i = 0; i < d; ++i)
  981. {
  982. vector<size_t> sort_result_left(M + 1);
  983. vector<size_t> sort_result_right(M + 1);
  984. for (size_t j = 0; j <= M; ++j)
  985. {
  986. sort_result_left[j] = j;
  987. sort_result_right[j] = j;
  988. }
  989. sort(sort_result_left.begin(), sort_result_left.end(), Sort_for_interval_and_dimension<T>(enclosed_rectangle_group, i, true));
  990. sort(sort_result_right.begin(), sort_result_right.end(), Sort_for_interval_and_dimension<T>(enclosed_rectangle_group, i, false));
  991. vector<vector<AssistInfo<T>>> assist_info_left_left(d, vector<AssistInfo<T>>());
  992. vector<vector<AssistInfo<T>>> assist_info_left_right(d, vector<AssistInfo<T>>());
  993. vector<vector<size_t>> rank_left_left(d, vector<size_t>(M + 1, M + 1));
  994. vector<vector<size_t>> rank_left_right(d, vector<size_t>(M + 1, M + 1));
  995. vector<vector<size_t>> rank_right_left(d, vector<size_t>(M + 1, M + 1));
  996. vector<vector<size_t>> rank_right_right(d, vector<size_t>(M + 1, M + 1));
  997. vector<vector<AssistInfo<T>>> assist_info_right_left(d, vector<AssistInfo<T>>());
  998. vector<vector<AssistInfo<T>>> assist_info_right_right(d, vector<AssistInfo<T>>());
  999. for (size_t j = 0; j < d; ++j)
  1000. {
  1001. if (j != i)
  1002. {
  1003. vector<size_t> patial_sort_result_for_different_d_left_left;
  1004. if (compute_patial_sort_result(j, patial_sort_result_for_different_d_left_left, sort_result_left, enclosed_rectangle_group, true) == false)
  1005. {
  1006. compute_assist(j, patial_sort_result_for_different_d_left_left, enclosed_rectangle_group, assist_info_left_left, rank_left_left);
  1007. }
  1008. }
  1009. vector<size_t> patial_sort_result_for_different_d_left_right;
  1010. if (compute_patial_sort_result(j, patial_sort_result_for_different_d_left_right, sort_result_left, enclosed_rectangle_group, false) == false)
  1011. compute_assist(j, patial_sort_result_for_different_d_left_right, enclosed_rectangle_group, assist_info_left_right, rank_left_right);
  1012. if (j != i)
  1013. {
  1014. vector<size_t> patial_sort_result_for_different_d_right_right;
  1015. if (compute_patial_sort_result(j, patial_sort_result_for_different_d_right_right, sort_result_right, enclosed_rectangle_group, false) == false)
  1016. compute_assist_right(j, patial_sort_result_for_different_d_right_right, enclosed_rectangle_group, assist_info_right_right, rank_right_right);
  1017. }
  1018. vector<size_t> patial_sort_result_for_different_d_right_left;
  1019. if (compute_patial_sort_result(j, patial_sort_result_for_different_d_right_left, sort_result_right, enclosed_rectangle_group, true) == false)
  1020. compute_assist_right(j, patial_sort_result_for_different_d_right_left, enclosed_rectangle_group, assist_info_right_left, rank_right_left);
  1021. }
  1022. vector<pair<vector<pair<T, T>>, vector<pair<T, T>>>> left_rect_pair_cur; left_rect_pair_cur.reserve(M + 2 - 2 * m);
  1023. vector<pair<vector<pair<T, T>>, vector<pair<T, T>>>> right_rect_pair_cur; right_rect_pair_cur.reserve(M + 2 - 2 * m);
  1024. vector<size_t> spilit_point_for_every_different_rect_pair_left; spilit_point_for_every_different_rect_pair_left.reserve(M + 2 - 2 * m);
  1025. vector<size_t> spilit_point_for_every_different_rect_pair_right; spilit_point_for_every_different_rect_pair_right.reserve(M + 2 - 2 * m);
  1026. T margin_sum_value = compute_margin_sum(true, i, sort_result_left, enclosed_rectangle_group, assist_info_left_left, rank_left_left, assist_info_left_right, rank_left_right, left_rect_pair_cur, spilit_point_for_every_different_rect_pair_left);
  1027. margin_sum_value += compute_margin_sum(false, i, sort_result_right, enclosed_rectangle_group, assist_info_right_left, rank_right_left, assist_info_right_right, rank_right_right, right_rect_pair_cur, spilit_point_for_every_different_rect_pair_right);
  1028. if (i == 0 || d_margin > margin_sum_value)
  1029. {
  1030. d_margin = margin_sum_value;
  1031. swap(sort_result_best_left, sort_result_left);
  1032. swap(sort_result_best_right, sort_result_right);
  1033. swap(left_rect_pair, left_rect_pair_cur);
  1034. swap(right_rect_pair, right_rect_pair_cur);
  1035. swap(spilit_point_for_every_different_rect_pair_left_best, spilit_point_for_every_different_rect_pair_left);
  1036. swap(spilit_point_for_every_different_rect_pair_right_best, spilit_point_for_every_different_rect_pair_right);
  1037. }
  1038. }
  1039. list<pair<vector<pair<T, T>>, vector<pair<T, T>>>> best_spilit_react;
  1040. list<size_t> best_spilit_point;
  1041. T best_inter_area;
  1042. findBestSpilit(spilit_point_for_every_different_rect_pair_left_best, best_spilit_react, best_spilit_point, best_inter_area, left_rect_pair);
  1043. list<pair<vector<pair<T, T>>, vector<pair<T, T>>>> best_spilit_react_right;
  1044. list<size_t> best_spilit_point_right;
  1045. T best_inter_area_right;
  1046. findBestSpilit(spilit_point_for_every_different_rect_pair_right_best, best_spilit_react_right, best_spilit_point_right, best_inter_area_right, right_rect_pair);
  1047. size_t best_spilit_point_value;
  1048. pair<vector<pair<T, T>>, vector<pair<T, T>>> best_spilit_react_pair;
  1049. vector<size_t> sort_result;
  1050. if (best_inter_area < best_inter_area_right)
  1051. {
  1052. findBestSpilitPlan(best_spilit_react, best_spilit_point, best_spilit_point_value, best_spilit_react_pair);
  1053. sort_result = sort_result_best_left;
  1054. }
  1055. else if (best_inter_area > best_inter_area_right)
  1056. {
  1057. findBestSpilitPlan(best_spilit_react_right, best_spilit_point_right, best_spilit_point_value, best_spilit_react_pair);
  1058. sort_result = sort_result_best_right;
  1059. }
  1060. else
  1061. {
  1062. size_t best_spilit_point_value_right;
  1063. pair<vector<pair<T, T>>, vector<pair<T, T>>> best_spilit_react_pair_right;
  1064. T a_s_l = findBestSpilitPlan(best_spilit_react, best_spilit_point, best_spilit_point_value, best_spilit_react_pair);
  1065. T a_s_r = findBestSpilitPlan(best_spilit_react_right, best_spilit_point_right, best_spilit_point_value_right, best_spilit_react_pair_right);
  1066. if (a_s_r < a_s_l)
  1067. {
  1068. best_spilit_point_value = best_spilit_point_value_right;
  1069. swap(best_spilit_react_pair, best_spilit_react_pair_right);
  1070. swap(sort_result, sort_result_best_right);
  1071. }
  1072. else
  1073. {
  1074. swap(sort_result, sort_result_best_left);
  1075. }
  1076. }
  1077. vector<vector<pair<T, T>>> left;
  1078. vector<RStarTreeNode<T>*> left_p;
  1079. RStarTreeNode<T>* right = new RStarTreeNode<T>(M);
  1080. for (size_t i = 0; i <= best_spilit_point_value; ++i)
  1081. {
  1082. left.push_back(enclosed_rectangle_group[sort_result[i]]);
  1083. if (node->pointer_to_sub_tree.empty() == false)
  1084. {
  1085. left_p.push_back(node->pointer_to_sub_tree[sort_result[i]]);
  1086. }
  1087. }
  1088. for (size_t i = best_spilit_point_value + 1; i <= M; ++i)
  1089. {
  1090. right->enclosed_rectangle_group.push_back(enclosed_rectangle_group[sort_result[i]]);
  1091. if (node->pointer_to_sub_tree.empty() == false)
  1092. {
  1093. right->pointer_to_sub_tree.push_back(node->pointer_to_sub_tree[sort_result[i]]);
  1094. }
  1095. }
  1096. enclosed_rectangle_group = left;
  1097. node->pointer_to_sub_tree = left_p;
  1098. return make_pair(best_spilit_react_pair, right);
  1099. }
  1100. template <typename T>
  1101. bool RStarTree<T>::checkRTree(RStarTreeNode<T>* cur, bool isRoot, size_t &height, vector<pair<T, T>> &enclosedRect)
  1102. {
  1103. if (isRoot)
  1104. {
  1105. if (cur == nullptr)
  1106. return true;
  1107. if (cur->pointer_to_sub_tree.empty())
  1108. {
  1109. if (cur->enclosed_rectangle_group.empty() || cur->enclosed_rectangle_group.size() > M)
  1110. {
  1111. return false;
  1112. }
  1113. }
  1114. else
  1115. {
  1116. if (cur->enclosed_rectangle_group.size() < 2 || cur->enclosed_rectangle_group.size() > M)
  1117. {
  1118. return false;
  1119. }
  1120. }
  1121. }
  1122. else
  1123. {
  1124. if (cur->enclosed_rectangle_group.size() < m || cur->enclosed_rectangle_group.size() > M)
  1125. {
  1126. cout << "大小越界";
  1127. system("pause");
  1128. return false;
  1129. }
  1130. }
  1131. if (cur->pointer_to_sub_tree.empty() == false)
  1132. {
  1133. if (cur->enclosed_rectangle_group.size() != cur->pointer_to_sub_tree.size())
  1134. return false;
  1135. size_t h;
  1136. for (size_t i = 0; i < cur->pointer_to_sub_tree.size(); ++i)
  1137. {
  1138. if (checkRTree(cur->pointer_to_sub_tree[i], false, h, enclosedRect) == false)
  1139. return false;
  1140. if (i == 0)
  1141. {
  1142. height = h;
  1143. }
  1144. else if (h != height)
  1145. {
  1146. cout << "高度不等";
  1147. system("pause");
  1148. return false;
  1149. }
  1150. if (rectEqual(cur->enclosed_rectangle_group[i], enclosedRect) == false)
  1151. {
  1152. cout << "矩形不完全包围";
  1153. system("pause");
  1154. return false;
  1155. }
  1156. }
  1157. }
  1158. if (isRoot == false)
  1159. {
  1160. if (cur->pointer_to_sub_tree.empty())
  1161. {
  1162. enclosedRect = cur->enclosed_rectangle_group.back();
  1163. height = 0;
  1164. }
  1165. for (size_t i = cur->enclosed_rectangle_group.size() - 2; ; --i)
  1166. {
  1167. computeRect(enclosedRect, cur->enclosed_rectangle_group[i]);
  1168. if (i == 0)
  1169. break;
  1170. }
  1171. ++height;
  1172. }
  1173. return true;
  1174. }
  1175. ostream& operator<<(ostream& c, vector<pair<int, int>>& cur)
  1176. {
  1177. for (size_t i = 0; i < cur.size(); ++i)
  1178. {
  1179. cout << "[" << cur[i].first << "," << cur[i].second << "] ";
  1180. }
  1181. return c;
  1182. }
  1183. template <typename T>
  1184. bool RStarTree<T>::isRTree()
  1185. {
  1186. size_t height;
  1187. vector<pair<T, T>> enclosedRect;
  1188. return checkRTree(root, true, height, enclosedRect);
  1189. }
  1190. int main()
  1191. {
  1192. const int N = 20;
  1193. vector<int> test(N);
  1194. for (size_t i = 0; i < N; ++i)
  1195. {
  1196. test[i] = i + 1;
  1197. }
  1198. vector<pair<int, int>> data_rect(N*(N-1)/2);
  1199. size_t j = 0;
  1200. for (size_t i = 0; i < test.size() - 1; ++i)
  1201. {
  1202. for (size_t k = i + 1; k < test.size(); ++k)
  1203. {
  1204. data_rect[j++] = make_pair(test[i], test[k]);
  1205. }
  1206. }
  1207. shuffle(data_rect.begin(), data_rect.end(), default_random_engine());
  1208. vector<vector<pair<int, int>>> insert(data_rect.size() *(data_rect.size() - 1) / 2, vector<pair<int, int>>(2));
  1209. j = 0;
  1210. for (size_t i = 0; i < data_rect.size() - 1; ++i)
  1211. {
  1212. for (size_t k = i + 1; k < data_rect.size(); ++k)
  1213. {
  1214. insert[j][0] = data_rect[i];
  1215. insert[j++][1] = data_rect[k];
  1216. }
  1217. }
  1218. RStarTree<int> obj(2, 2, 3, 0, 1, 2);
  1219. for (size_t i = 0; i < insert.size(); ++i)
  1220. {
  1221. if (i == 70)
  1222. system("pause");
  1223. cout << "插入" << endl;
  1224. cout << insert[i] << endl;
  1225. obj.insertData(insert[i]);
  1226. if (obj.isRTree() == false)
  1227. {
  1228. cout << "Error:不是R树!" << endl;
  1229. exit(-1);
  1230. }
  1231. else
  1232. {
  1233. cout << "当前树是R树" << endl;
  1234. }
  1235. }
  1236. for (size_t i = 0; i < insert.size(); ++i)
  1237. {
  1238. cout << "删除" << endl;
  1239. cout << insert[i] << endl;
  1240. if (obj.remove(insert[i]))
  1241. {
  1242. cout << "删除成功" << endl;
  1243. }
  1244. else
  1245. {
  1246. cout << "删除失败" << endl;
  1247. exit(-1);
  1248. }
  1249. if (obj.isRTree() == false)
  1250. {
  1251. cout << "Error:不是R树!" << endl;
  1252. exit(-1);
  1253. }
  1254. else
  1255. {
  1256. cout << "当前树是R树" << endl;
  1257. }
  1258. }
  1259. return 0;
  1260. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/476025
推荐阅读
相关标签
  

闽ICP备14008679号