kupeThinkPoem
这个作者很懒,什么都没留下…
展开
-
四个元素最大值的simd优化
3 数据类型:本示例适用于32位整数,浮点数需改用_mm_max_ps。2 减少指令数:从4次比较减少到2次向量操作。2)第一次移位后:[2, 6, 3, 1]4)第二次移位后:[3,3, 6, 6]5) 比较结果:[6, 6, 6, 6]1)初始向量:[6, 2, 1, 3]3)比较结果:[6, 6, 3, 3]原创 2025-04-03 09:31:50 · 335 阅读 · 0 评论 -
三次反转法(手摇算法)
1 左移k位:修改为reverse(0, k-1) → reverse(k, n-1) → reverse(0, n-1)reverse(arr, k, n-1);2 负数处理:若k<0,转换为等效的正数位移(如左移2位等价于右移3位)。2. 前2个反转 → [4,5,3,2,1]3. 后3个反转 → [4,5,1,2,3]1. 整体反转 → [5,4,3,2,1]2 前k个元素反转:反转前k个元素。原创 2025-03-31 12:24:05 · 216 阅读 · 0 评论 -
合并两个有序序列—逆向双指针
逆向双指针是一种常用于处理两个有序序列的高效算法技巧,其核心思想是从序列的末尾开始遍历,避免覆盖有效数据或多次移动元素。1)合并两个有序数组(如 nums1 和 nums2,其中 nums1 尾部有预留空间)。// 处理nums2剩余元素(无需处理nums1剩余,因为它们已在正确位置)1)比较 nums1[i] 和 nums2[j],将较大值放入 nums1[k]。3)处理剩余元素:若 nums2 有剩余元素,直接复制到 nums1 头部。i 指向第一个序列有效元素末尾(如 nums1 的最后一个元素)原创 2025-03-27 11:39:58 · 839 阅读 · 0 评论 -
Ciura序列
2) 后续增量可通过最后一个元素乘以2.25生成(如:701*2.25=1577,1577*2.25=3548...)。1)经验证最优的初始序列为:[1, 4, 10, 23, 57, 132, 301, 701]3)时间复杂度约为O(n^{3/2}),优于传统希尔排序的O(n^2)。3)性能优化:Ciura序列在中等规模数据(n ≤ 10^6)表现最佳。1)逆序使用序列:必须从最大间隔开始递减。原创 2025-03-22 19:24:39 · 174 阅读 · 0 评论 -
希尔排序中的Pratt序列
Pratt序列是希尔排序的一种理论优化方案,其核心在于3-smooth数的数学性质。Pratt序列主要具有理论意义,证明了希尔排序在特定增量序列下可达到接近O(n log n)的效率。使用Pratt序列的希尔排序理论时间复杂度为O(n log^2 n),优于原始希尔排序的O(n^2)。Pratt序列的每个元素是满足$2^p * 3^q(p, q >= 0)的整数,并按升序排列。1, 2, 3, 4, 6, 8, 9, 12(当p <= 3, q <= 2)。2)生成的增量数量较多,导致排序趟数增加。原创 2025-03-20 09:21:25 · 250 阅读 · 0 评论 -
希尔排序为啥能降低时间复杂度?
最终,希尔排序在大多数实际场景中显著优于插入排序,时间复杂度可降至 O(n log n) 至 O(n^{4/3}) 之间,具体取决于间隔序列的设计。例如,Hibbard间隔保证每次排序后,元素的移动步长呈指数级缩小,有效降低总操作次数。希尔排序通过分阶段的子序列插入排序,逐步减少元素与目标位置的偏差,从而降低整体比较和移动次数。希尔排序通过引入间隔(gap)将数组分成多个子序列,逐步缩小间隔直至为1。例如,若元素需从位置51移动到位置1,在间隔为50时,一步即可到位。最坏 O(n^{3/2})。原创 2025-03-20 09:32:33 · 238 阅读 · 0 评论 -
希尔排序算法时间复杂度分析
2^k-1(最坏时间复杂度O(n^{3/2}))。2)使用优化序列(如Hibbard、Sedgewick)时,性能显著提升至O(n^{3/2})或更低。, 1(最坏时 间复杂度O(n^2))。常用增量序列的平均时间复杂度约为O(n^{1.25} )到O(n^{1.5} )。数学证明当增量满足h=2^k-1时,比较次数约为O(n^{3/2})。希尔排序 O(n^{1.25} 到O(n^{1.5} ) O(n^2)1)00使用简单递减序列(如N/2)时,最坏情况为O(n^2)。原创 2025-03-19 09:29:39 · 146 阅读 · 0 评论 -
希尔排序中的Sedgewick序列
希尔排序是一种基于插入排序的改进算法,其核心思想是将原始数组分成多个子序列(按一定间隔),分别进行插入排序,随后逐步缩小间隔直至为1。使用Sedgewick序列的希尔排序,在最坏情况下的时间复杂度为O(n^{4/3}),优于其他常见间隔序列(如Hibbard序列的$O(n^{3/2})$)。在希尔排序中,先按Sedgewick公式生成足够大的间隔值,然后从最大且小于数组长度的间隔开始,逐步缩小直至间隔为1。Sedgewick提出了两种生成间隔的公式,结合了指数和多项式,生成的间隔序列具有较好的实践经验。原创 2025-03-19 09:47:56 · 218 阅读 · 0 评论 -
使用OPENMP进行冒泡排序算法的并行实现
冒泡排序的并行化面临天然的顺序依赖性挑战,但通过算法改造可实现有限程度的并行。奇阶段:比较所有奇数索引与后一偶数索引元素对(arr[1] arr[2], arr[3] arr[4], …偶阶段:比较所有偶数索引与后一奇数索引元素对(arr[0] arr[1], arr[2] arr[3],)将比较操作分为奇阶段和偶阶段交替执行,同一阶段内的相邻元素比较可并行进行。4)实际工程中更推荐使用并行快速排序或并行归并排序等更高效率算法。2)特定硬件环境(如GPU大规模并行架构)。1)教学演示并行化思想。原创 2025-02-27 11:35:44 · 559 阅读 · 0 评论 -
std::merge和std::inplace_merge对比分析
std::merge需要输入区间和目标区间的迭代器 , std::inplace_merge为同一容器的迭代器。std::merge需要额外存储空间(目标区间),std::inplace_merge无需额外空间。2)std::inplace_merge合并同一容器的两个连续有序子区间。// 合并到 dst,结果为 {1,2,3,4,5,6}// 合并整个区间,v 变为 {1,2,3,4,5,6}原创 2025-03-15 16:36:54 · 166 阅读 · 0 评论 -
插入排序算法的SIMD优化
AVX 系列:AVX/AVX2(256位寄存器)。SSE 系列:SSE/SSE2/SSE3/SSE4(128位寄存器)。// 存储到[i-2, i-1, i, i+1]位置(右移一位)// 加载[i-3, i-2, i-1, i]位置的元素。使用数组右移一位的SIMD算法来优化插入排序算法。// 从倒数第二个元素开始处理。// SSE处理:每次4个元素,从右往左。// 处理剩余元素(无法组成4个的部分)// simd批量移动元素。// 找到插入位置pos。// 将末尾元素放到首位。// 保存最后一个元素。原创 2025-03-14 10:07:31 · 447 阅读 · 0 评论 -
使用memmove优化插入排序
传统插入排序通过循环逐位移动元素完成插入,而memcpy/memmove优化利用内存操作函数批量移动连续内存,减少循环开销。插入4(i=1) 1次 1次(等效)2 )批量移动:将arr[0..0](元素6)后移1位。2)批量移动:将arr[0..3](4,6,7,8)后移1位。以数组 [6,4,7,8, 2] 为例来演示优化步骤。结果: [4, 6, 7, 8, 2]目标位置: [4,6,7,8 → 全部后移1位]结果: [2, 4, 6, 7, 8]原创 2025-03-13 09:16:23 · 163 阅读 · 0 评论 -
C++数组拷贝
/ 仅复制指针,内存共享。// 直接赋值即可完成深拷贝。1. 优先使用 std::array或 std::vector。1. 浅拷贝(Shallow Copy):仅复制指针/地址。2. 深拷贝(Deep Copy):完整复制内存数据。2. 普通数组建议用 std::copy。2. 使用 std::copy(推荐)2)对象数组需注意拷贝构造函数。// 或使用 vector。原创 2025-03-12 08:50:07 · 307 阅读 · 0 评论 -
插入排序算法优化
对于未排序部分的每个元素,在已排序序列中从后向前扫描,找到合适位置插入。while (arr[j] > temp) { // 无需检查j >=0(因为首元素是哨兵)在寻找插入位置时,使用二分查找代替顺序查找,将比较次数从O(n)降低到O(log n)。比较次数O(n log n),移动次数仍为O(n^2)→ 整体O(n^2),但常数更小。i++) // 先找到最小值作为哨兵。1. 小规模数据(n< 1000):优先使用原始插入排序。最差:O(n^2)(完全逆序)最优:O(n)(已有序)原创 2025-03-11 10:41:20 · 895 阅读 · 0 评论 -
插入排序算法
/ 已排序区的末尾索引。// 插入到正确位置。[6 | 5 7 8 2] // 已排序区:6,未排序区:5 7 8 2。- 最差情况(完全逆序):总比较次数n(n-1)/2 O(n^2)[5 6 7 8 | 2] // 已排序区:5 6 7 8。[5 6 7 | 8 2] // 已排序区:5 6 7。[5 6 | 7 8 2] // 已排序区:5 6。- 最优情况(已有序):仅需比较n-1次 O(n)[2 5 6 7 8] // 排序完成。原创 2025-03-11 09:48:04 · 459 阅读 · 0 评论 -
选择排序算法OpenMP并行优化
时间复杂度,O(n 2)。每次从未排序序列中选择最小元素,交换到已排序序列末尾。2)线程数建议设置为物理核心数(通过omp_set_num_threads()调整)。通过shared指定min_val/min_idx为共享变量。在未排序区间[i, n-1]中找最小值索引min_idx。已排序区间为空,未排序区间为[0,n-1]。交换arr[i]与arr[min_idx]。3)编译需添加OpenMP支持。3)重复n-1次直到全部有序。1)适用于大规模数据。一 选择排序算法原理。三 C++串行实现。原创 2025-03-10 11:31:44 · 608 阅读 · 0 评论 -
选择排序算法的SIMD优化
将查找数组最小值索引的SIMD优化的函数嵌入选择排序主循环,优化最耗时的最小值查找环节,同时保留选择排序的交换逻辑。复用SIMD优化的 find_min_index_simd函数。每次循环处理 arr[i..n-1] 子数组。保持原址排序特性,交换操作仍使用标量实现。// 查找子数组最小值偏移量。避免 SIMD 指令处理小数据时的额外开销。自动切换标量模式处理尾部数据。当剩余元素 <4 时自动回退到标量模式,三 数组最小值查找的SIMD优化函数。n - i:剩余未处理的元素数量。1)最小值查找模块化。原创 2025-03-07 08:51:56 · 481 阅读 · 0 评论 -
十大经典排序算法简介
本文对十大经典排序算法做简要的总结(按常用分类方式排列),包含核心思想、时间/空间复杂度及特点。1)稳定:归并、冒泡、插入、计数、桶、基数。2)非比较排序(计数/桶/基数)空间换时间。4)稳定需求:归并排序(大数据)或基数排序(整数)时间:O(n \times k)(k为最大位数)时间:O(n\log n)(最坏O(n^2))8. 计数排序 (COUNTING SORT)时间:O(n^{1.3})(依赖增量序列)2)不稳定:选择、希尔、快速、堆。1)归并排序需要额外O(n)空间。原创 2025-03-05 09:22:42 · 1431 阅读 · 0 评论 -
选择排序算法
将数组分为已排序区间(前部)和未排序区间(后部)每轮从未排序区间选择最小元素,将其与未排序区间的第一个元素交换,通过n-1轮(数组长度为n)完成排序。不稳定(如对[6,6,2]$排序会破坏两个6的原始顺序)。第1轮:找到最小值 2,与第一个元素 6交换 → [2,4,7,8,6]cout << "第" << i+1 << "轮:";O(n^2)(每轮需遍历剩余元素,共n(n-1)/2次比较)。// 在未排序区间[i, n-1]中找最小值。第3轮:找到 6与 7交换 → [2,4,6,8,7]原创 2025-03-05 09:38:53 · 371 阅读 · 0 评论 -
冒泡排序算法
冒泡排序是一种简单的交换排序算法,其核心思想是通过相邻元素比较和交换将最大元素逐步移动到数组末尾。// 若无交换,提前终止。下面以数组 [6,4,7,8,2]为例,详细说明其实现过程。比较 6 和 4→ 交换 → [4,6,7,8,2]比较 8 和 2→ 交换 → [4,6,7,2,8]比较 7和 2 → 交换 → [4,6,2,7,8]比较 6和 2→ 交换 → [4,2,6,7,8]比较 4和 2→ 交换 → [2,4,6,7,8]最好情况(已有序):O(n)(优化后)空间复杂度:O(1)(原地排序)原创 2025-02-26 16:24:07 · 142 阅读 · 0 评论 -
并发无锁队列
参考:并发无锁队列 - AlanTu - 博客园1、前言 队列在计算机中非常重要的一种数据结构,尤其在操作系统中。队列典型的特征是先进先出(FIFO),符合流水线业务流程。在进程间通信、网络通信之间经常采用队列做缓存,缓解数据处理压力。结合自己在工作中遇到的队列问题,总结一下对不同场景下的队列实现。根据操作队列的场景分为:单生产者——单消费者、多生产者——单消费者、单生产者——多消费者、多生产者——多消费者四大模型。其实后面三种的队列,可以归纳为一种多对多。根据队列中数据分为:队列中的数据转载 2021-12-03 06:55:57 · 841 阅读 · 0 评论 -
海港船只队员国别统计
题目描述小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客。小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况;对于第i艘到达的船,他记录了这艘船到达的时间ti(单位:秒),船上的乘客数量ki,以及每名乘客的国籍xi,1,xi,2,...,xi,ki。小K统计了n艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的24小时(24小时=86400秒)内所有乘船到达的乘客来自多少个不同的国家。形式化...原创 2021-06-20 21:03:43 · 218 阅读 · 0 评论 -
火车站--解法1
题目描述火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出是(即在到达第3 站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定的规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问从x站开出是车上的人数是多少?若无解输出“No a...原创 2021-06-05 21:16:26 · 1138 阅读 · 2 评论 -
广度优先搜索求最短路径
一、概述宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。二、广度优先搜索步骤广度优先搜索使用队列(queue)来实现,过程如下1、把根节点放...原创 2021-05-30 10:12:54 · 1540 阅读 · 0 评论 -
火星人(全排列问题)-解法2
一、题目题目描述:火星人共有N个手指,每个手指分别代表着1-N共N个数,可以通过改变这个这N个手指的顺序来改变值的大小。但是人类想要和火星人交流,就必须通过科学家,科学家先将火星人讲的话(手指表示的数)翻译成我们能理解的语言(如火星人共3个手指,则123 132 213 231 312 321分别代表1 2 3 4 5 6),然后告诉你一个数,你把这个数和火星人讲的话加起来回给科学家,科学家再翻译成火星人的语言。本题给出火星人的手指数N、要加的数M和手指的顺序,要求输出火星人收到的回话。二、思路..原创 2021-05-29 21:09:38 · 574 阅读 · 0 评论 -
火星人(全排列问题)-解法1
题目来源:http://acm.wust.edu.cn/problem.php?id=1074&soj=0题目描述:火星人共有N个手指,每个手指分别代表着1-N共N个数,可以通过改变这个这N个手指的顺序来改变值的大小。但是人类想要和火星人交流,就必须通过科学家,科学家先将火星人讲的话(手指表示的数)翻译成我们能理解的语言(如火星人共3个手指,则123 132 213 231 312 321分别代表1 2 3 4 5 6),然后告诉你一个数,你把这个数和火星人讲的话加起来回给科学家,科学家再翻译成原创 2021-05-28 21:40:37 · 450 阅读 · 0 评论 -
轻松掌握快速排序
一、概述快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。步骤为:挑选基准值:从数列中挑出一个元素,称为“基准”(pivot), 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完...原创 2020-05-06 17:56:23 · 297 阅读 · 0 评论 -
广度优先搜索
一、概述 宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。二、广度优先搜索步骤 广度优先搜索使用队列(queue)来实现,过程如下 1、把根节...原创 2021-05-23 10:13:07 · 1755 阅读 · 0 评论 -
并查集实现最小生成树kruskal算法
一、并查集 并查集被很多OIer认为是最简洁而优雅的数据结构之一,主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作: 合并(Union):把两个不相交的集合合并为一个集合。 查询(Find):查询两个元素是否在同一个集合中。二、kruskal算法 Kruskal算法是一种贪心算法,我们将图中的每个edge按照权重大小进行排序,每次从边集中取出权重最小且两个顶点都不在同一个集合的边加入生成树。注意:如果这两个顶点都在同一集合内,说明已经通过其...原创 2021-05-22 21:22:30 · 632 阅读 · 0 评论 -
深度优先搜索非递归方式
目录一、概述二、深度优先搜索非递归三、代码一、概述 深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。深度优先遍历图的方法是,从图中某顶点v出发:(1)访问顶点v;(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优...原创 2021-05-16 10:36:55 · 1344 阅读 · 0 评论 -
二分查找
一、概述 二分查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 二分查找也称折半查找首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止...原创 2021-05-14 21:45:48 · 200 阅读 · 0 评论 -
顺序查找
目录一、基本思想二、代码一、基本思想 从线性表的一端开始,逐个检查关键字是否满足给定的条件。若查找到某个元素的关键字满足给定条件,则查找成功,返回该元素在线性表中的位置;若已经查找到表的另一端,还没有查找到符合给定条件的元素,则返回查找失败的信息。特点:1. 对待查序列(表)无要求 --待查找序列可以是有序,也可以是无序;2. 从第一个元素开始;3. 需要逐一遍历整个待查序列(除非已经找到);4. 若查找到最后一个元素还没找到,则查找失败;二、代码...原创 2021-05-14 21:40:33 · 147 阅读 · 0 评论 -
轻松解决汉诺塔问题
目录一、背景二、解决思路三、代码一、背景 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙...原创 2021-05-14 10:02:14 · 1322 阅读 · 0 评论 -
图的创建及拓扑排序
目录一、图二、拓扑排序三、代码四、测试一、图1 图的概念1.1 图的基础概念串讲图的结构很简单,就是由顶点 V VV 集和边 E EE 集构成,因此图可以表示成 G = ( V , E ) G=(V, E)G=(V,E) 。 图1-1:无向图1图1-1就是无向图,我们可以说这张图中,有点集 V = { 1 , 2 , 3 , 4 } ,边集E = { ( 1 , 2 ) , ( 1 , 4 ) , ( ...原创 2021-05-08 21:34:06 · 276 阅读 · 0 评论 -
完全背包问题优化
目录一、题目描述二、总体思路三、优化思路四、代码一、题目描述有4种物品,它们有各自的体积和价值,现有给定容量的背包不限定各个种类物品的数量,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8二、总体思路01背包问题是最基本的背包问题,我们可以考虑把完全背包问题转化为01背包问题来解。最简单的想法是,考虑到第i种物品最多选m/w[i]件,于是可以把第i种物品转化为m/...原创 2021-05-02 10:37:15 · 208 阅读 · 0 评论 -
完全背包问题
目录一、题目描述二、总体思路三、代码一、题目描述有4种物品,它们有各自的体积和价值,现有给定容量的背包不限定各个种类物品的数量,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8二、总体思路01背包问题是最基本的背包问题,我们可以考虑把完全背包问题转化为01背包问题来解。最简单的想法是,考虑到第i种物品最多选m/w[i]件,于是可以把第i种物品转化为m/w[i]件费用及...原创 2021-05-02 10:34:23 · 214 阅读 · 0 评论 -
01背包问题优化
目录一、题目描述二、总体思路三、优化思路四、代码一、题目描述有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8二、总体思路根据动态规划原理首先要找出状态转移方程。 i,前i件物品 j,背包容量 w[i],第i件物品重量 v[i],第i件物品价值 f[...原创 2021-05-02 10:27:11 · 361 阅读 · 0 评论 -
最短路径迪杰斯特拉算法--邻接矩阵
一、算法介绍迪杰斯特拉算法(解决单源最短路径)基本思想:每次找到离源点(如1号节点)最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。基本步骤:1,设置标记数组book[]:将所有的顶点分为两部分,已知最短路径的顶点集合P和未知最短路径的顶点集合Q,很显然最开始集合P只有源点一个顶点。book[i]为1表示在集合P中;2,设置最短路径数组dst[]并不断更新:初始状态下,dst[i]=edge[s][i](s为源点,edge为邻接矩阵),很显然此时dst[s]=原创 2021-04-23 21:45:59 · 1370 阅读 · 0 评论 -
最短路径迪杰斯特拉算法--邻接链表
一、算法介绍迪杰斯特拉算法(解决单源最短路径)基本思想:每次找到离源点(如1号节点)最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。基本步骤:1,设置标记数组book[]:将所有的顶点分为两部分,已知最短路径的顶点集合P和未知最短路径的顶点集合Q,很显然最开始集合P只有源点一个顶点。book[i]为1表示在集合P中;2,设置最短路径数组dst[]并不断更新:初始状态下,dst[i]=edge[s][i](s为源点,edge为邻接矩阵),很显然此时dst[s]=原创 2021-04-23 21:44:01 · 1394 阅读 · 0 评论 -
01背包问题
一、题目描述有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8二、总体思路根据动态规划原理首先要找出状态转移方程。 i,前i件物品 j,背包容量 w[i],第i件物品重量 v[i],第i件物品价值 f[i][j],用j的容量去装前i件物品的最大价值 j&g...原创 2021-04-18 10:10:39 · 82 阅读 · 0 评论