【排序引论】第一章 绪论

简介: 【排序引论】第一章 绪论

@TOC


1 排序问题的引例

在这里插入图片描述在这里插入图片描述
在这里插入图片描述


2 排序问题的定义

在这里插入图片描述
在这里插入图片描述


3 处理机分类

在这里插入图片描述


4 部分符号说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


5 排序问题分类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


6 排序问题的求解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


7 课后习题

习题1
在这里插入图片描述
在这里插入图片描述
习题2
在这里插入图片描述
这一题使用java编写的程序,进行遍历(全排列)求解,但是由于规模较大,需要遍历很久,所以我将题目简化成了2个处理机,p=(9,8,7,6,5,4,3),求解结果如下(最优解由任务索引构成,从0开始):
在这里插入图片描述

Java程序如下:

import lombok.Data;
import lombok.ToString;
import org.apache.commons.lang3.SerializationUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

/**
 * @Author:WSKH
 * @ClassName:Question01
 * @ClassType:
 * @Description:第一章练习题1.5
 * @Date:2022/5/19/17:09
 * @Email:1187560563@qq.com
 * @Blog:https://blog.csdn.net/weixin_51545953?type=blog
 */
public class Question02 {
    // 主函数
    public static void main(String[] args) {
        // 开始时间记录
        long start = System.currentTimeMillis();
        // 处理机个数
//        int m = 5;
        int m = 2;
        // 各工序加工时间
//        int[] p = new int[]{9,9,8,8,7,7,6,6,5,5,5};
        int[] p = new int[]{9,8,7,6,5,4,3};
        // 递归求解(全排列)
        dfs(m,p,new boolean[p.length],new Solution(m),0);
        // 输出求解结果
        System.out.println("最优解个数为:"+solutionHashSet.size());
        if(!solutionHashSet.isEmpty()){
            System.out.println("最优解为:"+bestValue);
            System.out.println("其中1个最优解为:");
            for (Solution solution : solutionHashSet) {
                System.out.println("工序索引:");
                System.out.print(solution.toString(p,1));
                System.out.println("工序P值:");
                System.out.print(solution.toString(p,2));
                break;
            }
            System.out.println("求解用时:"+(System.currentTimeMillis()-start)/1000d+" s");
        }
    }
    // 最优解
    static int bestValue = Integer.MAX_VALUE;
    // 解的集合
    static HashSet<Solution> solutionHashSet = new HashSet<>();
    // 搜索过的解集合
    static HashSet<String> allSolutionHashSet = new HashSet<>();
    // 递归搜索函数
    private static void dfs(int m,int[] p,boolean[] used,Solution solution,int curCount){
        int evaluate = evaluate(solution, p);
        if(!allSolutionHashSet.add(solution.toString())){
            return;
        }
        if (curCount == p.length){
            if(evaluate < bestValue){
                bestValue = evaluate;
                solutionHashSet.clear();
                solutionHashSet.add(Solution.copySolution(solution));
            }else if(evaluate == bestValue){
                solutionHashSet.add(Solution.copySolution(solution));
            }
            return;
        }
        for (int i = 0; i < p.length; i++) {
            // 如果当前i任务没有被安排
            if(!used[i]){
                // 遍历每个处理机
                for (int j = 0; j < m; j++) {
                    // 回溯
                    used[i] = true;
                    solution.getList().get(j).add(i);
                    dfs(m,p,used,solution,curCount+1);
                    used[i] = false;
                    solution.getList().get(j).remove(new Integer(i));
                }
            }
        }
    }
    // 评价函数
    private static int evaluate(Solution solution,int[] p){
        int cMax = 0;
        for (List<Integer> list : solution.getList()) {
            int c = 0;
            for (Integer index : list) {
                c += p[index];
            }
            cMax = Math.max(cMax,c);
        }
        return cMax;
    }
    // 求解结果类
    @Data
    @ToString
    static class Solution implements Serializable{
        List<List<Integer>> list = new ArrayList<>();
        public Solution(int m) {
            for (int i = 0; i < m; i++) {
                list.add(new ArrayList<>());
            }
        }
        // 复制结果
        private static Solution copySolution(Solution solution){
            return SerializationUtils.clone(solution);
        }

        public String toString(int[] p,int flag) {
            StringBuilder sb = new StringBuilder();
            if(flag == 1){
                for (List<Integer> integerList : list) {
                    sb.append(integerList.toString()).append("\n");
                }
                return sb.toString();
            }else if(flag == 2){
                for (List<Integer> integerList : list) {
                    for (Integer integer : integerList) {
                        sb.append(p[integer]).append(",");
                    }
                    sb.append("\n");
                }
                return sb.toString();
            }
            return null;
        }
    }
}

目录
相关文章
|
6月前
|
人工智能 算法 BI
【AcWing算法基础课】第四章 数学知识(未完待续)(2)
从2到n枚举每个数,删掉其所有的倍数,枚举完之后,没有被删掉的数为质数。
49 0
|
6月前
|
存储 人工智能 算法
【AcWing算法基础课】第四章 数学知识(未完待续)(3)
根据下面公式来预处理出等式右边的组合数的值,那么等式左边就可以用等式右边已经算过的值来进行计算(有点像dp)。
58 0
|
10月前
|
人工智能 JavaScript 数据库
数据库原理第二章课后题答案(第四版)
数据库原理第二章课后题答案(第四版)
228 0
|
10月前
|
SQL 存储 自然语言处理
数据库原理第三章课后题答案(第四版)
数据库原理第三章课后题答案(第四版)
142 0
|
6月前
|
人工智能 算法
【AcWing算法基础课】第四章 数学知识(未完待续)(1)
利用秦九韶算法来实现其他进制转十进制的结果求解
51 0
|
8月前
第一章:绪论
第一章:绪论
21 0
|
11月前
|
传感器 IDE 中间件
(2)学习ArduPilot — 绪论
(2)学习ArduPilot — 绪论
114 0
|
存储 自然语言处理 算法
【趣学算法】第一章读书笔记
宕机就是死机,指计算机无法正常工作,包括一切原因导致的死机。计算机主机出现意外故障而死机,一些服务器死锁,服务器的某些服务停止运行等,都可以称为宕机。
80 0
|
存储 数据管理 数据建模
《数据库系统概论》十一章汇总--基于《数据库系统概论》第五版王珊一书|第一章--绪论知识整理和课后习题答案(上)
该系列的博客都是基于《数据库系统概论》第五版王珊一书,进行的知识总结和课后习题汇总,从第一章到第十一章,如果觉得不错记得收藏点个赞吧~你的小小支持,是我的大大动力!
386 0
|
存储 SQL 监控
《数据库系统概论》十一章汇总--基于《数据库系统概论》第五版王珊一书|第一章--绪论知识整理和课后习题答案(下)
该系列的博客都是基于《数据库系统概论》第五版王珊一书,进行的知识总结和课后习题汇总,从第一章到第十一章,如果觉得不错记得收藏点个赞吧~你的小小支持,是我的大大动力!
427 0