Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找是否可以进行数据通信_Algorithm_Graph Theory - Fatal编程技术网

Algorithm 查找是否可以进行数据通信

Algorithm 查找是否可以进行数据通信,algorithm,graph-theory,Algorithm,Graph Theory,在x轴上提供了N个路由器,它们希望彼此通信。如果两个路由器之间的距离小于或等于K,则一个路由器可以向另一个路由器发送消息 给定要发送消息的p对路由器。我们需要用“Y”或“N”来判断这对路由器之间的天气数据传输是否可行 注意:X轴上的同一点上可以有多个路由器 限制条件: 1 ≤ N, P ≤ 10^5 0 ≤ Ai, K ≤ 10^9 1 ≤ A, B ≤ N 所以我希望每个查询都有一个非常有效的算法 假设我们有5个路由器,K=3,2个查询如下: 路由器位置:=0 3 8 5 12 问题1:12

在x轴上提供了N个路由器,它们希望彼此通信。如果两个路由器之间的距离小于或等于K,则一个路由器可以向另一个路由器发送消息

给定要发送消息的p对路由器。我们需要用“Y”或“N”来判断这对路由器之间的天气数据传输是否可行

注意:X轴上的同一点上可以有多个路由器

限制条件:

1 ≤ N, P ≤ 10^5
0 ≤ Ai, K ≤ 10^9
1 ≤ A, B ≤ N
所以我希望每个查询都有一个非常有效的算法

假设我们有5个路由器,K=3,2个查询如下:

路由器位置:=0 3 8 5 12

问题1:12

这里的答案是“Y”,因为两者都在彼此的范围内

问题2:13

这里的答案是“Y”,因为两者都在彼此的范围内
对于对(1,3),路由器1可以向路由器2发送消息,路由器2可以向路由器4发送消息,也可以向路由器3发送消息。

首先映射路由器位置/距离:

List<int> Routers=new List<int>();

Routers.Add(0);
//....
Routers.Add(12);

代码位于C#

路由器位于x轴上,因此,如果两个路由器之间的差异小于边界,则两个路由器可以直接对话;如果路由器之间在x轴上的路径上没有间隙,则两个路由器可以间接对话,间隙过大,消息无法通过


将路由器按X轴上的上升位置排序,然后按照X的顺序考虑它们,并将它们分解成不包含太大间隙的路由器的运行。为运行编号,然后两个路由器可以通信,当且仅当它们都处于相同的运行编号时。

给定间接通信,我将首先查找间隙,即沿x轴的两个相邻路由器之间的间隔太大,无法通信的位置

对于每个路由器,记录右侧下一个间隙的位置。将线的末端视为间隙

当且仅当两个路由器共享相同的下一个间隙时,它们才能通信

============================================================================

Sort the list of routers in ascending x co-ordinate order

Initialize integer groupIndex to 0.

For each router in x co-ordinate order:
  Mark it with the current groupIndex
  If there is a next router and it is more than distance K away, increment groupIndex

Two routers can communicate if, and only if, they are marked with the same groupIndex.

这对数学交流可能更好。不确定这是否是一个编程问题。我说数学交换是因为它可能是一个图论问题。这是一个“计算机科学”问题,但我有一种感觉,这将被标记为离题。@Tommy为什么要进行数学交换?它与更好、更高效的算法有关只是预计算并存储每个路由器的范围。或者,你有内存限制吗?@Tommy,图论不在算法之下吗?另一个提示:查找“联合查找”。另一个提示:一个简单的算法可以在二次时间内预计算。一个更好的算法按x对路由器进行排序,然后花费线性的额外时间。它们不需要直接通信。因此,请更新您的答案。请用一些例子解释我不了解您的方法,这类似于Patricia Shanahan在回答中讨论的方法。请提供一些伪代码it@user3786422既然你认识到了与另一个不同措辞的答案的相似性,你似乎理解这个想法。请提供一个例子来证明它的准确性。这个例子充其量只能证明算法工作的输入组合的存在,而不能证明算法的正确性。然而,如果你对例子感兴趣,为什么不在自己的上面运行一些算法呢?事实上,这会很好地解释你的想法。看我编辑的文章。这就是你想说的吗?
private bool CanCommunicate(intx i1,inti2)
{
    if (Math.Abs(i1-i2)<=K
    return true;
    else
    return false;
}
foreach (Pair p in  Pairings)
{
  if(CanCommunicate(p[0],p[1])
  return "Y";;
  else 
  return "N";
}
Sort the list of routers in ascending x co-ordinate order

Initialize integer groupIndex to 0.

For each router in x co-ordinate order:
  Mark it with the current groupIndex
  If there is a next router and it is more than distance K away, increment groupIndex

Two routers can communicate if, and only if, they are marked with the same groupIndex.