栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

贪心算法(算法,java)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

贪心算法(算法,java)

目录

定义:

原理:

存在问题:

示例:

图示:

代码: 

运行结果:

  能力有限,仅供参考。


定义:

       又称贪婪算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。

 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。

原理:

贪心算法一般按如下步骤进行:

①建立数学模型来描述问题。

②把求解的问题分成若干个子问题 [2]  。

③对每个子问题求解,得到子问题的局部最优解 [2]  。

④把子问题的解局部最优解合成原来解问题的一个解 [2]  。

贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。

存在问题:

贪心算法也存在如下问题:

1、不能保证解是最佳的。因为贪心算法总是从局部出发,并没从整体考虑;

2、贪心算法一般用来解决求最大或最小解;

3、贪心算法只能确定某些问题的可行性范围。

示例:

图示:

代码: 
package SF;
import java.util.*;

public class Txsf {
    public static void main(String[] args) {
        int[] A={10,24,8,32,98,55,76,20,3,33};
        int[] B={13,25,25,11,87,64,77,21,6,39};
        int num1=compare(A,B);
        int[] ans=advantagecount(A,B);
        System.out.println(Arrays.toString(advantagecount(A,B)));
        int num2=compare(ans,B);
        System.out.println("大小:"+A.length);
        System.out.println("不做处理:"+num1);
        System.out.println("贪心算法:"+num2);
    }
    //贪心算法
    public static int[] advantagecount(int[] A,int[]B){
        int[] sortB=B.clone();//克隆B
        Arrays.sort(sortB);
        Arrays.sort(A);//排序

        Map> bmap=new HashMap<>();//数据结构,Hashmap
        //初始化数据结构
        for (int b:B){
            bmap.put(b,new LinkedList<>());
        }
        Deque aq=new LinkedList<>();
        //进行贪心算法
        int j=0;
        for (int a:A){
            if (a>sortB[j]){
                bmap.get(sortB[j++]).add(a);
            }else {
                aq.add(a);
            }
        }
        //取出元素
        int[] ans=new int[A.length];
        for (int i = 0; i < B.length; i++) {
            if (bmap.get(B[i]).size()>0){
                ans[i]=bmap.get(B[i]).removeLast();//后进先出
            }else {
                ans[i]=aq.removeLast();
            }
        }

        return ans;
    }
    //比较函数,得出对应位置A比B大的元素个数
    public static int compare(int[]A,int[]B){
        int count=0;
        if (A.length!=B.length)return -1;
        for (int i = 0; i < A.length; i++) {
            if (A[i]>B[i])count++;
        }
        return count;
    }
}

运行结果:
[24, 55, 33, 20, 10, 98, 3, 32, 8, 76]
大小:10
不做处理:2
贪心算法:8

进程已结束,退出代码0

  能力有限,仅供参考。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1024247.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号