Advertisement
nullzero

Untitled

Feb 9th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.89 KB | None | 0 0
  1. N = 100
  2. SIZE = N * N;
  3.  
  4. function fenwick_sum_primitive(arr, i) {
  5. sum = 0;
  6. while (i > 0) {
  7. sum = sum + arr[i];
  8. i = i - bitAnd(i, -i);
  9. }
  10. return sum;
  11. }
  12.  
  13. function fenwick_sum(arr, i, j) {
  14. if (i == 1) {
  15. return fenwick_sum_primitive(arr, j);
  16. } else {
  17. return fenwick_sum_primitive(arr, j) - fenwick_sum_primitive(arr, i - 1);
  18. }
  19. }
  20.  
  21. function fenwick_get(arr, i) {
  22. return fenwick_sum(arr, i, i);
  23. }
  24.  
  25. function fenwick_add(arr, i, v) {
  26. while (i <= SIZE) {
  27. arr[i] = arr[i] + v;
  28. i = i + bitAnd(i, -i);
  29. }
  30. }
  31.  
  32. function fenwick_set(arr, i, v) {
  33. current_val = fenwick_get(arr, i);
  34. fenwick_add(arr, i, v - current_val);
  35. }
  36.  
  37. function arr_index_to_matrix_row(i) {
  38. return floor((i - 1) / N) + 1;
  39. }
  40.  
  41. function arr_index_to_matrix_col(i) {
  42. return ((i - 1) %% N) + 1;
  43. }
  44.  
  45. function matrix_index_to_arr_index(r, c) {
  46. return ((r - 1) * N + (c - 1)) + 1;
  47. }
  48.  
  49. function binary_search(arr, v) {
  50. l = 1
  51. r = SIZE
  52. while (l <= r) {
  53. m = floor((l + r) / 2)
  54. result = fenwick_sum_primitive(arr, m)
  55. if (result >= v) {
  56. answer = m;
  57. r = m - 1;
  58. } else {
  59. l = m + 1;
  60. }
  61. }
  62. return answer;
  63. }
  64.  
  65. function main() {
  66. // construct an identity matrix
  67. arr = array_of_length(SIZE) // 10000 elements, every entry is 0
  68. for (i = 1 to N) {
  69. arrIndex = matrix_index_to_arr_index(i, i)
  70. fenwick_add(arr, arrIndex, 1);
  71. }
  72.  
  73. // calculate
  74. for (t = 1 to 10000000) {
  75. sum = fenwick_sum_primitive(arr, SIZE);
  76. x = random(sum) // random from 1 to sum
  77. k = binary_search(arr, x)
  78.  
  79. r = arr_index_to_matrix_row(k)
  80. c = arr_index_to_matrix_col(k)
  81.  
  82. // this should use the fenwick_set and matrix_index_to_arr_index function
  83. pro_function(arr, r, c);
  84. }
  85.  
  86. for (r = 1 to N) {
  87. for (c = 1 to N) {
  88. print(fenwick_get(arr, matrix_index_to_arr_index(r, c)))
  89. }
  90. print_newline()
  91. }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement