Найдите индекс H узлов графика с помощью NetworkX

#python-3.x #algorithm #graph #networkx #graph-algorithm

Вопрос:

Определение индекса H, используемого в этом алгоритме

Предположим, что реляционное выражение представлено в виде y = F(x1, x2, . . . , xn), где F возвращает целое число, большее 0, и функция должна найти максимальное значение y, удовлетворяющее условию, что существуют по крайней мере элементы y, значения которых не меньше y. Следовательно, индекс H любого узла i определяется как

H(i) = F(kj1 ,kj2 ,…,k jki)

где kj1, kj2, . . . , kjki представляют набор степеней соседних узлов узла i.

Теперь я хочу найти индекс H узлов следующих графиков, используя алгоритм, приведенный ниже :

График : введите описание изображения здесь

Код (написан на Python и NetworkX) :

 def hindex(g, n):
  nd = {}
  h = 0
  # print(len(list(g.neighbors(n))))
  for v in g.neighbors(n):
    #nd[v] = len(list(g.neighbors(v)))
    nd[v] = g.degree(v)
    snd = sorted(nd.values(), reverse=True)
    for i in range(0,len(snd)):
      h = i
      if snd[i] < i:
        break
  #print("H index of "   str(n)  " : "   str(h))
  return h
 

Проблема :
Этот алгоритм возвращает неправильные значения узлов 1, 5, 8 и 9

Фактические Значения :

Узел 1 — 6 : Индекс H = 2

Узел 7 — 9 : Индекс H = 1

Но для узлов 1 и 5 я получаю 1, а для узлов 8 и 9 я получаю 0.

Любые зацепки о том, где я ошибаюсь, будут высоко оценены!

Комментарии:

1. Вы имели в виду узел 7 — 9 : Индекс H = 1?

2. О да, извините, я совершил ошибку

Ответ №1:

Попробуй это:

 def hindex(g, n):
    sorted_neighbor_degrees = sorted((g.degree(v) for v in g.neighbors(n)), reverse=True)
    h = 0
    for i in range(1, len(sorted_neighbor_degrees) 1):
        if sorted_neighbor_degrees[i-1] < i:
            break
        h = i

    return h
 

Нет необходимости во вложенном цикле; просто составьте уменьшающийся список и вычислите индекс h, как обычно.

Причина «i — 1» заключается в том, что наши массивы индексируются на 0, в то время как индекс h основан на ранжировании (т. е. на k наибольших значениях), которые индексируются на 1.

Из определения h-индекса: Для нерастущей функции f h(f) — это max i >= 0, такой, что f(i) >>= i. Это, эквивалентно, min i >>>= 1, такой, что f(i) >>> Конечно, существует множество других способов (с различными требованиями к времени и пространству) вычисления h.

Комментарии:

1. @wamika Причина i-1 заключается в том, что наши массивы проиндексированы на 0, в то время как индекс h основан на рангах (т. е. на k наибольших значениях), которые проиндексированы на 1. Чтобы немного объяснить остальное: поскольку индекс h h является наибольшим i, таким что f(i) >= i. Вместо этого мы можем разбить, когда найдем наименьшее i, такое, что f(i) >

2. Комментарии @kcsquared, как правило, неожиданно исчезают; вы должны добавить это объяснение о 0-индексе и 1-индексе в ответ.