给定一对成对整数,我如何按交叉点分组。有没有人有一个简单的功能,可以将我的输入转换为所需的输出?
输入
[
[0, 1, 3],
[4, 5, 6, 8]
]
期望的输出
x:y
更新:
“将每个数字视为图表中的节点,并将每个配对x
视为节点y
和public static bool someBool = false;
public TypeOf<Bool> findBool(string id)
{
if (id == "item1")
return someBool;
}
之间的边缘,找到可以使用的数字集合边界定义。也就是说,在图论中,在这样的图中找到不同的connected components。
例如,没有办法从4到0旅行,所以它们在不同的组中,但有一种方法可以从1到0(通过3),因此它们属于同一组。“< / p>
重申所需的输出是一组基于潜在随机输入集的可穿越节点。
答案 0 :(得分:2)
你可以这样做。
function group(data) {
var r = [[]],c = 0,a = [0]
var d = data.map(e => e.split(':').sort((a, b) => a - b)).sort((a, b) => a[0] - b[0])
d.forEach(function(e, i) {
if (e[0] > a[a.length - 1]) {
r.push(e)
a.push(e[1])
c++
} else {
r[c] = r[c].concat(e)
a[a.length - 1] = e[1]
}
})
return r.map(e => [...new Set(e)].sort((a, b) => a - b))
}
var test1 = ["0:3", "1:3", "4:5", "5:6", "6:8"]
var test2 = ["0:3", "1:3", "4:5", "9:11", "10:12", '3:6', "7:8"]
var test3 = ["20:15", "4:0", "1:3", "5:1", "9:11", "10:12", '3:6', "8:7"]
console.log(JSON.stringify(group(test1)))
console.log(JSON.stringify(group(test2)))
console.log(JSON.stringify(group(test3)))
答案 1 :(得分:1)
谢谢大家。鉴于每个人的输入,我能够在这里找到一个类似的问题,这引出了我的答案。 Finding All Connected Components of an Undirected Graph
第一步是将输入更改为成对组。
var input = [
[0, 3],
[1, 3],
[4, 5],
[5, 6],
[6, 8]
]
下一步是使用名为广度优先搜索
的广告function breadthFirstSearch(node, nodes, visited) {
var queue = [];
var group = [];
var pair = null;
queue.push(node);
while (queue.length > 0) {
node = queue.shift();
if (!visited[node]) {
visited[node] = true;
group.push(node);
for (var i = 0, len = nodes.length; i < len; i++) {
pair = nodes[i];
if (pair[0] === node && !visited[pair[1]]) {
queue.push(pair[1]);
} else if (pair[1] === node && !visited[pair[0]]) {
queue.push(pair[0]);
}
}
}
}
return group;
};
function groupReachableVertices(input) {
var groups = [];
var visited = {};
for (var i = 0, len = input.length; i < len; i += 1) {
var current_pair = input[i];
var u = current_pair[0];
var v = current_pair[1];
var src = null;
if (!visited[u]) {
src = u;
} else if (!visited[v]) {
src = v;
}
if (src) {
groups.push(breadthFirstSearch(src, input, visited));
}
}
return groups;
};
全部放在一起......
var output = groupReachableVertices(input);
[
[0, 1, 3],
[4, 5, 6, 8]
]
答案 2 :(得分:0)
您可以使用哈希表并收集其中的所有节点。它适用于任何值。
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
{{1}}&#13;
答案 3 :(得分:0)
我想,通过使用Object.values()
和Set
对象,您可以在ES6中执行以下操作。
function getConnectedVertices(a){
return [...new Set(Object.values(a.reduce((h,v) => (h[v[0]] ? h[v[1]] ? (h[v[0]] = h[v[0]].concat(h[v[1]]),
h[v[1]] = h[v[0]])
: (h[v[0]].push(v[1]),
h[v[1]] = h[v[0]])
: h[v[1]] ? (h[v[1]].push(v[0]),
h[v[0]] = h[v[1]])
: h[v[0]] = h[v[1]] = v,
h),{})))];
}
var input = ["0:3", "1:3", "4:5", "5:6", "6:8"].map(s => s.split(":")),
result = getConnectedVertices(input);
console.log(result);