C 在边阵列中定位边

C 在边阵列中定位边,c,algorithm,C,Algorithm,假设我有一个名为Edge的结构,它表示一个图的边。该结构的构造如下: struct Edge { int src, dest, weight,type; }; edge[0].src = 0; edge[0].dest = 1; edge[0].weight = 10; edge[1].src = 0; edge[1].dest = 2; edge[1].weight = 6; 其中,edge[x].src给出边x的起点,edge[x].dest给出目的地 我们还假

假设我有一个名为Edge的结构,它表示一个图的边。该结构的构造如下:

struct Edge 
{ 
    int src, dest, weight,type; 
}; 
edge[0].src = 0; 
edge[0].dest = 1; 
edge[0].weight = 10;

edge[1].src = 0; 
edge[1].dest = 2; 
edge[1].weight = 6;
其中,
edge[x].src
给出边x的起点,
edge[x].dest
给出目的地

我们还假设(源、目标)的每个组合都是唯一的

如果我有一条边的目的地和来源,有没有一种方法可以找到这两条边属于哪个边,而不必检查整个数组
edge[]

边的初始化方式如下所示:

struct Edge 
{ 
    int src, dest, weight,type; 
}; 
edge[0].src = 0; 
edge[0].dest = 1; 
edge[0].weight = 10;

edge[1].src = 0; 
edge[1].dest = 2; 
edge[1].weight = 6;

例如,如果我有edge[x].dest=1`和edge[x].src=0,我如何才能找到x?

如果src和dest的可能值有限,则可以使用额外的向量indexEdge,其中
indexEdge[src*N+dest]
为edge中的相应索引赋值


在edge中创建新条目时,必须设置indexEdge,如果更改edge src/dest,则必须对其进行更新,可能需要使用第二个数据结构,如下图所示。这里矩阵有N*N个单元格,每个单元格都有您想要的“边id”

int matrix[MAX_NODES][MAX_NODES];
int i = 0;
int j = 0;
int k = 0;

/* matrix initialization */
for(i=0; i<MAX_NODES; i++) {
    for(j=0; j<MAX_NODES; i++) {
        matrix[i][j] = -1;
    }
}

/* edge id assing */
for(k=0; k<MAXIMUM_EDGES; i++) {
    matrix[edge[k].src][edge[k].dest] = k;
}

/* now you can get weight from matrix */
printf("edge id for src 0 and dest 1 is %d \n",matrix[0][1]);
int矩阵[MAX_节点][MAX_节点];
int i=0;
int j=0;
int k=0;
/*矩阵初始化*/

对于(i=0;iOk),如果需要使边唯一(因此图形没有方向),则有一个简单的解决方案:

  • 使用有序对
    {src,dst}
    生成一个密钥(任何类型的顺序,对于每对
    {src,dst}
    元组,它们给出一个唯一的密钥),然后将它们存储在某种哈希表(基于密钥的哈希)或有序映射中
  • 如果您允许
    {i,j}
    {j,i}
    键有效(一个有向图),那么在生成键时不要对索引排序,因此对于每对节点,您有两个可能的弧。但是根据您的要求(或者至少是我从您的话中理解的),这超出了范围
这将允许您使用请求的密钥搜索地图,并且不会导致线性搜索。它还有一个优点,即对于非密集图(仅连接了几对节点),它消耗的内存更少

对于非有向图,如果允许自连接,则此类弧的最大数量为
N*(N+1)/2
,如果不允许自连接,则此类弧的最大数量为
N*(N-1)/2
。对于有向图,此类弧的最大数量为
N^2
,因此,如果图人口不密集,则需要hashmap或treemap等替代方法。hashmap具有
O(1)
access time,树状图是
O(log(n))
,其中
n
是图中的弧总数


哈希表(或treemap)的实际实现只是一个练习,或者可以很容易地搜索符合此规范的实现。

这里没有魔法。您必须检查整个“矩阵”,或者有一个辅助数据结构。您可以按(src,dest)对整个数组进行排序如果之后没有更改,则在初始化后配对。然后您可以执行二进制搜索以查找特定(src、dest)的边配对,如果存在。如果需要保留用于初始化数组的边编号,可以将成员添加到
struct edge
以存储边编号。您没有提供有关数据结构的足够详细信息。节点信息的结构如何?如果每个节点信息结构都有一个离开/到达边的列表,则您的oal是很容易实现的。如果不是,你可以相应地构造你的数据。如果图形不是动态的(或者是如此小的动态以至于它仍然有意义)然后你可以在多个地方保存此类信息。或者你可以使用更复杂的参考资料。@Yunnosch,我认为你不需要完整的信息来给出建议。正如回答中所建议的那样。@LuisColorado我不同意。所有答案都以“如果”或“可能”开头或包含“如果”或“可能”。更多的细节将减少猜测,提高答案的可用性,并且可能(实际上我确信)允许更高效和/或优雅的解决方案。或者;
std::unordered_map
其中键为
{src,dest},值是“代码> x< /代码>。在我和你的情况下:确保<代码> Src  @ MooingDuck语言是C,而不是C++:-----这里有C哈希映射库,我确信。在最坏的情况下,可以实现一个map或任何其他方式,以比O(n)更快的速度进行搜索sure@bruno,正因为如此,Mooing Duck建议使用哈希表。。。。因为一个充满洞的大向量是不可取的。。。你知道什么是哈希表(或树形图)吗?你是否考虑过该图可以是1000000(仅)个节点,弧的数量可以是1000000(仅此一次)(与节点的数量相同),并且保留10000000000(哎哟!!!)个数组单元来存储弧?(比所需金额大1000000倍)@LuisColorado非常感谢!!!使用hashmap的解决方案更好。我没有用记忆来思考。这是我第一次来stackoverflow。对不起我的英语。