用c++实现起泡排序、哈密顿回路问题、TSP问题

5.3.2 起泡排序


【问题】 起泡排序(bubble sort)的基本思想是:两两比较相邻记录,如果反序则交换,直至没有反序的记录,如图5.8所示。


【想法】下表给出了一个起泡排序的例子(方括号括起来的为无序区),具体的排
序过程如下。
(1)将整个待排序的记录序列划分成有序区和无序区,初始时有序区为空,无序区包括所有待排序的记录。
(2) 对无序区从前向后依次比较相邻记录,若反序则交换,从而使值较小的记录向前移,值较大的记录向后移(像水中的气泡,体积大的先浮上来,起泡排序因而得名)。
(3)重复执行步骤(2),直至无序区没有反序的记录。
初始键值序列        [50 13 55 97 27 38 49 65]
第一趟排序结果    [13 50 SS 27 38 49 65] 97
第二趟排序结果    [13 50 27 38 49] 55 65 97
第三趟排序结果    [13 27 38 49] 50 5S 65 97
第四趟排序结果    13 27 38 49 50 S5 65 97
【算法实现】 注意,在一趟起泡排序过程中,如果有多个记录交换到最终位置,下一趟起泡排序将不再处理这些记录;另外,在一趟起泡排序过程中,如果没有交换记录操作,则表明序列已经有序,算法将终止。

代码如下。

#include <iostream>
using namespace std;

void BubbleSort(int r[], int n) {
    int j, temp, bound, exchange = n - 1;
    while (exchange!= 0) {
        bound = exchange; 
        exchange = 0;
        for (j = 0; j < bound; j++) 
            if (r[j] > r[j + 1]) {
                temp = r[j];
                r[j] = r[j + 1];
                r[j + 1] = temp;
                exchange = j;
            }
    }
}

int main() {
    int r[] = {5, 4, 6, 2, 1, 3};
    BubbleSort(r, 6);
    for (int i = 0; i < 6; i++) 
        cout << r[i] << " "; 
    return 0;
}


5.4.1 哈密顿回路问题


【问题】 著名的爱尔兰数学家哈密顿(William Hamilton)提出了周游世界问题。假设正十二面体的20个顶点代表20个城市,哈密顿回路问题(Hamilton cycle problem)要求从一个城市出发,经过每个城市恰好一次,然后回到出发城市。图5-10所示是一个正十二面体的展开图,按照图中的顶点编号所构成的回路,就是哈密顿回路的一个解。
【想法】蛮力法求解哈密顿回路的基本思想是,对于给定的无向图G=(V, E), 依
次考查图中所有顶点的全排列,满足以下两个条件的全排列(vi1,vi2 ,...Vin)构成的回路就是哈密顿回路:
(1) 相邻顶点之间存在边,即(vij, Vij+1)∈E(1<=j<=n-1);

(2) 最后一个顶点和第一个顶点之间存在边,即(vin, vi1)∈E.
例如,对于图5-11所示无向图,表5-1给出了蛮力法求解哈密顿回路的过程。

【算法】 蛮力法求解哈密顿回路的算法用伪代码描述如下。
算法:哈密顿回路 HamiltonCycle
输入:无向图G=(V,E)
输出:如果存在哈密顿回路,则输出该回路,否则,输出无解信息
1.对顶点集合(1, 2, ..,n)的每一个全排列vi1vi2.…vin,执行下述操作:
1.1循环变量j从1至n-1重复执行下述操作:
1.1.1如果顶点vij和vij+1之间不存在边,则转步骤1考查下一个全排列;
1.1.2 否则j++;
1.2 如果vin和vi1之间存在边,则输出全排列vi1vi2.…vin,算法结束;
2.输出无解信息;

【 算法分析】 算法HmiltonCycle 在找到一条哈密顿回路后:即可结束算法M,例如表5-1试探了6个全排列后找到了一条哈密顿回路。但是,最坏情况下需要考察顶点集合的所有全排列,时间复杂度为O(n!)。


5.4.2 TSP 问题


【问题】 ISP 问题(traveling salesman problem)是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。


