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

貪心算法原理及在Java中的使用

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

貪心算法

由于貪心算法本身的特殊性,我們在使用貪心算法之前必須要進行證明,保證算法滿足貪心選擇性質(zhì)。具體的證明方法無外乎就是通過數(shù)學(xué)歸納法來進行證明。但大部分人可能并不喜歡枯燥的公式,因而我這里提供一個使用貪心算法的小技巧。由于貪心算法某種程度上算是動態(tài)規(guī)劃算法的特例,使用條件比較苛刻,因而能夠用動態(tài)規(guī)劃解決的問題盡量都是用動態(tài)規(guī)劃來進行先解決,如果在用完動態(tài)規(guī)劃之后,提交時發(fā)現(xiàn)問題超時,并且進行狀態(tài)壓縮之后仍然超時,此時我們就可以**考慮使用貪心算法來進行解決。**最后強調(diào)一下,我們在使用貪心算法之前,如果要保證解法的絕對正確,一定要對問題進行證明,切記,切記?。?/p>

下邊我們以區(qū)間調(diào)度問題為例,來講一下貪心算法到底該如何取用。

區(qū)間調(diào)度問題

問題描述:

給你很多形如 [start, end] 的閉區(qū)間,請你設(shè)計一個算法,算出這些區(qū)間中最多有幾個互不相交的區(qū)間。

舉個例子,intvs = [[1,3], [2,4], [3,6]],這些區(qū)間最多有 2 個區(qū)間互不相交,即 [[1,3], [3,6]],你的算法應(yīng)該返回 2。注意邊界相同并不算相交。

這個問題大眼一看好像有很多貪心策略可供選擇,比如我們可以選擇區(qū)間最短的?或者選擇開始最早的?。。。

但是上面幾種策略,我們都可以比較容易的舉出反例來排除,同時這也是貪心算法的另一個小技巧--雖然好多時候直接證明貪心策略的正確性很難,但是我們可以從反證法入手,對貪心策略進行證偽,排除許多錯誤的貪心策略。😄😄

好了,說了這么多,那針對該問題正確的貪心策略到底是哪個?

