H指数(H-index)是衡量科研人员学术产出的重要指标,由物理学家Jorge Hirsch在2005年提出。这个指标最初用于评估科学家的研究影响力,后来也被广泛应用于论文引用分析、社交媒体影响力评估等领域。
在力扣274题中,我们需要根据给定的论文引用次数数组,计算出研究人员的H指数。具体定义是:一个科学家的H指数是指他/她有h篇论文被引用了至少h次,且其他N-h篇论文每篇被引用次数不超过h次。
举个例子,如果某位学者的论文引用次数为[3,0,6,1,5],那么他的H指数是3,因为有3篇论文(6,5,3)的引用次数≥3,剩下的2篇论文引用次数≤3。
最直观的解决方法是先对数组进行排序,然后从大到小遍历,找到第一个满足citations[i] < i+1的位置,此时的i就是H指数。
python复制def hIndex(citations):
citations.sort(reverse=True)
for i in range(len(citations)):
if citations[i] < i+1:
return i
return len(citations)
这个解法的时间复杂度是O(nlogn),主要消耗在排序步骤上。空间复杂度取决于排序算法的实现,通常是O(1)或O(n)。
考虑到H指数的特性(最大不超过论文总数n),我们可以使用计数排序的思想进行优化:
python复制def hIndex(citations):
n = len(citations)
count = [0] * (n + 1)
for c in citations:
if c >= n:
count[n] += 1
else:
count[c] += 1
total = 0
for i in range(n, -1, -1):
total += count[i]
if total >= i:
return i
return 0
这种方法的时间复杂度降低到O(n),因为我们只需要两次遍历。空间复杂度是O(n),用于存储计数数组。
在实际编码中,有几个边界情况需要特别注意:
提示:在面试中,主动讨论边界条件能展现你的全面思考能力。
虽然计数排序法在理论上更优,但在实际应用中需要考虑:
当输入数组已经按升序排列时,我们可以使用二分查找进一步优化:
python复制def hIndex(citations):
n = len(citations)
left, right = 0, n-1
while left <= right:
mid = left + (right-left)//2
if citations[mid] >= n - mid:
right = mid - 1
else:
left = mid + 1
return n - left
这种方法的时间复杂度是O(logn),空间复杂度是O(1)。
在实际学术评价系统中,论文数量和引用次数会随时间增长,需要设计支持动态更新的数据结构。可以考虑:
H指数算法不仅用于学术评价,还可以应用于:
例如,某视频平台可以用H指数来确定"优质创作者":有h个视频播放量超过h万次,且其他视频播放量不超过h万次。
注意:在Python中使用[0]*(n+1)创建计数数组时,要确认n的值是否正确,避免差一错误。
H指数虽然实用,但也有其局限性:
因此在实际系统中,通常会结合其他指标如i10指数、FWCI等综合评估。在算法面试中,理解这些背景知识有助于更好地与面试官讨论问题。