貪心算法及其案例用途


貪心算法(greedy algorithm):貪心算法的思想很簡單,求解一個問題分為多個步驟,每次求解時總是做出在當前步驟來看是最優的解,在求解問題時,往往需要對給定的集合中的數據進行一次遍歷,有時候一次遍歷還可能找不出所需要的答案,這時候就需要進行多次遍歷,每一次遍歷其實就是一步求解,就是對下一個子問題的解答,利用貪心算法解決問題不總是那么容易,因為你不總能一下子就能對問題的解決方案進行貪心描述的,也就是貪心策略的構建不總是那么容易被識別,貪心算法求解問題也有一些思路:

a 將原問題分解為子問題,原問題是一個總的描述,它尋求是一個整的結果,子問題可以理解為求解原問題的一些步驟,比如說第一步該怎么做,第一步做完了下一步又該怎么做

b 找出貪心策略,策略就是“該怎么做”,確定了“該怎么做”也就確定了策略

c 根據貪心策略求解每一個子問題的最優解

d 合並所有局部最優解,作為原問題的解返還給調用方

貪心算法是有局限性的,它得出的解可能是該問題的一個合適的解,但可能不是“最優解”,它的特點有:

a 所求解只是一個合適的解

b 不能用該策略求解最優解,“最值”問題不能使用該策略

用示例來理解貪心算法,例如:

1、排班問題,有幾個活動公用一間教室,該教室每次只允許一個活動上演,請給出一個排班計划,要求盡可能多地安排活動,例如這些活動的安排時間有:

a(1,3) b(2,3) c(4,6) e(4,5) f(5,6),a活動開始時間是1點,結束時間是3點,b活動開始時間是2點,結束時間是3點,排班思路:

  • 將活動的結束時間從小到大進行排列
  • 選定排好序的第一個活動為初始活動,尋找下一個活動,條件是下一個活動的開始時間要大於該活動的結束時間
  • 用相同的策略執行步驟2

def arrangeActivity(activitiesList):

  //根據結束時間從小到大對活動進行排序

  sortActivities(activitiesList);

  //選定第一個活動作為初始活動

  initialActivity=activitiesList[0];

  result.add(activitiesList[0]);

  for i=1 to activitiesList.length:

    if initialActivity.endTime < activitiesList[i].startTime:

      //將下一個活動做為初始活動

      initialActivity=activitiesList[i];

      result.add(activitiesList[i]);

2、哈夫曼樹的構建:哈夫曼樹也是利用貪心算法進行構建的,給定一組帶有權重的節點,將這些節點構建成一棵樹,但是是有條件的,每次構建的時候需要將權重最小的兩個節點作為葉子節點,其父節點的權重變為兩個葉子節點的權重和,然后將合並后的父節點放到原來的節點集合中,繼續構建新的樹,已經用過的節點不能再次使用

 

 def constructHuffmanTree(nodeSet):

  while(nodeSet.size()>1):

    //根據權重從小到大對節點值進行排序

    sortNodeSetByWeight(nodeSet);

    //獲取權重最小的兩個節點

    node1=nodeSet.remove(0);

    node2=nodeSet.remove(0);

    //合並兩個節點的權重作為父節點的權重

    newNode=new Node(node1.weight+node2.weight);  

    //注意創建葉子節點

    newNode.left=node1;

    newNode.right=node2;

    //將新的節點放到節點集合中

    nodeSet.add(newNode);

  //當節點集中只剩一個節點時,該節點就是最終的結果

  return nodeSet.get(0);

哈夫曼樹的構建過程也是貪心算法的一種體現,每次只選取權重值最小的兩個節點進行構建,同時將這兩個權重值最小的節點從原節點集中進行刪除,按照這種策略繼續進行構建,直到節點集合中只剩下最后一個節點。

總結,使用貪心算法進行問題求解時,總的解題步驟有:

1、掃描原數據集,找出符合要求的數據

2、根據符合要求的數據來構建局部最優解,然后繼續進行1,2步驟,直到求出所有子問題的解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM