2011-06-11 14 views
6

Necesito calcular el h-index de una lista de publicaciones que almacené en un árbol.Cálculo h-index

lo que hice está atravesando el árbol con el fin de obtener una lista decreciente de la posición-número de citas

que parece:

line 1 10 
line 2 5 
line 3 4 
line 4 0 

que debería parar en la línea 3 y volver 3. El problema es con los ejemplos dados y en este caso

line 1 4 
line 2 0 
line 3 0 

que se detenga en 2 porque 4> 1 pero 0> 3 es falso. Debería devolver 1 en su lugar. ¿Puedes explicarme por qué? Sé que es más como una pregunta matemática, pero después de eso podría necesitar volver a implementarlo si algo está muy mal.

Este es el código

int index_h_calc(rbtree_node n, int *i){ 
    if (n == NULL) { 
     fputs("<empty tree>\n", stdout); 
     return 0; 
    } 
    if (n->right != NULL) 
     index_h_calc(n->right,i); 


    graduat *grad; 
    grad=n->value; 

    if(DEBUG) 
     printf("linea %d %d %s\n ",*i,(int)grad->tot,grad->name); 

    if(*i+1>=(int)grad->tot) { 
     return *i; 
    } else 
     *i+=1; 

    if (n->left != NULL) 
     index_h_calc(n->left,i); 

    return *i; 
    } 

Respuesta

0

Esto tiene varias soluciones en github, por ejemplo, en Ruby, lo que equivale a su n es citePages y siendo el h-index calculada

function h_index(){ 
     var hArray = new Array(); 
     var x = 0; 
     for(var i = 0; i < citePages.length; i++){ 
      var citeArray = citePages[i];   
      for(var j = 0; j < citeArray.length; j++){ 
       // The multiplication by one is a hack to convert the string type into a numerical type 
       hArray[x++] = citeArray[j]*1; 
      } 
     } 
     hArray.sort(sortNumber); 
     //alert(hArray); 
     for(var i = 0; i < hArray.length; i++){ 
      if(i > hArray[i]){ 
       return hArray[i-1]; 
      } 
     } 
    } 

función anterior -

function getCitationCount(responseText){ 
    if (responseText == null){ 
    _gel("sContent").innerHTML = "<i>Invalid data.</i>"; 
      alert("There is no data."); 
     return; 
     } 

var cite_exists = 1; 
var cite_str_len = 14; 
var len_of_Cite_by_str = 9; 
var citeArray = new Array(); 
for(var i = 0; cite_exists > 0; i++) 
    { 
    cite_exists = responseText.search('Cited by'); 
    if(cite_exists == -1){ 
     //alert("No more citations for given Author!"); 
     //return; 
    }else{ 
     var tmp_string = responseText.substr(cite_exists, cite_str_len); 
     var end = (tmp_string.indexOf("<")-len_of_Cite_by_str); 
     citeArray[i] = tmp_string.substr(len_of_Cite_by_str, end); 
     publications++; 
     responseText = responseText.substr(cite_exists+cite_str_len, responseText.length); 
    } 
} 
return citeArray; 
} 

Si esto no proporciona una Entonces, la solución es que el problema sea verificable, por lo que realmente necesitamos datos de ejemplo, por ejemplo, una jsfiddle de datos típicos que indiquen qué resultado se espera en cada caso, dado que se trata de un error matemático. Una pregunta que no es de codificación y solo puede probarse con una estructura de datos compleja y poblada.

0

Tal vez me estoy perdiendo algo de sutileza, pero no es la respuesta sólo para restar uno del número de línea? Es decir, si i es el número de línea y n es el número de citas, recorre el árbol hasta que encuentre una línea con n < i y luego devuelva el h-index como i - 1.

+0

... ¿no debería ser eso, "entonces devuelva el índice h como * n * - 1"? De lo contrario, me parece correcto ... – Dmitri

+0

@Dmitri: no, tiene que ser 'i - 1'. Considere el primer ejemplo del AT: nos detenemos en la línea 4 (porque '0 <4') y devolvemos un índice h de' 4 - 1 = 3'. En el segundo ejemplo, nos detenemos en la línea 2 y devolvemos '1'. – deprecated

+0

Oops .. Cuando escribí que tenía 'n' y' i' atrás en mi mente por alguna razón. – Dmitri