สมมติว่าเรามีข้อมูลอ้างอิงจำนวนมาก (การอ้างอิงเป็นจำนวนเต็มที่ไม่ติดลบ) ของผู้วิจัย เราต้องกำหนดฟังก์ชันเพื่อคำนวณดัชนี h ของผู้วิจัย ตามคำจำกัดความของดัชนี h:"นักวิทยาศาสตร์มีดัชนี h ถ้า h ของเอกสาร N ของเขา/เธอ มีการอ้างอิงอย่างน้อย h รายการแต่ละรายการ และเอกสาร N - h อื่น ๆ มีการอ้างอิงไม่เกิน h รายการแต่ละรายการ"
ดังนั้นหากข้อมูลเข้าเหมือนกับการอ้างอิง =[3,0,6,1,7] ผลลัพธ์จะเป็น 3 ตามที่ระบุว่าผู้วิจัยมีเอกสาร 5 ฉบับ เขาได้ 3, 0, 6, 1, 7 การอ้างอิง ตามลำดับ เนื่องจากผู้วิจัยมีเอกสาร 3 ฉบับ แต่ละรายการมีการอ้างอิงอย่างน้อย 3 รายการ และกระดาษอีก 2 รายการที่เหลือมีการอ้างอิงไม่เกิน 3 รายการ ค่าดัชนี h จึงเท่ากับ 3
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของอาร์เรย์ สร้างหนึ่งอาร์เรย์ที่เรียกว่า bucket ขนาด n + 1
-
สำหรับฉันอยู่ในช่วง 0 ถึง n – 1
-
x :=c[i]
-
ถ้า x>=n ให้เพิ่มที่เก็บข้อมูล[n] ขึ้น 1 ไม่เช่นนั้น ให้เพิ่มที่เก็บข้อมูล[x] ขึ้น 1
-
-
cnt :=0
-
สำหรับฉันอยู่ในช่วง n ลงไปที่ 0 −
-
เพิ่ม cnt โดยถัง[i]
-
ถ้า cnt>=i ให้คืนค่า i
-
-
กลับ – 1
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int hIndex(vector<int>& c) {
int n = c.size();
vector <int> bucket(n + 1);
for(int i = 0; i < n; i++){
int x = c[i];
if(x >= n){
bucket[n]++;
} else {
bucket[x]++;
}
}
int cnt = 0;
for(int i = n; i >= 0; i--){
cnt += bucket[i];
if(cnt >= i)return i;
}
return -1;
}
};
main(){
Solution ob;
vector<int> v = {3,0,6,1,7};
cout << (ob.hIndex(v));
} อินพุต
[3,0,6,1,7]
ผลลัพธ์
3