Member 14549747 Ответов: 1

Почему я получаю такое большое число в этом подразделении на java ?


Я работаю над проектом Java, где использую мин-хэширование для вычисления сходства Jaccard между двумя документами.Оба документа представляют собой тексты, которые задаются в виде несортированных целочисленных массивов ex. arr[0] = first word(как int ) ... Я вычисляю минимальное сходство хэширования между двумя наборами, а затем использую его для вычисления коэффициента джаккарда .
Проблема в том что когда я делю минимальное сходство хэширования с количеством элементов в объединении 2 массивов я получаю число не точное к делению

например, arr1={4,5,6,7} arr2={6,7}

минимальное сходство хэширования : 0,5
union array = {0,1,2,3,6,7} length = 6
коэффициент джаккарда = min-сходство хеширования / длина = 0.5/6 = 0.08333333333333
но я получаю 0,096, когда вычисляю коэффициент джаккарда
У меня есть код внизу .
Спасибо, что уделили мне время .

Что я уже пробовал:

@SuppressWarnings("static-access")
	public double jaccard(Document doc) // returns similarity/number of elems in union array 
	{
		
	return this.minhash(doc)/(double(this.unionArrays(a,b,a.length,b.length));
	}
	
	public static int unionArrays(int[] a ,int[] b ,int m , int n)
    {
		int counter=0;  //number of elems in union array 
		
		 if (m > n)  //make sure first array is smaller 
	        { 
	            int tempp[] = a; 
	            a = b; 
	            b = tempp; 
	  
	            int temp = m; 
	            m = n; 
	            n = temp; 
	        } 
		 
	        Arrays.sort(a); //sort first array 
	        
	        for (int i = 0; i < m; i++)
	        {          
	        	counter++; //number of elems of first array 
	        }
	        
	  
	        for (int i = 0; i < n; i++)  
	        { 
	            if (binarySearch(a, 1, m-1 , b[i]) == -1)
	            {
	            	counter++;  //if elem of second array doesn't exist in first array increase counter 
	            }
	          
	            
	        }
	        
	        
	        return counter;
	    }

	private static  int binarySearch(int[] arr, int l, int r, int x) {


        if (r >= l)  
        { 
            int mid = l + (r - l) / 2; 
  
            // If the element is present at the middle itself 
            if (arr[mid] == x) 
                return mid; 
  
            // If element is smaller than mid, then it can only  
            // be present in left subarray 
            if (arr[mid] > x) 
                return binarySearch(arr, l, mid - 1, x); 
  
            // Else the element can only be present in right subarray 
            return binarySearch(arr, mid + 1, r, x); 
        } 
  
        // We reach here when element is not present in array 
   
		
		return -1;
	} 

0x01AA

Здесь return this.minhash(doc)/(double(this.unionArrays(a,b,a.length,b.length)); скобки не совпадают. Действительно ли ваш пример компилируется?

Richard MacCutchan

Поместите несколько операторов печати в свой код, чтобы вы могли видеть все вычисляемые значения. Это поможет выяснить, где расчет неверен.

1 Ответов

Рейтинг:
7

Patrice T

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.