Algorithm 查找是否可以进行数据通信
在x轴上提供了N个路由器,它们希望彼此通信。如果两个路由器之间的距离小于或等于K,则一个路由器可以向另一个路由器发送消息 给定要发送消息的p对路由器。我们需要用“Y”或“N”来判断这对路由器之间的天气数据传输是否可行 注意:X轴上的同一点上可以有多个路由器 限制条件: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
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.