2022华为软件精英挑战赛笔记

1题目描述

2排名

西北赛区初赛29,复赛21

3 思路

3.1 baseLine

以某一时刻t0为例,代码如下:

for (EdgeNode edgeNode: edgeNodeList){
	for (CustomerNode customer: customerNodeList){
    	if (edgeNode.bandWith < customer.bandWith){
        	customer.bandWith -= edgeNode.bandWith;
        }
    }
}

分配示意图:t0时刻第一个边缘节点请求处理过程:

在这里插入图片描述

t0时刻第一个边缘节点请求分配后:

在这里插入图片描述

t0时刻第二个请求分配:

在这里插入图片描述
分配完成如下:
在这里插入图片描述

3.2 排序和分析

全部迁移完成后,每一个客户节点按照分配带宽排序,如下:

在这里插入图片描述
最终结果是95%位置之和,越小分数越高。因此根据上图可以想到:把95%位置和95%位置的下一个位置的差值迁移走,就可以降低95%位置的分配带宽,如下图:

在这里插入图片描述
迁移过程为:95%位置和下一个位置的差值迁移到其余节点前5%的对应时刻的位置上,例如上图中客户节点1的95%位置为t0对应的分配,将差值迁移到客户节点2的t0位置(在前5%内)。
客户节点2的95%位置为t3对应的分配,将差值迁移到客户节点1的t3位置(在前5%内)。
如下图所示:
在这里插入图片描述

迁移完成重新排序后如下图所示:
在这里插入图片描述
可以看到,客户节点1的t0时刻和客户节点2的t3时刻均有所下降
这一阶段的目的就是**把95%和下一个位置的差值迁移到其他节点的前5%对应的时间位置上**(时间要对应

4 优化和其他

4.1 优化

  1. 按照95%和95%下一个位置差值从大到小排序,确保差值大的先迁移走
  2. 把95%到90%位置的全部数据全迁移走,这样差值更大,进一步降低95%位置的总和
  3. 死循环执行迁移,直到到了指定执行时间

4.2 如何监控程序执行时间

想到了多线程,即另外开启一个线程,sleep一定时间后通知另一个线程,代码如下:

    /**
    * 迁移结束标志位,volatile保证可见性
    */
    public static volatile boolean flag = true;
    /**
    * 周期线程池,可执行延迟任务
    */
    public static ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);

    public static void main(String[] args) {
        // 监控,指定时间后将标志位设为结束
        executor.schedule(()->flag = false, delayTime, TimeUnit.SECONDS);
        // 迁移
        migrate();
    }

    public static void migrate(){
    	// 未结束继续迁迁移
        while (flag){
            // 迁移
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值