Guest User

Untitled

a guest
Sep 19th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.10 KB | None | 0 0
  1. export default class HeapSet {
  2.  
  3. constructor (values) {
  4. this._values = values;
  5. this._list = new Array(values.length * 3);
  6. this._idToIndex = {};
  7.  
  8. const list = this._list;
  9.  
  10. for (let i = 0, prev = -1; i < values.length; i++) {
  11. this._idToIndex[values[i]] = i;
  12. list[i * 3] = i;
  13. list[i * 3 + 1] = prev;
  14. list[i * 3 + 2] = i + 1;
  15. prev = i;
  16. }
  17. list[list.length - 1] = -1;
  18.  
  19. this._end = values.length - 1;
  20. this._begin = 0;
  21. this._size = values.length;
  22. }
  23.  
  24.  
  25. pop () {
  26. if (this._size === 0) {
  27. return undefined;
  28. }
  29. const list = this._list;
  30. const end = this._end * 3;
  31. const prev = list[end + 1];
  32. const val = this._values[list[end]];
  33.  
  34. list[end] = -1;
  35. list[end + 1] = -1;
  36. list[end + 2] = -1;
  37.  
  38. this._end = prev;
  39. this._size--;
  40.  
  41. return val;
  42. }
  43.  
  44.  
  45. shift () {
  46. if (this._size === 0) {
  47. return undefined;
  48. }
  49. const list = this._list;
  50. const begin = this._begin * 3;
  51. const next = list[begin + 2];
  52. const val = this._values[list[begin]];
  53.  
  54. list[begin] = -1;
  55. list[begin + 1] = -1;
  56. list[begin + 2] = -1;
  57.  
  58. this._begin = next;
  59. this._size--;
  60.  
  61. return val;
  62. }
  63.  
  64.  
  65. has (id) {
  66. const index = this._idToIndex[id];
  67. return (index !== undefined && this._list[index * 3] !== -1);
  68. }
  69.  
  70.  
  71. remove (id) {
  72. let pos = this._idToIndex[id];
  73.  
  74. const index = pos * 3;
  75. const list = this._list;
  76.  
  77. if (list[index] === -1) { // already removed;
  78. return undefined;
  79. }
  80. const prev = list[index + 1];
  81. const next = list[index + 2];
  82.  
  83. if (next !== -1) list[next * 3 + 1] = prev;
  84. if (prev !== -1) list[prev * 3 + 2] = next;
  85.  
  86. if (pos === this._begin) {
  87. this._begin = next;
  88. }
  89.  
  90. if (pos === this._end) {
  91. this._end = prev;
  92. }
  93.  
  94. const val = this._values[list[index]];
  95. list[index] = list[index + 1] = list[index + 2] = -1;
  96.  
  97. this._size--;
  98.  
  99. return val;
  100. }
  101.  
  102. get size () {
  103. return this._size;
  104. }
  105.  
  106.  
  107. begin () {
  108. return this._values[this._list[this._begin * 3]];
  109. }
  110.  
  111. end () {
  112. return this._values[this._list[this._end * 3]];
  113. }
  114. }
Add Comment
Please, Sign In to add comment