2)有重复值的全排列问题: 注意每次递归的时候去除重复值即可,即有重复值就不进行交换。
4)有顺序的全排列(可以看做非递归实现) 解题思路:使用next_permutation也以获得全排列,即不断调用next_permutation来获得更大值,然后依次输出
5)有特殊要求的全排列,比如要求4必须在3前面 解题思路:进行全排列,然后判断4和3的位置再进行输出;(?更好方法)
6)查找数字排列组合中的第k个组合:(Permutation Sequence) 解题思路: 即给定{1,2,3},和3,返回全排列(123,132,213,231,312,321)中的第三个,即213 注意: 这里不需要将全排列计算出来,然后再得到第k个; 或者使用nextPermutation来计算第k个;这两种时间复杂度都较大; 最好的做法:是直接利用数学知识进行计算: 还是分为两层来看,第一位确定的话,后面P(n-1)的全排列为(n-1)!,则可以根据算法判断出第一位是哪个数值;剩下的类推。
递归法:递归法比较简单,比如八皇后问题,就可以看成已知其中一个皇后位置,求其他7个的位置;然后再确定第二个皇后的位置,求剩下6个皇后的位置;以此类推进行递归,直至递归到最后一层,输出结果。
八、字符串数组排序: 由于字符串实现了Comparable接口,可以比较两个字符串之间的大小,因此可以像实现int数组排序一样实现字符串数组的排序。
九、k个排序链表合并成一个排序链表(或者k个排序数组合并成一个排序数组) 解题思路:创建一个k阶的最小堆,创建堆的时间复杂度o(n*logn);取最小值的事件复杂度为O(1);删除最小值,加入一个新值,调整堆的时间复杂度为O(lgn); 每次取最小值,最为新链表(新数组)的下一个值;然后再从该数值对应数组中取出一个新值放在堆顶,然后调整堆,重复上述过程; 也可以使用败者树来实现。
相关题:找到一个数组中的第k大的值 思路:维护一个k阶最小堆,新值和堆顶元素进行比较,如果大于堆顶元素值,则替换堆顶元素,调整堆;
十、求两个整数的最大公约数;最小公倍数(辗转相除法)
十一、求格雷码: 格雷码是二进制转化成的编码,它的相邻两个数的格雷码只有一个位是不同的;最大数和最小数也只有一个位不同;所以适应了真正电气环境下数值不能连续变化多位的情况; 编码:二进制转化为格雷码: 第一位保持不变,然后从最右边一位开始,与左边一位进行异或,得到的异或值即为格雷码; 1001001010 ==> 1101101111 解码:格雷码转化为二进制: 解码从最左边开始,一个为解码值保持不前,然后从左边第二位开始,每一位和前一位的解码值进行异或,得到的值即为解码值。
解法二:由于题设该数字出现的次数大于其他所有数字出现的次数,故用两个变量,一个表示数字num_data,一个表示次数;当下一个数字等于num_data时,则times加1;如若不等于,time减1;直至times等于0,则将num_data更换为下一个数字;由题知,最后得到的num_data的结果必为所要求得的值。
十八、判断一个数是否是2的n次方: 解题思路: 一个数num是2的n次方则二进制表示为(000010000…),则num-1是(000001111111…);其num与num-1二进制位必然没有一个相等; 因此判断num&(num - 1)是否等于0即可。
二十一、排序算法
在循环遍历中,每一次遍历数组将最大的数字通过交换沉到最后一位
优化:
1)设置一个flag标示,当一次遍历有交换设置为true,没有交换时则表示前面数组已经有序,无需再做遍历
2)记录每一次遍历发生交换的最后位置,因为这个位置之后的数组肯定是有序的;最后交换位置为0时,循环结束
3、希尔排序(插入排序):将数组分为很多小序列,然后分别进行直接插入排序;待整个数组基本有序的时候,最后进行一次插入排序 时间复杂度(O(n^(1-2))):最坏O(n^2),最好O(n);空间复杂度:O(1);不稳定 实现,选取一个增量序列(递减到1)(比如x/2序列)
实现:单指针法,双指针法 快速排序的改进: 1)中枢值的选取:传统方法中使用最左元素或者最右元素,这样在数组基本有序时的性能较差(会退化成冒泡算法); 改进方法一:中枢值 pivot使用随机数来取代(但是产生随机数也会带来性能损耗) 方法二:pivot选取first-middle-last中的中间大小的那个值,时间复杂度会减少到12/7 ln(n) 方法三:median-of-three对小数组来说有很大的概率选择到一个比较好的pivot,但是对于大数组来说就不足以保证能够选择出一个好的pivot,因此还有个办法是所谓median-of-nine,这个怎么做呢?它是先从数组中分三次取样,每次取三个数,三个样品各取出中数,然后从这三个中数当中再取出一个中数作为pivot,也就是median-of-medians。取样也不是乱来,分别是在左端点、中点和右端点取样。什么时候采用median-of-nine去选择pivot,这里也有个数组大小的阀值,这个值也完全是经验值,设定在40,大小大于40的数组使用median-of-nine选择pivot,大小在7到40之间的数组使用median-of-three选择中数,大小等于7的数组直接选择中数,大小小于7的数组则直接使用插入排序
6、简单选择排序:第i次遍历的时候,从i-n序列中找到最小值,与第i个元素进行交换。也就是每一趟遍历都选取一个最小元素作为第i元素值。 时间复杂度:O(n^2);最优: O(n^2);最差:O(n^2); 空间复杂度O(1);不稳定
排序算法性能比较: 时间复杂度: O(n^2)的有:直接插入排序,冒泡排序,简单选择排序 O(n^(1-2)): 希尔排序 O(nlogn):快速排序,归并排序,堆排序 O(n):线性:桶排序;基数排序
选择上: 基本有序时,选择直接插入排序,希尔排序;而快速排序会退化成冒泡排序; 平均性能上最优的是快速排序;在最坏情况下,性能上不如堆排序和归并排序,而n较大时,归并排序优于堆排序,但是其需要的存储空间要大。 直接插入排序在基本有序或者n较小时最佳。
稳定性: 即值相同的关键字在排序前后位置先后顺序不变 稳定的:冒泡、插入、归并、基数 不稳定:选择、希尔、快速、堆;
设待排序元素的个数为n. 1)当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短; 堆排序 : 如果内存空间允许且要求稳定性的, 归并排序:它有一定数量的数据移动,所以我们可能过与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。 2) 当n较大,内存空间允许,且要求稳定性 =》归并排序 3)当n较小,可采用直接插入或直接选择排序。 直接插入排序:当元素分布有序,直接插入排序将大大减少比较次数和移动记录的次数。 直接选择排序 :元素分布有序,如果不要求稳定性,选择直接选择排序 5)一般不使用或不直接使用传统的冒泡排序。 6)基数排序 它是一种稳定的排序算法,但有一定的局限性: 1、关键字可分解。 2、记录的关键字位数较少,如果密集更好 3、如果是数字时,最好是无符号的,否则将增加相应的映射复杂度,可先将其正负分开排序。
二十二、外部排序: 1)根据内存能够缓存的大小,将全部数据进行分段,加入到内存,进行内部排序。 2)然后进行k-路归并;k路归并使用败者树; 胜者树:锦标赛排序 败者树:使用节点来记录失败的元素;胜者往上一层进行比较,扩展一个节点来记录最终的冠军; 败者树重构只需要新添加的元素和父节点进行比较(即败者进行比较);而胜者树则是需要和右节点进行比较;
二十四、二分查找: 考虑有数值的相同情况
当我踏入计算机科学的大门,计算机算法便如同一座神秘而充满魅力的智慧魔方,吸引着我不断探索其中的奥秘。在大一的学习旅程中,与计算机算法的邂逅,成为了我在编程世界里成长与蜕变的重要契机。 算法,这个看似抽象的概念,实则是计算机解决问题的核心策略。它如同一位幕后指挥官,精确地规划着计算机程序的每一
轧钢问题。轧钢需要经过粗轧和精轧两个步骤,已知粗轧钢材分布和精轧所规定的钢材长度,以及钢材的加工标准流程,求解理想的粗轧均值使得最终总浪费的钢材最少。不妨设粗轧的均值为,则有粗轧长度服从:。标准长度记为。其中需要人为设定,已经确定不可更改。从粗轧到精轧,如果粗轧长度小于标准,则整根浪费;若粗轧长度大于标准,则在精轧中去除多余部分,且去除的部分记为浪费的钢材。则有每粗轧一根钢材的期望浪费值如下求得:
Josephus
wake up各位小伙伴大家好,相信大家已经看过前面Column Generation求解VRPTW的线性松弛模型的过程详解了。子问题的目标是找到一条reduced cost最小的合法路径,然后加入到Linear Master Problem中。其实,子问题被称为Elementary Shortest Path Problem with Resource Constraints (ESPPRC)也
算法是计算机学科的一个重要分支,它是计算机科学的基础,更是计算机程序的基石。算法是计算机求解问题的特殊方法。学习算法,一方面需要学习求解计算领域中典型问题的各种有效算法,还要学习设计新算法和分析算法性能的办法。一个算法是对特定问题求解步骤的一种描述,它是指令的有限序列。简单来说,算法就是解决问题的方法和步骤。一、算法有五个特征(一)输入:算法有零个或多个输入量;(二)输出:算法至少产生一个输出量;
前一段时间后台有小伙伴问我能不能写一个人工鱼群(AF)求带时间窗车辆路径问题(VRPTW)的代码,由于时间有限,小编只写了一份用AF求容量受限的车辆路径问题(CVRP)的代码,仅供参考。大体的思路是先对人工鱼进行编码,然后采用人工鱼群算法求解TSP问题中的觅食、聚群、追尾和随机行为对人工鱼群进行更新。但是亟需需要解决的问题是:对于CVRP问题,如何对人工鱼进行编码。如果顾客数目为L,提供的车辆数目
作者 | Victor Sim 编译
基于两种不同的启发函数设计策略,设计A*算法解决八数码问题。
在这篇博文中,我们将详细探讨如何利用 A* 算法来求解迷宫问题,并通过 Python 代码演示其实现过程。A* 算法是一种有效的路径搜索算法,它常用于游戏开发、机器人路径规划等领域。接下来,我们将逐步深入相关的技术原理、架构解析、源码分析、性能优化及应用场景。## 背景描述迷宫问题是计算机科学中一个经典的问题,目标是在一个充满障碍的网格中找到从起点到终点的最短路径。这个问题可以通过图像的方
今天小编为大家讲解一下人工鱼群算法。从算法的名字中可以看出该算法是群体智能优化算法中的一种,人工鱼群算法通过模拟鱼群的觅食、聚群、追尾、随机等行为在搜索域中进行寻优。小编觉得人工鱼群算法有三个比较重要的概念:视野范围、k-距离邻域、多条鱼的中心。一 | 基本概念1 | 视野范围Visual小编觉得人工鱼群算法最重要的概念就是视野范围Visual,在定义视野范围之前大家需要明白两条鱼之间的“距离”是
算法求解问题是计算机科学中的核心内容之一,它不仅涉及到解决问题的逻辑和方法,还涉及到效率和优化。以下是一篇关于算法求解问题的感悟文章。算法求解问题的感悟算法是解决问题的灵魂,它们是一系列定义明确的计算步骤,用于接受输入并产生输出。在计算机科学的世界里,算法是构建高效、可靠软件系统的基础。以下是我在学习和应用算法求解问题过程中的一些感悟。一、算法的力量算法的力量在于其能够将复杂问题简化为可操作的步骤
ESP32 单片机学习笔记 - 03 - MCPWM脉冲输出/PCNT脉冲计数前言,继续上一篇的内容。因为上一篇刚好实验了iic和spi,形成一对。接下来讲pwm另起一篇。 目录ESP32 单片机学习笔记 - 03 - MCPWM脉冲输出/PCNT脉冲计数一、电机PWM输出 - MCPWM1) 引脚初始化 gpio_init2) 配置模块 config3)PWM控制二、编码器脉冲输入 - Pu
这两天一直在查找算法问题之类的问题,现在正好有机会和大家分享一下. 一、TSP问题 TSP问题(Travelling Salesman Problem)即游览商问题,又译为游览推销员问题、货郎担问题,是数学领域中有名问题之一。假设有一个游览商人要造访n个都会,他必须选择所要走的路径,路径的制约是每一个都会只能造访一次,而且最后要回到来原动身的都会。路径的选择标目是要求得的路径行程为全部
问题描写叙述:打一枪可能的环数为0~10,求打10枪总环数为90的概率。 这是一道排列组合问题。能够用循环加递归的方法解决。比方,第一次能够打出0~10环,那么先固定第一次打的环数。然后加上剩下的九次打的环数。就得到总环数。而剩下九次的环数通过递归非常easy求得。代码例如以下: #include
一、实验目的1.熟悉C/C++语言的集成开发环境; 2.掌握算法的概念; 3.了解问题的求解方法; 4.理解递归思想,学会编写递归。二、实验原理算法(algorithm) 一个算法是对特定问题求解步骤的一种描述,它是指令的有限序列。算法具有下列 5个特征: 输入(input);输出(output);确定性(definiteness);能行性(effectiveness);有穷性(finitenes
目录前言问题及思路1.问题概述2.设计思路源码及测试1.输入2.代码 前言算法大作业,综合应用8种算法解决TSP问题,分别是: 蛮力法(顺序查找) 分治法(快速排序)贪心法(求上界)近似算法(贪心+寻找最优贪心值)分支限界法(多城市)动态规划法(少城市)回溯法(中等规模城市数量) Sherwood概率算法改进版(随机第一个城市) 共8种算法(加粗的用于求解问题) 第一次发博客,如有错误,希望大佬
一、求解TSP问题 1、问题描述 TSP问题是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。该问题又称为货郎担问题、邮递员问题、售货员问题,是图问题中最广为人知的问题。 2、最近邻点策略 (1)思想: 从某城市出发,每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市。 (2)算法设计 设图G有n个顶点,边上的代价存储在二维数组
一、TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题、
A*算法是启发式搜素算法中较为出名和高效的算法之一,其关键是对于启发式函数的实际,启发式函数h(x)需要尽可能的接近实际的h(x)∗h(x)∗。下面是人工智能八数码问题使用A*算法求解的源码放在博客上记录一下。程...
6 复位与时钟控制(RCC) 有三种Reset:System 复位,Power 复位,RTC域复位. 6.1 System 复位 System复位所有寄存器,但除了RTC,RTC backup寄存器和控制/状态寄存器RCC_CSR。 system复位产生的情形有: NRST引脚拉低 看门狗计数结束( ...
一、pnpm 相比 npm 的核心优势核心概念图解下图直观展示了 npm 与 pnpm 在安装相同依赖后,项目目录结构的根本性差异。1. npm 的依赖组织方式 (平铺结构 - Hoisting)工作原理: npm (v3+) 和 Yarn v1 采用了一种称为 “提升” (hoisting) 的策 ...
本文展示了C++中switch语句的多种实现方式及其汇编代码分析。主要包括:1)密集连续值可能生成跳转表;2)稀疏值生成条件跳转链;3)小间隔值使用表优化;4)带fall-through的case;5)枚举类型switch;6)字符类型switch;7)大范围边界测试;8)嵌套switch;9)少量case处理;10)状态机应用。代码示例演示了不同场景下的switch实现,并提供了对应的汇编代码分析,展示了编译器如何根据case分布选择最优的跳转策略。
出现的问题 1、最近有小伙伴开发平板的批注在我们平板机器上直接报了“从服务器返回了一个参照”,而之前的版本都是可以直接运行且不报错的。 2、查询了一下网上对于“从服务器返回了一个参照”一些讨论如下: win11下安装应用失败,提示从服务器返回了一个参照_从服务器返回了一个参照怎么解决-博客 ...
SGLANG是一个高性能的语言模型推理引擎,旨在为大语言模型(LLM)应用提供高效、灵活的部署和服务能力。该引擎基于sgl-project开源项目开发,支持复杂的提示工程、多轮对话管理和推理优化,广泛应用于智能客服、内容生成、代码辅助等场景。 ...