JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで引用データからh指数(h-index)を計算する方法

ある研究者が一定期間に受けた被引用数を表す正の整数の配列があるとします。

ここでは、このような配列を引数として受け取り、配列が表す引用データに基づいてその研究者のh指数(h-index)を求めるJavaScript関数を作成する必要があります。

h指数(h-index)とは?

h指数は、研究者の業績を測る指標の一つです。ある研究者がキャリアの中で合計N本の論文を発表したと考えます。このとき、N本のうちh本の論文がそれぞれ少なくともh回引用されており、残りのN − h本の論文がそれぞれh回以下しか引用されていない場合、その研究者のh指数はhであると定義されます。

具体例

引用数の配列が次のようになっているとします。

const arr = [1, 6, 3, 0, 5];

このデータは、研究者が合計5本の論文を発表しており、それぞれ1回、6回、3回、0回、5回引用されたことを意味します。

この研究者は「少なくとも3回引用された論文」が3本あり、残りの2本は3回以下しか引用されていないため、h指数は3となります。

したがって、この配列に対する出力は次のようになります。

const output = 3;

実装コード

以下が実際のコードです。このアルゴリズムでは、各引用数を「論文数以下」に丸めたカウント用配列を作成し、後ろから累積することで効率的にh指数を求めています。

const arr = [1, 6, 3, 0, 5];

const findHIndex = (arr = []) => {
    let possible = [];
    let { length: len } = arr;

    // 配列が空の場合はh指数は0
    if (len === 0) {
        return 0;
    }

    // カウント用の配列を初期化
    possible.length = len + 2;
    possible = possible.join('-').split('').map(() => 0);

    // 各引用数をカウント(lenを超える値はlenとして扱う)
    for (let i = 0; i < len; i++) {
        let val = arr[i];
        let ind = val > len ? len : val;
        possible[ind] += 1;
    }

    // 後ろから累積し、条件を満たす最大のkを返す
    let result = 0;
    for (let k = len; k >= 0; k--) {
        result += possible[k];
        if (result >= k) {
            return k;
        }
    }
};

console.log(findHIndex(arr));

出力結果

コンソールには次のように出力されます。

3

まとめ

この方法では、ソートを行わずにカウント配列を使ってh指数を計算できるため、時間計算量はO(n)、空間計算量もO(n)で非常に効率的です。研究者の引用データから学術的な影響力を評価したい場合に、ぜひ活用してみてください。

  1. JavaScriptで配列の中央値を計算する方法をわかりやすく解説

    中央値(メジアン)とは、数値データを小さい順に並べたときにちょうど中央に位置する値のことです。JavaScriptで配列の中央値を求めるには、まず配列をソートし、その後要素数に応じて処理を分けます。要素数が奇数の場合は中央の1つの要素を、偶数の場合は中央に近い2つの要素の平均値を中央値として返します。中央値の計算手順配列をソートする - 数値配列の場合、sort() メソッドに比較関数 (a, b) => a - b を渡して正しく昇順ソートします。中央のインデックスを求める - Math.floor(arr.length / 2) で中央位置を整数として取得します。要素数の判定を行う

  2. JavaScriptで配列の平均値を計算する方法

    JavaScriptで配列の平均値を求めるには、配列内のすべての要素を合計し、その合計を配列の長さ(要素数)で割ります。要素の合計を求めるには、forEach()メソッドやreduce()メソッドを使うと簡単に実装できます。コード例<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initia