MaxHeap.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "MaxHeap.h"
  2. static inline void setItem(MaxHeap * heap, const pyWord pos, const pyWord x, const pyWord d) {
  3. heap->indices[pos] = x;
  4. heap->distances[pos] = d;
  5. }
  6. static inline void copyItem(MaxHeap * heap, const pyWord dst, const pyWord src) {
  7. heap->indices[dst] = heap->indices[src];
  8. heap->distances[dst] = heap->distances[src];
  9. }
  10. void maxHeap_insert(MaxHeap * heap, const pyWord id, const pyReal distance) {
  11. if(!heap || heap->maxItems <= 0) {
  12. return;
  13. }
  14. if(heap->size < heap->maxItems) {
  15. pyWord pos = heap->size;
  16. heap->size ++;
  17. setItem(heap, pos, id, distance);
  18. while(pos > 0) {
  19. const pyWord p = pos / 2;
  20. if (heap->distances[p] >= heap->distances[pos]) {
  21. break;
  22. }
  23. copyItem(heap, pos, p);
  24. pos = p;
  25. setItem(heap, pos, id, distance);
  26. }
  27. return;
  28. }
  29. if(distance > heap->distances[0]) {
  30. return;
  31. }
  32. setItem(heap, 0, id, distance);
  33. pyWord pos = 0;
  34. while(pos < heap->size) {
  35. const pyWord right = (pos + 1) * 2;
  36. const pyWord left = right - 1;
  37. if(left >= heap->size) {
  38. break;
  39. }
  40. const pyWord v = (right >= heap->size || heap->distances[right] < heap->distances[left]) ? left : right;
  41. if(distance >= heap->distances[v]) {
  42. break;
  43. }
  44. copyItem(heap, pos, v);
  45. setItem(heap, v, id, distance);
  46. pos = v;
  47. }
  48. }