应用实例
某工厂生产几种颜色的汽车,随着汽车颜色的转换,生产线上每台机器都需要从一种颜色切换到另一种颜色,转换开销取决于转换的两种颜色及其顺序。例如,从黄色切换到黑色需要30个单位的开销,从黑色切换到黄色需要80个单位的开销,从黄色切换到绿色需要35个单位的开销,等等。问题是找到一个最优生产调度,使得颜色转换的总开销最少。


【想法】 蛮力法求解 TSP问题的基本思想是,找出所有可能的旅行路线,即依次考查图中所有顶点的全排列,从中选取路径长度最短的哈密顿回路(也称为简单回路)。例如,对于图5-12所示无向带权图,表5-2给出了用蛮力法求解 TSP 问题的过程。

【算法】蛮力法求解TSP问题与求解哈密顿回路问题类似,不同的是将回路经过的边上的权值相加得到相应的路径长度,具体算法请读者自行设计。
【算法分析】 蛮力法求解TSP问题必须依次考查顶点集合的所有全排列,从中找出路经长度最短的简单回路,因此,时间下界是Ω(n!)。除了该问题的一些规模非常小的实例外,蛮力法几乎是不实用的。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/571084.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解JavaScript:对象什么时候创建

&#x1f31f; 我们在chrome浏览器中debug程序。为了好debug我们会写一些在日常开发中基本不会采用的代码书写方式。 JavaScript中创建对象有3中方式&#xff1a; 1、对象字面量&#xff1b; 2、new&#xff1b; 3、Object.create(对象)&#xff1b; 1、使用new创建对象 fun…

MicroSIP电话呼叫软件使用及配置方法

MicroSIP是一款开源的SIP协议电话软件&#xff0c;它可以帮助你在计算机上进行语音和视频通话。下面是关于如何使用和配置MicroSIP的一些基本步骤&#xff1a; 安装MicroSIP 从MicroSIP官方网站下载适合你操作系统的安装包23。 解压下载的文件&#xff0c;并运行安装程序。 …

GRPC学习笔记

GRPC学习笔记 1 GRPC简介 1.1 定义 gRPC&#xff08;Google Remote Procedure Call&#xff0c;Google远程过程调用&#xff09;协议是谷歌发布的基于HTTP2协议承载的高性能、通用的RPC开源软件框架&#xff0c;提供了支持多种编程语言的、对网络设备进行配置和管理的方法。…

更新至2022年上市公司数字化转型数据合集(四份数据合集)

更新至2022年上市公司数字化转型数据合集&#xff08;四份数据合集&#xff09; 一、2000-2022年上市公司数字化转型数据&#xff08;年报词频、文本统计&#xff09; 二、2007-2022年上市公司数字化转型数据&#xff08;年报和管理层讨论&#xff09;&#xff08;含原始数据…

Java中的运算符

运算符是用于数学函数、一些特殊的赋值语句和逻辑比较方面的特殊符号。 赋值运算符&#xff08;“”&#xff09; 赋值运算符是一个二元运算符&#xff08;即对两个操作数进行处理&#xff09;&#xff0c;功能是将右侧的操作数赋值给左侧的操作数。 int a 100; 该表达式就…

prometheus配置监控Java应用服务

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

从底层分析并详解SpringAOP底层实现

首先分析AOP的实现 首先切面&#xff08;Advisor&#xff09;由通知(Advice)和切点(Pointcut)组成 包括前置通知后置通知等等最终都会被转化为实现 MethodInterceptor 接口的环绕通知 先看一段代码了解一下是aop是怎么运作的 首先定义了两个类实现了MethodInterceptor接口&…

XiaodiSec day017 Learn Note 小迪安全学习笔记

XiaodiSec day017 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 day 17 主要内容&#xff1a; php 框架 thinkPHPyiilaravel 使用 fofa 搜索 thinkphp 市面上 thinkphp5 版本较多 url 结构 域名/.php(文件名)/index(目录)/index(函数名)模块名-控…

oracle 12c+ max_string_size参数

一个客户的数据库版本是19.3,在做数据库复制的时候,目标端报错了,查看了一下问题发现表的字段长度有不对,在12c以前我们都知道varchar的长度最大是4000,但是客户这里居然有32767: 把客户的建表语句弄出来,放到我的一个19c的测试环境进行测试: 发现报错了: 这里报错很明显了,是M…

