2017-06-09 38 views
0

我目前想实现插值搜索与浮点数,这里是我的代码:Java的插值与搜索浮点数

所有的
import java.util.Arrays; 

class InterpolationSearch { 
    private static float comparisions = 0; 
    public static int interpolationsearch (double arr[], double x, int high, int low) { 
    while (low<=high) { 
     comparisions++; 
     int i = low + (x-arr[low])*(high-low)/(arr[high]-arr[low]); 
     if (x==arr[i]) 
      return i; 
     else if (x<arr[i]) 
      high = i-1; 
     else 
      low = i+1; 
     } 
     return -1; 
    } 
    public static void main(String args[]) { 
     int n=100; 
     double array[] = new double[n]; 
     for (int i=0; i<100; i++) { 
      for (int k=0; k<n; k++) { 
       double r = Math.random(); 
       r = r * 100; 
       r = Math.round(r); 
       r = r/100; 
       array[k] = r; 
      } 
      Arrays.sort(array); 
      double search = Math.random(); 
      search = search*100; 
      search = Math.round(search); 
      search = search/100; 
      int result=interpolationsearch(array, search, n-1, 0); 
      if (result == -1) 
       System.out.println(search +" befindet sich nicht im Array."); 
      else 
       System.out.println(search+" befindet sich im Array an der Stelle "+(result)+"."); 
     } 
     System.out.println("Anzahl der gemittelten Vergleiche: "+comparisions/100+"."); 
    } 
} 

首先是我的算法是否正确?其次,我如何使用浮点数来处理这个问题?在当前代码中,第8行出现以下错误:类型不匹配:无法从double转换为int。我已经试图将所有内容都转换为int,但它不起作用。

回答

1

第2个答案正确类型转换。现在

int i = (int)(low + (x-arr[low])*(high-low)/(arr[high]-arr[low])); 

你的程序是给下面的输出

0.47 befindet sich im Array an der Stelle 41. 
0.33 befindet sich im Array an der Stelle 32. 
1.0 befindet sich im Array an der Stelle 99. 
0.52 befindet sich im Array an der Stelle 54. 
0.51 befindet sich im Array an der Stelle 48. 
0.32 befindet sich im Array an der Stelle 25. 

现在你要解释它更多地了解你想要什么来实现的。这是正确的输出吗?

+0

这正是我所做的,但它根本不起作用。它适用于2个循环,然后程序无故停止工作,所以这不应该是最好的解决方案,即使它理论上应该可行......问题是为什么它对你有用,但对我来说不是?输出似乎是正确的,是的。 – Vajk

0
  1. 是我的算法是否正确?

你是一个可以验证该算法中。工作...

  • 我已经尝试过投一切为int,但没有奏效

  • 它的作品!你只需要以转换双为int铸造整个操作的结果,但请记住,你会失去小数部分..

    例如:

    int i = (int) (low + (x - arr[low]) * (high - low)/(arr[high] - arr[low]));