在斯坦福算法讲座中,Roughgarden教授列出了邻接列表的以下成分:
如何在python中实现这一点,特别是3和4的组合?这对我来说是一个挑战。我用C ++用指针完成了这个。
我可以想到一种方法,如果你认为它是正确的,请告诉我。
4号可以通过元组列表完成
Edges = [(1,2),(3,2),(4,1)]
或向元组添加另一个元素以获得权重值。如何使顶点列表指向它上面的边缘?
Vertices = {1 : [0,2] 2: [0,1] 3: [1] 4:[3]}
此处Vertices是一个字典,每个键(顶点)的值是包含键(Vertex)的边的索引列表。这看起来合情合理吗?
好的,我还将提供它的C ++实现。
struct Node;
struct Arcs; //Forward declarations as each of them references each other
using namespace std
struct SimpleGraph // Has all the nodes
{
set<Node *> nodes;
set<Arc *> arcs;
}
//Node contains node_number and the set of arcs/edges from this node.
struct Node
{
int node_number;
set<Arc *> arcs;
}
// Arc contains start and finish node and the cost associated with the Arc/Edge
struct Arc
{
Node* start;
Node* finish;
double cost;
}
因为我们在C ++中使用指针,所以Arc信息的更改会自动反映在Node中。缺少指针使得在python中很难这样做。所以我试图尽我所能。
答案 0 :(得分:0)
在python中,基本上所有东西都是一个对象,所以list,dicts和maps也是对象,因此可以通过它们的地址访问(就像C ++在你通过引用调用时那样)。
查看以下代码示例,该示例演示:
list_a = ['a', 'b', 'c']
list_b = ['d', 'e', 'f']
one_dict = {'entry1': list_a, 'entry2': list_b}
def add_entry(target_list, entry):
target_list.append(entry)
print("Our example dict:")
print(one_dict)
print("Modifying 'list_a' and 'list_b'.")
list_a[1] = 'B'
list_b[2] = 'F'
print(list_a)
print(list_b)
print("Appending new entries to 'list_a' and 'list_b'")
add_entry(list_a, 'q')
add_entry(list_b, list_a)
print(list_a)
print(list_b)
print("'list_a' and 'list_b' can still being accessed via 'one_dict'.")
print(one_dict)
这是输出,您可以清楚地看到one_dict持有对这些列表的引用:
Our example dict:
{'entry2': ['d', 'e', 'f'], 'entry1': ['a', 'b', 'c']}
Modifying 'list_a' and 'list_b'.
['a', 'B', 'c']
['d', 'e', 'F']
Appending new entries to 'list_a' and 'list_b'
['a', 'B', 'c', 'q']
['d', 'e', 'F', ['a', 'B', 'c', 'q']]
'list_a' and 'list_b' can still being accessed via 'one_dict'.
{'entry2': ['d', 'e', 'F', ['a', 'B', 'c', 'q']], 'entry1': ['a', 'B', 'c', 'q']}
因此,实现非常简单,就像你的C ++代码一样。