複雜網路K Shell演算法及其Python實現

2021-08-13 17:34:59 字數 1663 閱讀 3517

the rest of the world may follow the rules,but i must follow my heart!

隨心所欲即使其他人隨波逐流。

k-shell 方法遞迴地剝離網路中度數小於或等於 k 的節點,具體劃分過程如下: 假設網路中不存在度數為 0 的孤立節點。從度指標的角度分析,度數為 1的節點是網路中最不重要的節點,因此首先將度數為 1 的節點及其連邊從網路中刪除。刪除操作進行之後的網路中會出現新的度數為 1 的節點,接著將這些新出現的度數為 1 的節點及其連邊刪除。重複上述操作,直到網路中不再新出現度數為 1的節點為止。此時所有被刪除的節點構成第一層,即 1-shell,節點的 ks 值等於 1。剩下的網路中,每個節點的度數至少為2。繼續重複上述刪除操作,得到 ks 值等於 2 的第二層,即 2-shell。依此類推,直到網路中所有的節點都被賦予 ks 值。

# -*- coding: utf-8 -*-

"""created on 17-12-17

@summary: kshell演算法節點重要性度量

@author: dreamhome

"""from get_graph import read_graph_from_file

defkshell

(graph):

""" 根據kshell演算法計算節點的重要性

:param graph: 圖

:return: importance_dict

"""importance_dict = {}

ks = 1

while graph.nodes():

# 暫存度為ks的頂點

temp =

node_degrees_dict = graph.degree()

# 每次刪除度值最小的節點而不能刪除度為ks的節點否則產生死迴圈。這也是這個演算法存在的問題。

kks = min(node_degrees_dict.values())

while

true:

for k, v in node_degrees_dict.items():

if v == kks:

graph.remove_node(k)

node_degrees_dict = graph.degree()

if kks not

in node_degrees_dict.values():

break

importance_dict[ks] = temp

ks += 1

return importance_dict

if __name__ == "__main__":

# graph = nx.graph()

# graph.add_edges_from(

# [(1, 4), (2, 4), (3, 4), (4, 5), (5, 6), (5, 7), (3, 5), (6, 7)])

# print kshell(graph)

path = "/home/dreamhome/network-datasets/karate/karate.paj"

graph = read_graph_from_file(path)

print kshell(graph)

網路流 EK演算法及其優化

今天上午我彷彿知道了什麼叫做網路流,這裡推薦一篇部落格,大家入門網路流的可以看一下這篇部落格,保證一看就懂!codevs 1993 include include include include using namespace std const int inf 0x7ffffff queue q ...

串的模式匹配演算法 BF演算法及其複雜度

s串為主串,t為待匹配串,用i j分別指示s和t中的字元位置,i j初值均為0。演算法步驟 1 若當前比較的字元是s i t j 則繼續向後比較,執行 i j 2 若當前正在比較的字元不匹配呢?那麼j回溯到位置0 即令j 0 i呢?回溯到主串的i j 1處 0 1 2 3 4 5 6 7 a b a...

Python中選擇排序及其演算法複雜度

選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的資料元素排完。下圖為其演示圖 選擇排序...