数据结构-贪心算法(Java实现)

贪心算法
本程序主要实现为从一堆的含有各个城市(可能相同)中,如下五组
北京、上海、天津     广州、北京、深圳     成都、上海、杭州    上海、天津   杭州、大连
选取其中的几组,使得它们组成的数组中含有全部的城市
北京、上海、天津、广州、深圳、成都、杭州、大连
package datastructure.greedyalgorithm;

/*
    @CreateTime 2021/9/24 20:58
    @CreateBy cfk

*/

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

public class GreedyAlgorithm {

    public static void main(String[] args) {

        //创建一个hashmap集合存储所有的城市
        HashMap<String, HashSet<String>> cities = new HashMap<>();

        //创建第一组城市
        HashSet<String> city1 = new HashSet<>();
        city1.add("北京");
        city1.add("上海");
        city1.add("天津");

        //创建第二组城市
        HashSet<String> city2 = new HashSet<>();
        city2.add("广州");
        city2.add("北京");
        city2.add("深圳");

        //创建第三组城市
        HashSet<String> city3 = new HashSet<>();
        city3.add("成都");
        city3.add("上海");
        city3.add("杭州");

        //创建第四组城市
        HashSet<String> city4 = new HashSet<>();
        city4.add("上海");
        city4.add("天津");

        //创建第五组城市
        HashSet<String> city5 = new HashSet<>();
        city5.add("杭州");
        city5.add("大连");

        //把所有的城市添加入map中
        //这里要注意 不同的key对应生成的哈希值是不一样的,存入hashmap中的顺序也是不一样的,所以最后的结果可能受这里影响
        //当输入的为K1-K5 结果为 K1 K2 K3 K5
        //输入的是C1-C5 结果为C3 C2 C4 C5
        cities.put("K1",city1);
        cities.put("K2",city2);
        cities.put("K3",city3);
        cities.put("K4",city4);
        cities.put("K5",city5);

        //创建一个集合存储所有的城市
        HashSet<String> allCities = new HashSet<>();
        allCities.add("北京");
        allCities.add("上海");
        allCities.add("天津");
        allCities.add("广州");
        allCities.add("深圳");
        allCities.add("成都");
        allCities.add("杭州");
        allCities.add("大连");

        //创建一个临时的集合存储临时城市
        HashSet<String> tmpCity = new HashSet<>();

        //创建一个集合存储包含所有元素的数组集合
        List<String> total = new ArrayList<>();

        //初始化一个临时key为了后面做贪心判断
        String tmpKey = null;

        //当存储所有城市的集合不为空时说明还没有收集完全全部集合
        while (allCities.size() != 0) {
            tmpKey = null;
            for (String key : cities.keySet()) {

                //清空这个临时数组
                tmpCity.clear();

                //把获取的数据存到临时集合中
                HashSet<String> selectCity = cities.get(key);
                tmpCity.addAll(selectCity);

                //把两个集合的交集存储在临时集合中
                tmpCity.retainAll(allCities);


                //贪心算法核心
                if (tmpCity.size() > 0 &&
                        //这里要注意比较的是你临时数组与全部数组的交集 和 我选择的最大数组和全部数组的交集
                        (tmpKey == null || tmpCity.size() > getTogether(tmpKey,cities,allCities).size())){
                    tmpKey = key;
                }

            }
            if (tmpKey != null) {
                //把对应的城市集合添加到结果集合中
                total.add(tmpKey);
                //移除已经被扫描出的城市
                allCities.removeAll(cities.get(tmpKey));

            }


        }

        System.out.println(total);

    }
    //获取交集的方法
    public static HashSet<String> getTogether(String key, HashMap<String,HashSet<String>> h1, HashSet<String> h2) {
        HashSet<String> set = h1.get(key);
        set.retainAll(h2);
        return set;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值