如何计算两个数组列表的有效组合数?

时间:2014-02-15 04:36:26

标签: java algorithm while-loop combinations combinatorics

给定数据中心列表dc1dc2dc3和计算机列表h1h2h3,{{ 1}}如下所述 -

h4

我想仅针对以上列表生成以下组合 -

Datacenters = dc1, dc2, dc3
Machines = h1, h2, h3, h4

通常,每次传递中的每个数据中心都应该获得备用计算机/主机。他们不应该得到相同的机器。例如,如上所示在a) {dc1=h1, dc3=h3, dc2=h2} b) {dc1=h2, dc3=h4, dc2=h3} c) {dc1=h3, dc3=h1, dc2=h4} d) {dc1=h4, dc3=h2, dc2=h1} - adc1 gets h1dc2 gets h2,因此每个数据中心的所有计算机都不同。在第二遍中,如dc3 gets h3 - 现在b所示(因为dc1在第一遍中已经获得了h1),dc1 gets h2(bcoz dc2在第一遍中已经获得了h2),并且dc2 got h3(bcoz dc3在第一遍中已经获得了h3)等等。

还有一个例子 - 如果我只有三个主机,那么下面的组合我应该只得到 -

dc3 got h4

所以我提出了以下代码,它完全正常,没有任何问题 -

Datacenters = dc1, dc2, dc3
Machines = h1, h2, h3    

{dc1=h1, dc3=h3, dc2=h2}
{dc1=h2, dc3=h1, dc2=h3}
{dc1=h3, dc3=h2, dc2=h1}

以下是我的班级所做的所有工作 -

public class DataCenterMapping {

    public static void main(String[] args) {

    DatacenterMachineMapping dcm = new DatacenterMachineMapping(Arrays.asList("dc1", "dc2", "dc3"), Arrays.asList(
        "h1", "h2", "h3", "h4"));

        // is there any way to precalculate number of combinations 
        // instead of using while loop here?
        while (true) {
            Map<String, String> coloHost = dcm.getDatacenterMachineMapping();
            System.out.println(coloHost);
            for (Map.Entry<String, String> entry : coloHost.entrySet()) {

            }
        }
    }
}

问题陈述: -

唯一的问题是我有一个while循环,它会一直运行,这不是我想要的。我试图预先计算有效组合的数量,然后我可以使用for循环来迭代它。

有没有什么方法可以预先计算有效组合的数量,而不是在上面的代码中使用while循环?

2 个答案:

答案 0 :(得分:1)

有效组合的数量=数据中心*机器;

答案 1 :(得分:0)

我假设有比数据中心更多的机器。在这种情况下,你的答案是:

hostList.size();

您始终可以生成以下集:

Set 1: (1,1), (2,2), ... (n,n)
Set 2: (1,2), (2,3), ... (n,n+1%m)
...
Set m: (1,m), (2,m+1 % m), ... (n,(n + m-1) % m)

请注意:

(m + 1) % m   = 1
(n + m-1) % m = n-1

所以它确实是:

Set 1: (1,1), (2,2), ... (n,n)
Set 2: (1,2), (2,3), ... (n,n+1%m)
...
Set m: (1,m), (2,1), ... (n,n-1)

事实上......你的代码可以是:

public List<Map<String, String>> createMappings(List<String> datacenters, List<String> hosts) {
    List<Map<String, String>> result = new ArrayList<Map<String, String>>();
    for(int i = 0; i < hosts.size(); i++) {
        Map<String, String> row = new HashMap<String,String>();
        for(int j = 0; j < datacenters.size(); j++) {
            String datacenter = datacenters.get(j);
            int hostIndex = (j + i) % hosts.size();
            String host = hosts.get(hostIndex);
            row.put(datacenter, host);
        }
        result.add(row);
    }
    return result;
}