Javascript 根据每个节点的权重进行聚类的算法/函数?
假设我有以下几点:Javascript 根据每个节点的权重进行聚类的算法/函数?,javascript,python,algorithm,function,Javascript,Python,Algorithm,Function,假设我有以下几点: A 2 B 2 C 2 D 6 E 12 F 3 G 3 我想要一个函数,它接受所需组的#,并基于#/weight创建一个“集群”。例如,如果所需组的#是4,那么它可以返回类似于: (A, B, C), (D), (F, G), (E) A+B+C = 6 D = 6 F + G = 6 E = 12 有没有什么算法/函数可以让我得到这样的结果?有什么理想的方法吗 第一步,过滤掉任何大于6的值。但这里有个问题 由于要求将组中所有操作数相加的结果为6,因此不可能从操作数
A 2
B 2
C 2
D 6
E 12
F 3
G 3
我想要一个函数,它接受所需组的#,并基于#/weight创建一个“集群”。例如,如果所需组的#是4,那么它可以返回类似于:
(A, B, C), (D), (F, G), (E)
A+B+C = 6
D = 6
F + G = 6
E = 12
有没有什么算法/函数可以让我得到这样的结果?有什么理想的方法吗 第一步,过滤掉任何大于6的值。但这里有个问题 由于要求将组中所有操作数相加的结果为6,因此不可能从操作数有限的小集合中获得任意数量的组。您可以在一个组中生成不同的操作数组合,但这需要将组中的所有操作数相加得到6。正如我在您的示例中看到的,对于大于或等于6的操作数,这些操作数形成了它们自己的组(例如,e和D) 就像你有两个2,一个3,只有一个1,通过在每个组中使用唯一的操作数,你能从这些数字的不同组合中得到多少个7
A = 2
B = 2
C = 3
D = 1
上述操作数小于7 让我们排列这些操作数:
A + B = 4
A + C = 3
A + D = 3
A + B + C = 7
A + B + D = 5
A + C + D = 6
B + C = 5
B + D = 3
B + C + D = 6
C + D = 4
答案只有一组,当我们把它的所有操作数相加时,我们得到7。此组由三个操作数组成A+B+C
这就是您所需算法的情况。尽管有时您可以获得任意数量的组,但即使您使用其他组中使用的操作数,也不能始终保证这一点,就像上面的示例一样,只有一个组在添加所有操作数时得到7
另外,加法是可交换的(A+B=B+A),所以我没有包括B+A
,C+B
,D+C
因此,给定上述集合,您只能得到一个组,当我们将其所有操作数相加时,得到7。问题不仅在于组中操作数的唯一性;这也是我们拥有的有限值集的性质,它阻止我们获得任意数量的组。这似乎是根据作业的权重将作业均匀分组,以分布在n个线程上 对于少量的作业,组合学可能是一种可行的方法,但是如果您有数千个作业要分组并分布在数百个线程上,那么组合学肯定是不可行的 因此,我的方法将是一个简单得多的两阶段解决方案。第一个阶段返回一个几乎完美的结果,第二个阶段尝试使其达到完美 由于时间有限,我现在只实施第一阶段,第二阶段留待以后几天。同时,请将其作为一项研究,并尝试自己实施。你自己 第一阶段的想法非常简单
函数chunkJobs(js,cc){//jobs和chunk计数为参数
var init=[…数组(cc)].map(=>({“作业”:[],“权重”:0}));
返回js.sort((a,b)=>b.weight-a.weight)
.减少(功能(cs,j){
var c=cs.reduce((p,c)=>p.weight console.log(result)
查看一下。不清楚您想要什么。是否要将具有相同权重的所有节点收集到单独的簇中?如果簇的数量与唯一权重的数量不同,该怎么办?还是希望簇的聚合权重相同?(那么在你的例子中E不是一个好的簇。)尽可能使簇的聚合权重相同。
A + B = 4
A + C = 3
A + D = 3
A + B + C = 7
A + B + D = 5
A + C + D = 6
B + C = 5
B + D = 3
B + C + D = 6
C + D = 4