贪心算法(算法,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<Integer, Deque<Integer>> bmap=new HashMap<>();//数据结构,Hashmap
        //初始化数据结构
        for (int b:B){
            bmap.put(b,new LinkedList<>());
        }
        Deque<Integer> 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

  能力有限,仅供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱打辅助的小可爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值