Итак, я изучаю алгоритмы из этой книги, которую я купил, и у меня есть псевдокод для определения расстояния между двумя элементами closetst в массиве чисел
MinDistance(a[0...n-1])
Input: Array A of numbers
Output: Minimum Distance between two of its elements
dMin <- maximum integer
for i=0 to n-1 do
for j=0 to n-1 do
if i!=j and | A[i] - A[j] | < dMin
dMin = | A[i]-A[j] |
return dMin
Однако я хотел улучшить это алгоритмическое решение. Измените то, что уже есть, или перепишите все вместе. Может кто-нибудь помочь?
Я написал функцию и класс в Java для проверки псевдокода? Это верно? И еще раз, как я могу сделать это лучше с точки зрения эффективности.
//Scanner library allowing the user to input data
import java.lang.Math.*;
public class ArrayTester{
//algorithm for finding the distance between the two closest elements in an array of numbers
public int MinDistance(int [] ar){
int [] a = ar;
int aSize = a.length;
int dMin = 0;//MaxInt
for(int i=0; i< aSize; i++)
{
for(int j=i+1; j< aSize;j++)
{
dMin = Math.min(dMin, Math.abs( a[i]-a[j] );
}
}
return dMin;
}
//MAIN
public static void main(String[] args){
ArrayTester at = new ArrayTester();
int [] someArray = {9,1,2,3,16};
System.out.println("NOT-OPTIMIZED METHOD");
System.out.println("Array length = "+ someArray.length);
System.out.println("The distance between the two closest elements: " + at.MinDistance(someArray));
} //end MAIN
} //END CLASS
ТАК Я обновил функцию, чтобы минимизировать двойной вызов Math.abs. Что еще я могу сделать, чтобы улучшить это. Если бы я переписал его с помощью sort, он вообще поменял бы мои циклы for, или он был бы таким же, просто теоретически работал бы быстрее.
public int MinDistance(int [] ar){
int [] a = ar;
int aSize = a.length;
int dMin = 0;//MaxInt
for(int i=0; i< aSize; i++)
{
for(int j=i+1; j< aSize;j++)
{
dMin = Math.min(dMin, Math.abs( a[i]-a[j] );
}
}
return dMin;
}