zoukankan      html  css  js  c++  java
  • 常用十大算法(五)— 贪心算法

    常用十大算法(五)— 贪心算法

    博客说明

    文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!

    介绍

    贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法

    贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果

    集合覆盖问题

    假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号

    广播台 覆盖地区
    K1 "北京", "上海", "天津"
    K2 "广州", "北京", "深圳"
    K3 "成都", "上海", "杭州"
    K4 "上海", "天津"
    K5 "杭州", "大连"

    思路

    • 遍历所有的广播电台, 找到一个覆盖了最多未覆盖的地区的电台(此电台可能包含一些已覆盖的地区,但没有关系)
    • 将这个电台加入到一个集合中(比如ArrayList), 想办法把该电台覆盖的地区在下次比较时去掉。
    • 重复第1步直到覆盖了全部的地区
    代码实现
    package com.atguigu.greedy;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    
    public class GreedyAlgorithm {
    
    	public static void main(String[] args) {
    		HashMap<String,HashSet<String>> broadcasts = new HashMap<String, HashSet<String>>();
    		HashSet<String> hashSet1 = new HashSet<String>();
    		hashSet1.add("北京");
    		hashSet1.add("上海");
    		hashSet1.add("天津");
    		
    		HashSet<String> hashSet2 = new HashSet<String>();
    		hashSet2.add("广州");
    		hashSet2.add("北京");
    		hashSet2.add("深圳");
    		
    		HashSet<String> hashSet3 = new HashSet<String>();
    		hashSet3.add("成都");
    		hashSet3.add("上海");
    		hashSet3.add("杭州");
    		
    		HashSet<String> hashSet4 = new HashSet<String>();
    		hashSet4.add("上海");
    		hashSet4.add("天津");
    		
    		HashSet<String> hashSet5 = new HashSet<String>();
    		hashSet5.add("杭州");
    		hashSet5.add("大连");
    	
    		broadcasts.put("K1", hashSet1);
    		broadcasts.put("K2", hashSet2);
    		broadcasts.put("K3", hashSet3);
    		broadcasts.put("K4", hashSet4);
    		broadcasts.put("K5", hashSet5);
    		
    		//所有地区
    		HashSet<String> allAreas = new HashSet<String>();
    		allAreas.add("北京");
    		allAreas.add("上海");
    		allAreas.add("天津");
        allAreas.add("天津");
    		allAreas.add("深圳");
    		allAreas.add("成都");
    		allAreas.add("杭州");
    		allAreas.add("大连");
    		
    		//电台集合
    		ArrayList<String> selects = new ArrayList<String>();
    		
    		//临时集合
    		HashSet<String> tempSet = new HashSet<String>();
    		
    
    		String maxKey = null;
    		while(allAreas.size() != 0) { 
    			maxKey = null;
    			for(String key : broadcasts.keySet()) {
    				tempSet.clear();
    				HashSet<String> areas = broadcasts.get(key);
    				tempSet.addAll(areas);
    				tempSet.retainAll(allAreas);
    				if(tempSet.size() > 0 && 
    						(maxKey == null || tempSet.size() >broadcasts.get(maxKey).size())){
    					maxKey = key;
    				}
    			}
    			if(maxKey != null) {
    				selects.add(maxKey);
    				allAreas.removeAll(broadcasts.get(maxKey));
    			}
    		}
    		System.out.println("贪心算法得到集合:" + selects);
    	}
    }
    
    

    感谢

    尚硅谷

    以及勤劳的自己,个人博客GitHub

    微信公众号

  • 相关阅读:
    函数式编程的基础
    monad
    Overview of Polymorphism -多态的分类
    浅谈Overload和Override的区别
    Polymorphism (computer science)
    Type inference
    Ad hoc polymorphism
    trait 和abstract的区别在哪里
    Type class-Typeclass-泛型基础上的二次抽象---随意多态
    泛型中的类型约束和类型推断
  • 原文地址:https://www.cnblogs.com/guizimo/p/13619065.html
Copyright © 2011-2022 走看看