计算h指数

时间:2011-06-11 09:06:39

标签: c algorithm list tree sorted

我需要从存储在树中的出版物列表中计算h-index

我所做的是以低位顺序遍历树,获取引用位置列表

看起来像:

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

我应该停在第3行并返回3.问题在于给出的示例,在这种情况下

line 1 4
line 2 0
line 3 0

它在2处停止,因为4> 1但0> 3是假的。它应该返回1。你能解释一下为什么吗?我知道这更像是一个数学家的问题,但在那之后我可能需要重新实现它,如果出现严重错误的话。

这是代码

  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;
  }

2 个答案:

答案 0 :(得分:0)

也许我错过了一些微妙之处,但不是仅仅从行号中减去一个的答案?也就是说,如果i是行号,而n是引用次数,则遍历树,直到找到包含n < i的行,然后将h-index作为{{ 1}}。

答案 1 :(得分:0)

这在github上有几个解决方案,例如在Ruby中,相当于您的ncitePages并且是h-index计算的

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];
            }
        }
    }

上一个功能 -

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;
}

如果这不能提供解决方案,那么问题就是可以验证的 - 所以我们确实需要示例数据,例如,在每种情况下说明预期结果的典型数据的jsfiddle,假设这是一个数学而不是编码问题并且只能使用填充的复杂数据结构进行测试。