其實正確的思路也比較簡單,可以分成下面三步:

  1. 從區(qū)間集合中選擇一個區(qū)間 x,這個 x 是所有區(qū)間中結(jié)束最早的(end 最?。?。
  2. 把所有與 x 區(qū)間相交的區(qū)間從區(qū)間集合中刪除掉。
  3. 重復(fù) 1 和 2,直到區(qū)間集合為空。之前選出的那些 x 的集合就是最大的不想交子集。

這個思路實現(xiàn)成算法的話,可以按照每個區(qū)間的 end 數(shù)值進行升序排序,因為這樣處理以后實現(xiàn)步驟 1 和步驟 2 就會容易很多。

我們通過下面這個動圖來輔助理解其整個過程。

由于我們在計數(shù)之前進行了排序,所以所有與 x 相交的區(qū)間必然會和 x 的 end 相交;如果一個區(qū)間不想與 x 的 end 相交,它的 start 必須要大于或者等于 x 的 end。

具體實現(xiàn)的代碼如下:

 public int eraseOverlapIntervals(int[][] intervals) {
    if (intervals.length == 0) {
      return 0;
    }
    Arrays.sort(
        intervals,
        new Comparator<int[]>() {
          @Override
          public int compare(int[] o1, int[] o2) {
            return o1[1] - o2[1];
          }
        });
	//排序后的第一個必然可用
    int count = 1;
    int x_end = intervals[0][1];
    for (int[] interval : intervals) {
      if (interval[0] >= x_end) {
        count++;
        x_end = interval[1];
      }
    }
    return count;
  }

應(yīng)用

如果學(xué)會了上面的區(qū)間調(diào)度問題的話,leetCode 上邊有兩個題目,我們便都可以拿下了。

這個問題大眼一看好像和我們之前講的那個區(qū)間調(diào)度問題毫不相關(guān),但仔細分析一下,好像是一模一樣的問題,如果最多有 n 個不重疊的區(qū)間,那么就至少需要 n 個箭頭穿透所有區(qū)間。

 

因而問題也就轉(zhuǎn)化成了,尋找不重疊區(qū)間的個數(shù),但我們要注意的一點是,在 intervalSchedule 算法中,如果兩個區(qū)間的邊界觸碰,不算重疊;而按照這道題目的描述,箭頭如果碰到氣球的邊界氣球也會爆炸,所以說相當(dāng)于區(qū)間的邊界觸碰也算重疊。

 

代碼實現(xiàn)如下:

public int findMinArrowShots(int[][] points) {
    if (points.length <= 0) {
      return 0;
    }
    // 在排序的過程中要考慮溢出情況的發(fā)生
    Arrays.sort(points, (a, b) -> Integer.compare(a[1], b[1]));
    int count = 1;
    int x_end = points[0][1];
    for (int[] point : points) {
      if (point[0] > x_end) {
        count++;
        x_end = point[1];
      }
    }
    return count;
  }

總結(jié)

本文主要結(jié)合一個例子,講了貪心算法的使用方式。

貪心算法實現(xiàn)起來容易,但難在證明。因而文中提供了兩個小竅門輔助判斷是否使用貪心算法:

  1. 在使用考慮貪心算法之前,先考慮使用動態(tài)規(guī)劃(考慮狀態(tài)壓縮)解決該問題,如果問題依然超時,則考慮使用貪心算法。
  2. 在確定貪心策略之前,先用一些特殊的例子驗證貪心策略的正確性。對于正確的貪心策略,為了保證算法的絕對正確,要通過數(shù)學(xué)歸納法進行驗證。

以上就是貪心算法原理及在Java中的使用的詳細內(nèi)容,更多關(guān)于Java 貪心算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 連接Access數(shù)據(jù)庫的兩種方式

    Java 連接Access數(shù)據(jù)庫的兩種方式

    這篇文章主要介紹了Java 連接Access數(shù)據(jù)庫的兩種方式,本文著重講解使用JDBC連接操作Access數(shù)據(jù)庫,需要的朋友可以參考下
    2015-06-06
  • 運行java的class文件方法詳解

    運行java的class文件方法詳解

    這篇文章主要詳細介紹了運行java的class文件方法的相關(guān)資料,需要的朋友可以參考下
    2015-02-02
  • MyBatis處理CLOB/BLOB類型數(shù)據(jù)以及解決讀取問題

    MyBatis處理CLOB/BLOB類型數(shù)據(jù)以及解決讀取問題

    這篇文章主要介紹了MyBatis處理CLOB/BLOB類型數(shù)據(jù)以及解決讀取問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • JAVA簡單分組的算法實現(xiàn)

    JAVA簡單分組的算法實現(xiàn)

    本文介紹了“JAVA簡單分組的算法實現(xiàn)”,需要的朋友可以參考一下
    2013-03-03
  • 使用Mock進行業(yè)務(wù)邏輯層Service測試詳解

    使用Mock進行業(yè)務(wù)邏輯層Service測試詳解

    這篇文章主要介紹了使用Mock進行業(yè)務(wù)邏輯層Service測試詳解,mock是一種模擬對象的技術(shù),用于在測試過程中替代真實的對象,通過mock,我們可以控制被模擬對象的行為和返回值,以便進行更加精確的測試,需要的朋友可以參考下
    2023-08-08
  • java枚舉類的屬性、方法和構(gòu)造方法應(yīng)用實戰(zhàn)

    java枚舉類的屬性、方法和構(gòu)造方法應(yīng)用實戰(zhàn)

    這篇文章主要介紹了java枚舉類的屬性、方法和構(gòu)造方法應(yīng)用,結(jié)合實例形式分析了java枚舉類的定義、構(gòu)造及相關(guān)應(yīng)用操作技巧,需要的朋友可以參考下
    2019-08-08
  • springboot使用@data注解減少不必要代碼

    springboot使用@data注解減少不必要代碼

    這篇文章主要介紹了springboot使用@data注解減少不必要代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 使用Logback設(shè)置日志級別

    使用Logback設(shè)置日志級別

    這篇文章主要介紹了使用Logback設(shè)置日志級別的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • javaWeb項目部署到阿里云服務(wù)Linux系統(tǒng)的詳細步驟

    javaWeb項目部署到阿里云服務(wù)Linux系統(tǒng)的詳細步驟

    這篇文章主要介紹了javaWeb項目部署到阿里云服務(wù)Linux系統(tǒng),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 簡介Java編程中的Object類

    簡介Java編程中的Object類

    這篇文章主要介紹了簡介Java編程中的Object類,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09

最新評論

长武县| 汾阳市| 洛浦县| 子洲县| 景泰县| 淮安市| 滦南县| 鹤峰县| 孟村| 涿鹿县| 金乡县| 康保县| 屏山县| 开远市| 新龙县| 龙川县| 综艺| 墨江| 镇康县| 团风县| 兴宁市| 唐海县| 开化县| 延安市| 司法| 屯门区| 江津市| 台前县| 茶陵县| 密云县| 乌鲁木齐县| 灯塔市| 日照市| 甘孜| 永泰县| 阆中市| 云林县| 长子县| 邵东县| 汝州市| 都昌县|