不可思议!我的AI有道英语字典助手竟然与百度千帆AI应用创意挑战赛K12教育主题赛榜首作品差之毫厘

目录 一、前言二、效果对比三、优化《AI英语词典》提示词四、其他获奖作品链接 一、前言 今天看百度千帆AI原生应用创意挑战赛——K12教育主题赛&#xff0c;发现第一名的《我爱记单词》和我早两天发布的一篇《AI英语词典》的想法不谋而合。当时我们应该都是互相不知道对方的&a…

Day1--什么是网络安全?网络安全常用术语

目录 1. 什么是网络安全&#xff1f; 信息系统&#xff08;Information System&#xff09; 信息系统安全三要素&#xff08;CIA&#xff09; 网络空间安全管理流程 网络安全管理 2. 网络安全的常用术语 3. 网络安全形势 4. 中国网络安全产业现状 1. 什么是网络安全&am…

使用IOPaint实现图片擦除路人

IOPaint 是一个免费的开源的 inpainting/outpainting 工具&#xff0c;由最先进的 AI 模型提供支持。 IOPaint 中使用各种模型来修改图像&#xff1a; 擦除&#xff1a;删除任何不需要的物体、缺陷、水印、人物。修复&#xff1a;对图像的特定部分进行修改、添加新对象或替换…

第二期书生浦语大模型训练营第四次笔记

大模型微调技术 大模型微调是一种通过在预训练模型的基础上&#xff0c;有针对性地微调部分参数以适应特定任务需求的方法。 微调预训练模型的方法 微调所有层&#xff1a;将预训练模型的所有层都参与微调&#xff0c;以适应新的任务。 微调顶层&#xff1a;只微调预训练模型…

ACL的知识点和实验

1.ACL的组成 ACL由若干条permit或deny语句组成。每条语句就是该ACL的一条规则&#xff0c;每条语句中的permit或deny就是与这条规则相对应的处理动作。 2.规则编号 &#xff08;1&#xff09;一个ACL中的每一条规则都有一个相应的编号。 &#xff08;2&#xff09;步长是系…

本地CPU搭建知识库大模型来体验学习Prompt Engineering/RAG/Agent/Text2sql

目录 1.环境 2.效果 3.概念解析 4.架构图 5. AI畅想 6.涉及到的技术方案 7. db-gpt的提示词 1.环境 基于一台16c 32G的纯CPU的机器来搭建 纯docker 打造 2.效果 3.概念解析 Prompt Engineering &#xff1a; 提示词工程 RAG&#xff1a; 检索增强生成&#xff1b; …

PDE求格林函数

求Green函数 通俗地解释拉普拉斯方程的基本解的意义 拉普拉斯方程的基本解是一个非常有用的数学概念&#xff0c;它帮助我们理解在某一个点施加一个非常小的影响&#xff08;比如一个微小的推动、热源或电荷&#xff09;时&#xff0c;这种影响是如何在整个空间中扩散和影响其…

业内PMP考试哪家机构通过率高?

选择培训机构时&#xff0c;通过率并不是唯一的标准。PMP培训机构避坑指南&#xff0c;如何选择可靠的机构&#xff1f;哪些是虚假误导&#xff1f;哪些是真正的优质培训机构&#xff1f; 20家业内PMP机构测评 干扰项总结(一)【各种虚假排行榜】 这个行业首先不存在官方的机构…

会议文字记录工具【钉钉闪记】

当开会时&#xff0c;需要文字记录会议内容&#xff0c;但是打字又慢&#xff0c;可以使用钉钉闪记。 钉钉工作台直接搜索-钉钉闪记

【注释和反射】类加载的过程

继上一篇博客【注释和反射】获取class类实例的方法-CSDN博客 目录 三、类加载的过程 例子 三、类加载的过程 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;类加载是一个将类的字节码文件从文件系统或其他来源加载到JVM的内存中&#xff0c;并将其转换为类或接口的…

napi —— linux 网卡驱动收包机制

linux 操作系统一般指 linux 内核。在 linux 上开发应用的时候&#xff0c;可以使用 linux 提供的系统调用。linux 内核管理着机器上的硬件资源&#xff1a;内存&#xff0c;磁盘&#xff0c;网卡等。开发应用的时候不能直接操作这些硬件&#xff0c;而只能通过系统调用来使用…
最新文章