欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?數(shù)據(jù)結構與算法系列精講之貪心算法

 更新時間:2022年02月17日 17:11:41   作者:我是小白呀  
我們可能在好多地方都會聽到貪心算法這一概念,并且它的算法思想也比較簡單就是說算法只保證局部最優(yōu),進而達到全局最優(yōu)。但我們實際編程的過程中用的并不是很多,究其原因可能是貪心算法使用的條件比較苛刻,所要解決的問題必須滿足貪心選擇性質

概述

從今天開始, 小白我將帶大家開啟 Java 數(shù)據(jù)結構 & 算法的新篇章.

貪心算法

貪心算法 (Greedy Algorithm) 指的是在每一步選擇中都采取在當前狀態(tài)下最好或最優(yōu)的選擇, 從而希望導致結果是最好或最優(yōu)的算法. 貪心算法鎖得到的結果不一定是最優(yōu)的結果, 但是都是相對近似最優(yōu)的結果.

貪心算法的優(yōu)缺點:

  • 優(yōu)點: 貪心算法的代碼十分簡單
  • 缺點: 很難確定一個問題是否可以用貪心算法解決

電臺覆蓋問題

假設存在以下的廣播臺, 以及廣播臺可以覆蓋的地區(qū):

廣播臺覆蓋地區(qū)
K1北京, 上海, 天津
K2北京, 廣州, 深圳
K3上海, 杭州, 成都
K4上海, 天津
K5杭州, 大連

貪心算法的核心思想:

  • 把所有需要覆蓋的地區(qū)取集合
  • 從電臺中取覆蓋集合中地區(qū)最多的一個
  • 集合中去除已覆蓋地區(qū), 繼續(xù)匹配

代碼實現(xiàn)

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

public class 貪心算法 {

    // 集合, 存放廣播臺
    static HashMap<String, HashSet<String>> broadcasts = new HashMap<>();

    // 集合, 存放地區(qū)
    static HashSet<String> areas = new HashSet<String>();

    // 貪心算法
    public static ArrayList<String> Greedy() {

        // 創(chuàng)建數(shù)組存放結果
        ArrayList<String> selects = new ArrayList<>();

        // 循環(huán)直至地區(qū)都覆蓋
        while (areas.size() != 0) {

            // 存放交集最大的廣播臺
            String maxKey = null;

            // 存放交集最大的值
            int maxKeySize = 0;

            // 遍歷每個剩余電臺
            for (String key : broadcasts.keySet()) {

                // 取出交集個數(shù)
                int currSize = getRetainSize(key);

                // 替換當前最大
                if (currSize > 0 && currSize > maxKeySize) {
                    maxKey = key;
                    maxKeySize = currSize;
                }
            }


            // 添加廣播臺到結果
            selects.add(maxKey);

            // 移除廣播臺
            areas.removeAll(broadcasts.get(maxKey));
        }

        return selects;
    }

    // 剩余數(shù)量
    public static int getRetainSize(String key) {

        // 如果為空返回0
        if (key == null) return 0;

        // 存放key對應的地區(qū)集合
        HashSet<String> tempSet = new HashSet<>();

        // 取key對應的地區(qū)
        tempSet.addAll(broadcasts.get(key));

        // 取交集
        tempSet.retainAll(areas);

        return tempSet.size();
    }

    public static void main(String[] args) {

//        | K1 | 北京, 上海, 天津 |
//        | K2 | 北京, 廣州, 深圳 |
//        | K3 | 上海, 杭州, 成都 |
//        | K4 | 上海, 天津 |
//        | K5 | 杭州, 大連 |


        // 創(chuàng)建廣播臺
        HashSet<String> K1 = new HashSet<>(Arrays.asList("北京", "上海", "天津"));
        HashSet<String> K2 = new HashSet<>(Arrays.asList("北京", "廣州", "深圳"));
        HashSet<String> K3 = new HashSet<>(Arrays.asList("上海", "杭州", "成都"));
        HashSet<String> K4 = new HashSet<>(Arrays.asList("上海", "天津"));
        HashSet<String> K5 = new HashSet<>(Arrays.asList("杭州", "大連"));

        // 加入map
        broadcasts.put("K1", K1);
        broadcasts.put("K2", K2);
        broadcasts.put("K3", K3);
        broadcasts.put("K4", K4);
        broadcasts.put("K5", K5);

        areas.addAll(K1);
        areas.addAll(K2);
        areas.addAll(K3);
        areas.addAll(K4);
        areas.addAll(K5);

        // 調試輸出
        System.out.println(broadcasts);
        System.out.println(areas);

        ArrayList<String> result = Greedy();
        System.out.println(result);
    }
}

到此這篇關于Java 數(shù)據(jù)結構與算法系列精講之貪心算法的文章就介紹到這了,更多相關Java 貪心算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Java sort()數(shù)組排序(升序和降序)

    詳解Java sort()數(shù)組排序(升序和降序)

    這篇文章主要介紹了詳解Java sort()數(shù)組排序(升序和降序),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • java 線性表接口的實例詳解

    java 線性表接口的實例詳解

    這篇文章主要介紹了java 線性表接口的實現(xiàn)實例詳解的相關資料,希望通過本能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java三種IO模型原理實例詳解

    Java三種IO模型原理實例詳解

    這篇文章主要介紹了Java三種IO模型原理實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Java設計模式之策略模式解析

    Java設計模式之策略模式解析

    這篇文章主要介紹了Java設計模式之策略模式解析,在策略模式中,一個類的行為或其算法可以在運行時更改,這種類型的設計模式屬于行為型模式,需要的朋友可以參考下
    2023-10-10
  • Java實現(xiàn)發(fā)送郵件功能時碰到的坑

    Java實現(xiàn)發(fā)送郵件功能時碰到的坑

    之前用163郵箱發(fā)郵件時明明是成功的,但是使用中國移動自己的郵箱時,無論如何在linux服務器中都發(fā)送不成功。下面小編給大家說下我是怎么解決的,一起看下吧
    2016-06-06
  • Java 邏輯控制全面詳解

    Java 邏輯控制全面詳解

    程序的邏輯主要分為三種結構:順序結構、分支結構、循環(huán)結構,順序結構的所有的代碼都是從前向后執(zhí)行的。有些時候順序是由“{}”為界限的,下文將全面詳細的介紹
    2021-10-10
  • 基于Java代碼操作Redis過程詳解

    基于Java代碼操作Redis過程詳解

    這篇文章主要介紹了基于Java代碼操作Redis過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • MyBatisPlus深入探究映射匹配的兼容性

    MyBatisPlus深入探究映射匹配的兼容性

    在最近的工作中,碰到一個比較復雜的返回結果,發(fā)現(xiàn)簡單映射已經(jīng)解決不了這個問題了,只好去求助百度,學習mybatis映射匹配應該怎么寫,將學習筆記結合工作碰到的問題寫下本文,供自身查漏補缺,同時已被不時之需
    2022-08-08
  • Java編程一個隨機數(shù)產生模塊代碼分享

    Java編程一個隨機數(shù)產生模塊代碼分享

    這篇文章主要介紹了Java編程一個隨機數(shù)產生模塊代碼分享,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • java8中NIO緩沖區(qū)(Buffer)的數(shù)據(jù)存儲詳解

    java8中NIO緩沖區(qū)(Buffer)的數(shù)據(jù)存儲詳解

    在本篇文章中小編給大家分享了關于java8中NIO緩沖區(qū)(Buffer)的數(shù)據(jù)存儲的相關知識點,需要的朋友們參考下。
    2019-04-04

最新評論