最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

概述

從今天開始, 小白我將帶大家開啟 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);

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

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

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

相關文章

  • 關于Selenium的UI自動化測試屏幕截圖功能實例代碼

    關于Selenium的UI自動化測試屏幕截圖功能實例代碼

    今天小編就為大家分享一篇關于Selenium的UI自動化測試屏幕截圖功能實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Spring 5.0集成log4j2日志管理的示例代碼

    Spring 5.0集成log4j2日志管理的示例代碼

    本篇文章主要介紹了Spring 5.0集成log4j2日志管理的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Java面試題沖刺第二十八天--數(shù)據(jù)庫(5)

    Java面試題沖刺第二十八天--數(shù)據(jù)庫(5)

    這篇文章主要為大家分享了最有價值的三道關于數(shù)據(jù)庫的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結構和算法相關的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JDK8新特性之判空遍歷寫法

    JDK8新特性之判空遍歷寫法

    這篇文章主要介紹了JDK8新特性之判空遍歷寫法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Spring?Mvc中CommonsMultipartFile的特性實例詳解

    Spring?Mvc中CommonsMultipartFile的特性實例詳解

    這篇文章主要給大家介紹了關于Spring?Mvc中CommonsMultipartFile特性的相關資料,SpringMVC擁有強大的靈活性,非侵入性和可配置性,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • @Schedule?如何解決定時任務推遲執(zhí)行

    @Schedule?如何解決定時任務推遲執(zhí)行

    這篇文章主要介紹了@Schedule?如何解決定時任務推遲執(zhí)行問題。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java實現(xiàn)訂單超時未支付自動取消的8種方法總結

    Java實現(xiàn)訂單超時未支付自動取消的8種方法總結

    這篇文章主要為大家介紹了Java實現(xiàn)訂單超時未支付自動取消功能的8種不同方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-08-08
  • java反射超詳細講解

    java反射超詳細講解

    本文非常詳細的講解了java反射具體的內(nèi)容以及使用,java反射在現(xiàn)今的使用中很頻繁,希望此文可以幫大家解答疑惑,可以幫助大家理解
    2021-08-08
  • Java中動態(tài)地改變數(shù)組長度及數(shù)組轉Map的代碼實例分享

    Java中動態(tài)地改變數(shù)組長度及數(shù)組轉Map的代碼實例分享

    這篇文章主要介紹了Java中動態(tài)地改變數(shù)組長度及數(shù)組轉map的代碼分享,其中轉Map利用到了java.util.Map接口,需要的朋友可以參考下
    2016-03-03
  • SpringBoot自定義啟動器Starter流程詳解

    SpringBoot自定義啟動器Starter流程詳解

    SpringBoot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進starter,應用者只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息并啟動相應的默認配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾
    2022-11-11

最新評論

闽侯县| 申扎县| 玛多县| 买车| 图木舒克市| 汝州市| 安塞县| 冕宁县| 福州市| 兰考县| 安徽省| 繁峙县| 山东省| 永川市| 航空| 连平县| 潜山县| 雅安市| 南充市| 沙湾县| 贵德县| 西乡县| 宜川县| 开平市| 荥阳市| 保靖县| 建平县| 额敏县| 安陆市| 十堰市| 沙洋县| 交口县| 平塘县| 长宁区| 南丹县| 浦县| 万盛区| 赤壁市| 治多县| 壶关县| 长岛县|