Почему интерполяционный поиск выполняется, если он вычисляется вручную, то он выполняет только 2 шага, но при программировании он составляет более 2 шагов

#java #search #interpolation #binary-search #linear-interpolation

#java #search #interpolation #binary-search #linear-interpolation

Вопрос:

Меня смущает вычисление интерполяционного поиска, программа предоставляет разные результаты шага по сравнению с ручными вычислениями.

Входные данные: {3, 5, 10, 14, 21}

И я хочу найти число 14. Если вычислить вручную, то для поиска 14 потребуется всего 2 шага.

Я пробую это в своей программе интерполяционного поиска

 System.out.println("post low higth "   post   " "   low   " "   hight);  

И он показывает 3 шага, чтобы найти ключ, который я ищу, как показано на следующем рисунке.

Но когда я это сделаю

 System.out.println("mid row col dataMid: "   mid   " "   left   " "   right);  

в двоичном поиске ручные вычисления и циклы в программе одинаковы, они состоят всего из 2 шагов, как показано на следующем рисунке.

Кто — нибудь может объяснить мне, почему это происходит?

Это мой код интерполяционного поиска

 public static void interpolationSearch(int[] arr, int key){  int low,hight,post;  low = 0;  hight = arr.length-1;   while (lowlt;=hight){  post = low ((key-arr[low])/(arr[hight]-arr[low]))*(hight-low);   System.out.println("post low higth "   post   " "   low   " "   hight);  if (key == arr[post]){  System.out.println("Data found");  System.out.println("data ada di indeks ke-: " post);  return ;  }  else if (arr[post]gt;key){  hight = post-1;  }else {  low = post 1;  }  } }  

И это мой двоичный поисковый код

 public static void binarySearch(int arr[], int key) {  int left = 0;  int right = arr.length - 1;   while(left lt;= right) {  int mid = left   (right - left) / 2;   System.out.println("mid left hight: "   mid   " "   left   " "   right);  //divide and conquer  if(key == arr[mid]) {  System.out.println("Data ditemukan!");  return;  } else if(key gt; arr[mid]) {  left = mid   1;  } else {  right = mid - 1;  }  }  System.out.println("Data tidak ditemukan!"); }