评估Dijkstra算法

时间:2018-02-07 17:33:25

标签: python big-o complexity-theory networkx

我试图通过创建基于循环和基于时间的大(o)图来评估我的Dijkstra算法的python实现的复杂性。

我理解来自我的出价输入数据集 - 在我的情况下是CSV。文件有三行:city1,city2,distance,我必须随机选择一系列较小的数据集来运行我的算法。

如何随机选择让我们说:5行,然后是10行,15行,20行?

2 个答案:

答案 0 :(得分:1)

您可以使用random.sample。如果您有一个列表,那么您可以像这样使用它:

import random
rows = [f'city1,city2,{i}\n' for i in range(5)] # equal to f.readlines()

sample_size = 5 # or whatever you need
samples = random.sample(rows, sample_size)

for sample in samples:
    city1, city2, distance = sample.strip().split(',')
    distance = int(distance) # distance is a string because of csv, convert it to a number
    # do your thing here

答案 1 :(得分:0)

由于您已经从csv创建了图表,因此我很想直接从您的网络图表中进行采样。

import random    
import networkx as nx
city_graph = nx.complete_graph(20) # generate a sample complete graph to demonstrate on
all_cities = city_graph.nodes()    # a list of all the cities from your graph
sample_size = 5  # make sure this is less than total node-count
sample_population_node_list = random.sample(all_cities, sample_size)
connected_sample_graph = nx.subgraph(city_graph, sample_population_node_list)

random模块应随机提取节点名称,然后nx.subgraph将新图形拼接在一起,其中包含节点的采样,其中包含从原始图形中传输的任何连接。 numpy中有一个类似的抽样项,允许您指定是否要使用替换进行抽样。

如果原始图表没有完整,你可能会发现某些组合会产生孤立的城市(例如,如果原始图像不是一个完整的图表,并且如果到达A的唯一方法是通过B而B是否为&t; t在样本中,A是,那么A将无法访问)。可能值得在结果子图上运行nx.connected_component_subgraphs以查看它是否已连接。

另外,为了完整起见,可能值得将最终代码与networkx library中的各种算法进行比较。