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

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

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

概述

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

貪心算法

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

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

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

電臺覆蓋問題

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

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

貪心算法的核心思想:

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

代碼實(shí)現(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ù)組存放結(jié)果
        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);

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


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

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

        return selects;
    }

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

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

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

        // 取key對應(yīng)的地區(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);

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

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

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

相關(guān)文章

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

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

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

    java 線性表接口的實(shí)例詳解

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

    Java三種IO模型原理實(shí)例詳解

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

    Java設(shè)計(jì)模式之策略模式解析

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

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

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

    Java 邏輯控制全面詳解

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

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

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

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

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

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

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

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

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

最新評論