2017-06-09 5 views
0

ich derzeit versuche Interpolationssuche mit Gleitkommazahlen zu implementieren, hier ist mein Code:Java Interpolationssuche mit Gleitkommazahlen

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+"."); 
    } 
} 

Zunächst einmal ist mein Algorithmus korrekt? Zweitens, wie bekomme ich das mit Floating-Zahlen arbeiten? In dem aktuellen Code erhalte ich den folgenden Fehler in Zeile 8: Typenkonflikt: kann nicht von Double in Int konvertieren. Ich habe bereits versucht, alles auf int zu übertragen, aber es hat nicht funktioniert.

Antwort

1

zweite Antwort richtig typisieren.

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

Jetzt Ihr Programm gibt folgende Ausgabe

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. 

Jetzt haben Sie es zu erklären, was Sie erreichen wollen. Ist das die richtige Ausgabe?

+0

Das ist genau das, was ich gemacht habe, aber es funktioniert überhaupt nicht. Es funktioniert wie 2 Schleifen und dann hört das Programm auf, ohne Grund zu arbeiten, also sollte dies nicht die beste Lösung sein, obwohl es theoretisch funktionieren sollte ... Die Frage ist, warum funktioniert es für dich, aber nicht für mich? Die Ausgabe scheint korrekt zu sein, ja. – Vajk

0
  1. ist mein Algorithmus korrekt?

Sie sind derjenige, wenn der algo überprüfen kann. arbeitet ...

  1. I int schon alles versucht zu werfen, aber es nicht

funktioniert es funktionierte! Sie müssen nur das Ergebnis der gesamten Operation, um werfen einen Doppel in int zu konvertieren, aber erinnern Sie sich die Dezimalstellen ..

Beispiel verloren:

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