Advertisement
habur331

Untitled

Apr 5th, 2022
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.25 KB | None | 0 0
  1. import java.text.ParseException;
  2. import java.text.SimpleDateFormat;
  3. import java.util.*;
  4.  
  5. public class Program
  6. {
  7.  
  8. public static void main(String[] args)
  9. {
  10. BTree<Integer, Integer> tree = new BTree<>(3);
  11. Integer number;
  12. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  13.  
  14. for (int i = 1; i <= 6; i++)
  15. {
  16. tree.add(i, i);
  17. }
  18. tree.add(10, 10);
  19.  
  20. }
  21. }
  22.  
  23. interface RangeMap<K, V>
  24. {
  25. int size();
  26.  
  27. boolean isEmpty();
  28.  
  29. void add(K key, V value); // insert new item into the map
  30.  
  31. boolean contains(K key); // check if a key is present
  32.  
  33. V lookup(K key); // lookup a value by the key
  34.  
  35. List<V> lookupRange(K from, K to); // lookup values for a range of keys
  36.  
  37. // optional: remove an item from a map (+1% extra credit)
  38. Object remove(K key);
  39. }
  40.  
  41. class BTree<K extends Comparable<K>, V extends Number> implements RangeMap<K, V>
  42. {
  43. private BNode<K, V> root = null;
  44.  
  45. public final int B;
  46. private int size = 0;
  47.  
  48. static class BNode<K extends Comparable<K>, V extends Number>
  49. {
  50. private final BTree<K, V> tree;
  51. private final int B;
  52. private BNode<K, V> parent;
  53. private final List<Pair<K, V>> nodes;
  54. private final List<BNode<K, V>> children;
  55.  
  56. public BNode(BNode<K, V> parent, BTree<K, V> tree)
  57. {
  58. this.tree = tree;
  59. this.B = tree.B;
  60. this.parent = parent;
  61. this.nodes = new ArrayList<>(B);
  62. this.children = new ArrayList<>(B + 1);
  63. }
  64.  
  65. public void addKey(K newKey, V newValue)
  66. {
  67. if (children.size() == 0)
  68. {
  69. add(newKey, newValue);
  70. }
  71. else
  72. {
  73. //Most left node
  74. if (nodes.get(0).getKey().compareTo(newKey) >= 0)
  75. {
  76. children.get(0).addKey(newKey, newValue);
  77. }
  78.  
  79. if (nodes.size() > 0)
  80. {
  81. //Most right node
  82. if (nodes.get(nodes.size() - 1).getKey().compareTo(newKey) < 0)
  83. {
  84. children.get(children.size() - 1).addKey(newKey, newValue);
  85. }
  86. }
  87.  
  88.  
  89. //nodes.size() <= B-1
  90. for (int i = 1; i < nodes.size(); i++)
  91. {
  92. if (nodes.get(i - 1).getKey().compareTo(newKey) >= 0 && nodes.get(i).getKey().compareTo(newKey) < 0)
  93. {
  94. children.get(i).addKey(newKey, newValue);
  95. }
  96. }
  97. }
  98. }
  99.  
  100. private void add(K newKey, V newValue)
  101. {
  102. this.nodes.add(new Pair<>(newKey, newValue));
  103. nodes.sort(Comparator.comparing(Pair::getKey));
  104.  
  105. if (this.nodes.size() == B)
  106. split();
  107. }
  108.  
  109. private void split()
  110. {
  111. if (nodes.size() == B)
  112. {
  113. int index = B % 2 == 0 ? B / 2 - 1 : B / 2;
  114. Pair<K, V> medianNode = nodes.get(index);
  115.  
  116. BNode<K, V> leftNode = new BNode<>(parent, tree);
  117. /// удаляем ноды слева от пивота и добавляем их группой к детям родителя
  118. for (int i = 0; i < index; i++)
  119. {
  120. //перезаписываем ноды
  121. leftNode.nodes.add(nodes.get(0));
  122. nodes.remove(0);
  123. }
  124.  
  125. // перезаписываем детей в leftNode
  126. if (children.size() != 0)
  127. {
  128. for (int i = 0; i <= index; i++)
  129. {
  130. //перезаписываем детей
  131. leftNode.children.add(children.get(0));
  132. children.remove(0);
  133. }
  134. }
  135. ///Нужно проверить куда он смещает элемент, который был на этом индекс
  136. if (parent == null)
  137. {
  138. BNode<K, V> newParent = new BNode<>(null, tree);
  139. parent = newParent;
  140. leftNode.parent = newParent;
  141. parent.children.add(this);
  142. tree.root = newParent;
  143. }
  144. parent.children.add(parent.children.indexOf(this), leftNode);
  145. parent.nodes.add(medianNode);
  146. // pivot стал нулевым
  147. nodes.remove(0);
  148. parent.nodes.sort(Comparator.comparing(Pair::getKey));
  149.  
  150. parent.split();
  151. }
  152. }
  153.  
  154. public V lookup(K key)
  155. {
  156. int index = -1;
  157. for (int i = 0; i < nodes.size(); i++)
  158. {
  159. if (nodes.get(i).getKey() == key)
  160. index = i;
  161. }
  162.  
  163. V returnValue = null;
  164.  
  165. if (index == -1)
  166. {
  167. if (children.size() > 0)
  168. {
  169. V value;
  170. if (nodes.get(0).getKey().compareTo(key) >= 0)
  171. {
  172. value = children.get(0).lookup(key);
  173. if (value != null)
  174. returnValue = value;
  175. }
  176.  
  177. //Most right node
  178. if (nodes.get(nodes.size() - 1).getKey().compareTo(key) < 0)
  179. {
  180. value = children.get(children.size() - 1).lookup(key);
  181. if (value != null)
  182. returnValue = value;
  183. }
  184.  
  185. //nodes.size() <= B-1
  186. for (int i = 1; i < nodes.size(); i++)
  187. {
  188. if (nodes.get(i - 1).getKey().compareTo(key) >= 0 && nodes.get(i).getKey().compareTo(key) < 0)
  189. {
  190. value = children.get(i).lookup(key);
  191. if (value != null)
  192. returnValue = value;
  193. }
  194. }
  195. }
  196. }
  197. else
  198. returnValue = nodes.get(index).getValue();
  199.  
  200.  
  201. return returnValue;
  202. }
  203.  
  204. public List<V> lookupRange(K left, K right)
  205. {
  206. List<V> answer = new ArrayList<V>();
  207.  
  208. if (children.size() != 0)
  209. {
  210. /// these nodes do NOT contain keys in range
  211. //most left case
  212. if (nodes.get(0).getKey().compareTo(right) > 0)
  213. answer.addAll(children.get(0).lookupRange(left, right));
  214. // most right case
  215. else if (nodes.get(nodes.size() - 1).getKey().compareTo(left) < 0)
  216. answer.addAll(children.get(children.size() - 1).lookupRange(left, right));
  217. ///
  218.  
  219. else
  220. {
  221. /// these nodes contain keys in range
  222. if (nodes.get(0).getKey().compareTo(left) >= 0) {
  223. answer.addAll(children.get(0).lookupRange(left, right));
  224. if (nodes.get(0).getKey().compareTo(right) <= 0)
  225. answer.add(nodes.get(0).getValue());
  226. }
  227.  
  228. for (int i = 0; i < nodes.size(); i++)
  229. {
  230. // go to left
  231. if (nodes.get(i).getKey().compareTo(left) >= 0 && nodes.get(i).getKey().compareTo(right) <= 0)
  232. {
  233. answer.addAll(children.get(i).lookupRange(left, right));
  234. if (nodes.get(i).getKey().compareTo(right) <= 0)
  235. answer.add(nodes.get(i).getValue());
  236. }
  237. }
  238. //most right
  239. if ((nodes.get(nodes.size() - 1).getKey().compareTo(right) < 0))
  240. {
  241. // answer.add(nodes.get(nodes.size() - 1).getValue());
  242. answer.addAll(children.get(nodes.size()).lookupRange(left, right));
  243. }
  244. }
  245. }
  246. else
  247. {
  248. if (nodes.get(0).getKey().compareTo(right) < 0 && nodes.get(0).getKey().compareTo(left) > 0)
  249. // добавляем в лист элементы нода без проверки детей
  250. for (int i = 0; i < nodes.size(); i++)
  251. {
  252. if (nodes.get(i).getKey().compareTo(left) >= 0 && nodes.get(i -1).getKey().compareTo(right) <= 0)
  253. answer.add(nodes.get(i).getValue());
  254. }
  255. }
  256.  
  257. return answer;
  258. }
  259. }
  260.  
  261. public BTree(int B)
  262. {
  263. this.B = B;
  264. }
  265.  
  266. @Override
  267. public int size()
  268. {
  269. return size;
  270. }
  271.  
  272. @Override
  273. public boolean isEmpty()
  274. {
  275. return size() == 0;
  276. }
  277.  
  278. @Override
  279. public void add(K key, V value)
  280. {
  281. size++;
  282.  
  283. if (root == null)
  284. root = new BNode<>(null, this);
  285.  
  286. root.addKey(key, value);
  287.  
  288. }
  289.  
  290. @Override
  291. public boolean contains(K key)
  292. {
  293. return lookup(key) != null;
  294. }
  295.  
  296. @Override
  297. public V lookup(K key)
  298. {
  299. return root.lookup(key);
  300. }
  301.  
  302. @Override
  303. public List<V> lookupRange(K from, K to)
  304. {
  305. if (root == null)
  306. return null;
  307. return root.lookupRange(from, to);
  308. }
  309.  
  310. @Override
  311. public Object remove(K key)
  312. {
  313. return null;
  314. }
  315. }
  316.  
  317. class Pair<K, V>
  318. {
  319. private K key;
  320.  
  321. public K getKey()
  322. {
  323. return key;
  324. }
  325.  
  326. private V value;
  327.  
  328. public V getValue()
  329. {
  330. return value;
  331. }
  332.  
  333. public Pair(K key, V value)
  334. {
  335. this.key = key;
  336. this.value = value;
  337. }
  338.  
  339. @Override
  340. public String toString()
  341. {
  342. return key + "=" + value;
  343. }
  344. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement