Ho esaminato alcuni strumenti comuni come Heapy per misurare la quantità di memoria utilizzata da ciascuna tecnica di attraversamento ma non so se mi stanno dando i risultati corretti. Ecco un codice per dare il contesto.Utilizzo memoria in ricorsiva rispetto a un grafico iterativo trasversale
Il codice misura semplicemente il numero di nodi univoci in un grafico. Due tecniche di attraversamento fornite vale a dire. count_bfs
e count_dfs
import sys
from guppy import hpy
class Graph:
def __init__(self, key):
self.key = key #unique id for a vertex
self.connections = []
self.visited = False
def count_bfs(start):
parents = [start]
children = []
count = 0
while parents:
for ind in parents:
if not ind.visited:
count += 1
ind.visited = True
for child in ind.connections:
children.append(child)
parents = children
children = []
return count
def count_dfs(start):
if not start.visited:
start.visited = True
else:
return 0
n = 1
for connection in start.connections:
n += count_dfs(connection)
return n
def construct(file, s=1):
"""Constructs a Graph using the adjacency matrix given in the file
:param file: path to the file with the matrix
:param s: starting node key. Defaults to 1
:return start vertex of the graph
"""
d = {}
f = open(file,'rU')
size = int(f.readline())
for x in xrange(1,size+1):
d[x] = Graph(x)
start = d[s]
for i in xrange(0,size):
l = map(lambda x: int(x), f.readline().split())
node = l[0]
for child in l[1:]:
d[node].connections.append(d[child])
return start
if __name__ == "__main__":
s = construct(sys.argv[1])
#h = hpy()
print(count_bfs(s))
#print h.heap()
s = construct(sys.argv[1])
#h = hpy()
print(count_dfs(s))
#print h.heap()
Voglio sapere da quale fattore è l'utilizzo della memoria totale diverso nelle due tecniche traversal viz. count_dfs
e count_bfs
? Si potrebbe avere l'intuizione che dfs
potrebbe essere costoso come viene creato un nuovo stack per ogni chiamata di funzione. Come si possono misurare le allocazioni di memoria totali in ciascuna tecnica di attraversamento?
Le dichiarazioni (commentate) hpy
indicano la misura desiderata?
Esempio di file con collegamenti:
4
1 2 3
2 1 3
3 4
4
Stai cercando l'utilizzo della memoria di picco? Perché per entrambi gli algoritmi, la quantità utilizzata andrà su e giù mentre il grafico viene attraversato. Quale ha il picco più grande può dipendere dai dettagli del grafico. – Blckknght
@Blckknght Sto cercando l'utilizzo totale della memoria. Una possibile via potrebbe essere una serie di statistiche che mostrano i diversi mem. allocazioni per grafici 'n' applicati su ogni tecnica di attraversamento. – ajmartin