在C中实现基本基数

时间:2012-12-10 08:36:46

标签: c data-structures implementation radix

我目前正在实施here(维基百科)所描述的算法 本文介绍了两个主要结构:

  • 包含边数组
  • 的节点
  • 一条边,包含指向目标节点和标签的指针

所以,目前我的C代码中有2个结构:radix_node_sradix_edge_s

typedef struct radix_node_s radix_node_t;

typedef struct radix_edge_s {
    radix_node_t                *target_node;
    char                        *label;

    SLIST_ENTRY(radix_edge_s)   next;
} radix_edge_t;

struct radix_node_s {
    SLIST_HEAD(radix_edge_list_s, radix_edge_s) edges;
    void                                        *data;
};

我想知道是否可以使 edge 结构消失并将其contains与其目标节点合并。因此,边缘标签将是节点的新字段。

这是一个很好的方法吗?或者我错过了什么?

1 个答案:

答案 0 :(得分:1)

好吧,如果边缘的标签与源节点或目标节点的标签相同,那么只需将边缘结构更改为指向节点的指针,在复制数据时没有任何意义。

但如果它是 edge 的名称,并且节点可能有不同名称的边,那么你确实需要" tuple" edge:target和name的数据。使用C处理此问题的最佳方法是使用edge struct。

为了以防这样说,也许它已经是这样了(不知道SLIST_*是什么):因为你的结构很小,你应该把它当作值类型。也就是说,不是有一个指向边结构或链结构的边结构列表的指针数组,而是指向边结构值数组的指针。即使您需要调整小结构数组的大小,现代处理器的效率仍然高于通过指针数组保留链表或额外间接效果。