Advertisement
Guest User

Untitled

a guest
Feb 24th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.48 KB | None | 0 0
  1. public class BinarySearch {
  2. //r = rightBorder, l = leftBorder, n = a.length, m = middle
  3. public static int iterativeBinarySearch(int[] a, int x) {
  4. //PRE: a[i] >= a[i + 1], 0 <= i < n - 1
  5. int leftBorder = -1;
  6. int rightBorder = a.length;
  7. while (rightBorder - leftBorder > 1) {
  8. //INV: r > l + 1 && r - l > r' - l' && l <= l' < r' <= r && |(r - l) - 2 * (r' - l')| <= 1 &&
  9. // && |(r - l) - 2 * (r' - l')| <= 1 && (l == -1 || (0 <= l < r && a[l] > x)) &&
  10. // && (r == n || (l < r < n && a[r] <= x)) && a[i]' = a[i], 0 <= i < n && x' = x
  11. int middle = (leftBorder + rightBorder) / 2;
  12. //m = (r + l) / 2 && |(r - m) - (m - l)| <= 1 && (l < m <= r || l <= m < r)
  13. if (a[middle] <= x) {
  14. rightBorder = middle;
  15. //r' = m, l' = l,
  16. // a[m] <= x -> a[r'] <= x,
  17. //(l == -1 || (0 <= l < r && a[l] > x)) -> (l' == -1 || (0 <= l' < r && a[l'] > x))
  18. // m < r -> r' < r
  19. // l' = l && r' < r -> r - l > r' - l' && l <= l' < r' <= r && x' = x
  20. // m = (r + l) / 2 -> |(r - l) - 2 * (r' - l')| <= 1
  21. } else {
  22. leftBorder = middle;
  23. //l' = m, r' = r
  24. // a[m] > x -> a[l'] > x,
  25. //(r == n || (l < r < n && a[r] <= x)) -> (r' == n || (l < r' < n && a[r'] <= x))
  26. // m > l -> l' > l
  27. // l' > l && r' = r -> r - l > r' - l' && l <= l' < r' <= r && x' = x
  28. // m = (r + l) / 2 -> |(r - l) - 2 * (r' - l')| <= 1
  29. }
  30. }
  31. return rightBorder;
  32. //POST: R = r, R < n && n > 0 && a[n - 1] <= x &&
  33. // && (R > 1 && a[R] <= x && a[R - 1] > x || R == 0 && a[R] <= x) ||
  34. // || (R == n && n > 0 && a[n - 1] > x) || (n == 0 && R == 0) &&
  35. // && a[i]' = a[i], 0 <= i < n
  36. }
  37.  
  38. public static int recursiveBinarySearch(int[] a, int leftBorder, int rightBorder, int x) {
  39. //PRE: a[i] >= a[i + 1], 0 <= i < n - 1 && -1 <= l < r <= n &&
  40. // && (l == -1 || (0 <= l < r && a[l] > x)) &&
  41. // && (r == n || (l < r < n && a[r] <= x)) &&
  42. // a[i]' = a[i], 0 <= i < n && x' = x
  43. if (rightBorder - leftBorder == 1) {
  44. return rightBorder;
  45. //l == r - 1 && (r == n || (l < r < n && a[r] <= x)) && (l == -1 || (0 <= l < r &&a[l] > x)) ->
  46. // -> (0 < R < n && a[R] <= x && a[R - 1] > x) || (R == n && a[n - 1] > x) || (R == 0 && a[R] <= x)
  47. } else {
  48. int middle = (leftBorder + rightBorder) / 2;
  49. //m = (r + l) / 2 && 0 <= ((r - m) - (m - l)) <= 1 && r > l + 1 && (l < m <= r || l <= m < r)
  50. if (a[middle] <= x) {
  51. //a[m] <= x, r' = m, l' = l ->
  52. // -> a[r'] <= x,
  53. // (l == -1 || (0 <= l < r && a[l] > x)) -> (l' == -1 || (0 <= l' < r && a[l'] > x))
  54. // a[i]' = a[i], 0 <= i < n && x' = x
  55. // m < r -> r' < r && l <= l' < r' <= r
  56. // m = (r + l) / 2 -> |(r - l) - 2 * (r' - l')| <= 1
  57. return recursiveBinarySearch(a, leftBorder, middle, x);
  58. } else {
  59. //l' = m, r' = r
  60. // a[m] > x -> a[l'] > x,
  61. //(r == n || (l < r < n && a[r] <= x)) -> (r' == n || (l < r' < n && a[r'] <= x))
  62. // a[i]' = a[i], 0 <= i < n
  63. // m > l -> l' > l
  64. // r - l > r' - l' && l <= l' < r' <= r
  65. // m = (r + l) / 2 -> |(r - l) - 2 * (r' - l')| <= 1
  66. return recursiveBinarySearch(a, middle, rightBorder, x);
  67. }
  68. }
  69. ///POST: R = r, R < n && n > 0 && a[n - 1] <= x &&
  70. // && (R > 1 && a[R] <= x && a[R - 1] > x || R == 0 && a[R] <= x) ||
  71. // || (R == n && n > 0 && a[n - 1] > x) || (n == 0 && R == 0) &&
  72. // && a[i]' = a[i], 0 <= i < n
  73. }
  74.  
  75. public static void main(String[] args) {
  76. int x = Integer.parseInt(args[0]);
  77. int[] a = new int[args.length - 1];
  78. for (int i = 1; i < args.length; i++) {
  79. a[i - 1] = Integer.parseInt(args[i]);
  80. }
  81. int iterativeAnswer = iterativeBinarySearch(a, x);
  82. int recursiveAnswer = recursiveBinarySearch(a, -1, a.length, x);
  83. if (iterativeAnswer != recursiveAnswer) {
  84. System.out.println("I need to correct my code");
  85. return;
  86. }
  87. System.out.println(iterativeAnswer);
  88. }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement