Javascript 如何在多维数组中发现模式并将数据分解为可用类型,如映射或集合

Javascript 如何在多维数组中发现模式并将数据分解为可用类型,如映射或集合,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,这是一个非常开放的问题,我想这不是一个完全特定的问题,但我认为这是一个很好的例子,说明我们的大脑可以很容易地做些什么,可能很难编写代码。一个解决方案会很酷,但我更感兴趣的是你想要的方法 这个问题来自CodeSignal的图论部分,要求我们编写一个函数,根据给定的邻接矩阵(在本例中不需要知道)确定一个图是否类似蝴蝶结 您可以想象一个中心顶点有两对“道路”(或角度),每对在其其他两个顶点之间共享一条专用的“道路” 我还做了其他几个问题,但这是一个由特定形状组成的新集合,更容易发现传递输入的模式。我使

这是一个非常开放的问题,我想这不是一个完全特定的问题,但我认为这是一个很好的例子,说明我们的大脑可以很容易地做些什么,可能很难编写代码。一个解决方案会很酷,但我更感兴趣的是你想要的方法

这个问题来自CodeSignal的图论部分,要求我们编写一个函数,根据给定的邻接矩阵(在本例中不需要知道)确定一个图是否类似蝴蝶结

您可以想象一个中心顶点有两对“道路”(或角度),每对在其其他两个顶点之间共享一条专用的“道路”

我还做了其他几个问题,但这是一个由特定形状组成的新集合,更容易发现传递输入的模式。我使用了大量的Array.prototype方法来构建和转换多维数组。每个问题都花了我相当痛苦的时间。我真的很难找到一种有效的方法来处理这些数据

这里有一个“道路”(或度)列表作为测试用例。(为了方便起见,我将邻接矩阵转换为道路数组。)每个数字代表一个节点或一个顶点(如果更简单的话,将只有五个)

(注意:中心顶点不会在数组中指定,这只是一个示例。)

即使没有图论培训,我们也可以在几秒钟内看出这是一个有效的“领结”。

注意:有些道路是重复的,但我是故意这样做的。。。我想如果它更容易看,也更容易编码


我们希望从这样的数组中读取数据,并确定(返回true)道路是否形成领结 找到有效地完成这类事情的算法可能真的很棘手——我不一定在这方面给你建议,但我可以提供一些编码建议

1) 转换数组->对象 一个普通的JavaScript,或一个简单的JavaScript,可以是一种用于图形的有用数据类型。它们是非常相似(略有不同)的数据类型,根据键值对存储内容。一种策略是:您可以将每个节点设置为键,并将一组连接的节点设置为值。对于这些信息来说,这似乎是一个更有用的结构。大概是这样的:

/**
*将数组数组转换为对象
*其中{key=node,val=[连接节点的数组]}
*/
功能阵列OBJ(roadsArr){
//从空对象开始
var obj={};
//迭代roads数组中的每一对
//初始化新的{key:[val]}条目(如果不存在)
//否则,添加到现有的值列表中
道路自动人行道(功能(成对){
var key=pair[0];
var val=对[1];
if(obj[键]==未定义){
obj[key]=[val];
}否则{
obj[键]。推送(val);
}
});
返回obj;
}
roadsArr=[
["0", "1"],
["0", "2"],
["1", "0"],
["1", "2"],
["2", "0"],
["2", "1"],
["2", "3"],
["2", "4"],
["3", "2"],
["3", "4"],
["4", "2"],
["4", "3"]
];
var roadsObj=阵列目标(roadsArr);

控制台日志(roadsObj)找到有效地完成这类事情的算法可能非常棘手——我不一定能就此向您提供建议,但我可以提供一些编码建议

1) 转换数组->对象 一个普通的JavaScript,或一个简单的JavaScript,可以是一种用于图形的有用数据类型。它们是非常相似(略有不同)的数据类型,根据键值对存储内容。一种策略是:您可以将每个节点设置为键,并将一组连接的节点设置为值。对于这些信息来说,这似乎是一个更有用的结构。大概是这样的:

/**
*将数组数组转换为对象
*其中{key=node,val=[连接节点的数组]}
*/
功能阵列OBJ(roadsArr){
//从空对象开始
var obj={};
//迭代roads数组中的每一对
//初始化新的{key:[val]}条目(如果不存在)
//否则,添加到现有的值列表中
道路自动人行道(功能(成对){
var key=pair[0];
var val=对[1];
if(obj[键]==未定义){
obj[key]=[val];
}否则{
obj[键]。推送(val);
}
});
返回obj;
}
roadsArr=[
["0", "1"],
["0", "2"],
["1", "0"],
["1", "2"],
["2", "0"],
["2", "1"],
["2", "3"],
["2", "4"],
["3", "2"],
["3", "4"],
["4", "2"],
["4", "3"]
];
var roadsObj=阵列目标(roadsArr);

控制台日志(roadsObj)节点“0”是中心顶点吗?其他节点被布置成蝴蝶结形状?中心顶点没有指定。。。好问题。我会更新的。似乎所有的东西都是连接在一起的——我不太明白那个数组是如何表示领结的。也许一张图表会有所帮助?数字是节点。”2'连接到其他四个节点,因此它是中心,在本例中,明白了,谢谢。另外,您是否关心“双向”信息,或者是否可以删除重复的顶点([1,2]&[2,1]=>[1,2])节点“0”是中心顶点?其他节点被布置成蝴蝶结形状?中心顶点没有指定。。。好问题。我会更新的。似乎所有的东西都是连接在一起的——我不太明白那个数组是如何表示领结的。也许一张图表会有所帮助?数字是节点。”2'连接到其他四个节点,因此它是中心,在本例中,明白了,谢谢。另外,您是否关心“双向”信息,或者是否可以删除重复的顶点([1,2]&[2,1]=>[1,2])太好了!如果这对你有帮助,请将投票和标记为已接受,这样我就可以拥有神奇的互联网点数:)我一直没有考虑将事物作为键值对来避免对象,这真的很奇怪……哈哈。如果有足够多的循环和数组方法,您可能也可以这样做,但这显然更好。哎呀,看来我还没有这个选项:|太好了!如果这对你有帮助,p
[ [ '0', '1' ],
  [ '0', '2' ],
  [ '1', '0' ],
  [ '1', '2' ],
  [ '2', '0' ],
  [ '2', '1' ],
  [ '2', '3' ],
  [ '2', '4' ],
  [ '3', '2' ],
  [ '3', '4' ],
  [ '4', '2' ],
  [ '4', '3' ] ]