算法分析与设计
文章平均质量分 79
算法分析与设计笔记总结。
SongXJ--
这个作者很懒,什么都没留下…
展开
-
算法分析与设计:10 大排序算法大汇总(Java)
算法分析与设计:10 大排序算法大汇总(Java)原创 2022-10-01 15:55:20 · 881 阅读 · 1 评论 -
算法题:LeetCode (1094) 拼车【一题搞懂差分数组】
差分数组主要的适用场景是对原始数组进行频繁的区间增减操作,这个时候适用差分数组能够快速的完成,同时能够快速获得更新后的数组各个位置的值。原创 2022-09-25 13:52:14 · 669 阅读 · 0 评论 -
数据结构:堆栈的区别
文章目录前言数据结构角度栈就像装数据的细长桶堆像一棵倒过来的树内存分配中的栈和堆1.申请方式和回收方式不同2.申请后系统的响应不同3.申请效率的比较4.申请大小的限制5.堆和栈中的存储内容前言使用栈就像我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,它的好处是快捷,但是自由度小。使用堆就像是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。数据结构角度栈就像装数据的细长桶栈是一种具有后进先出性.原创 2021-03-08 17:41:58 · 6090 阅读 · 0 评论 -
算法分析与设计:棋盘覆盖问题(分治法)
棋盘覆盖问题在一个 2k×2k2^{k} \times 2^{k}2k×2k 个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为特殊方格。显然,特殊方格在棋盘上出现的位置有 4k4^{k}4k 种情形。下图是 k=2k=2k=2 时 16 个特殊棋盘中的一个。在棋盘覆盖问题中,要用图示的 4 种不同形态的 LLL 型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何 2 个 L\mathrm{L}L 型骨牌不得重叠覆盖。易知,在任何一个 2k×2k2^{k} \times 2^{原创 2021-01-10 19:54:27 · 26267 阅读 · 4 评论 -
算法分析与设计:归并排序
归并(合并)排序(Merge Sort)基于分治策略。核心思想:就是把数组分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排序好的子集合合并。递归法// 归并排序递归框架int tmpArray[];void MergeSort(int array[], int left, int right){ if (left < right) // 至少两个元素 { int i = (left + right) / 2; // 取中点原创 2021-01-10 19:12:48 · 480 阅读 · 0 评论 -
算法分析与设计:快速排序
快速排序(Quick Sort)基于分治策略。核心思想:递归地将待排数组分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。步骤:分解:以 a[start]a[start]a[start] 为基准元素,将 a[start,end]a[start,end]a[start,end] 划分成3段(a[start,q−1],a[q],a[q+1,end]a[start,q-1], a[q],a[q+1,end]a[start,q−原创 2021-01-10 18:02:40 · 1037 阅读 · 2 评论 -
算法分析与设计:7大排序算法大汇总(C++)
C++ 源代码冒泡排序(Bubble Sort)选择排序(Selection Sort)插入排序(Insertion Sort)快速排序(Quick Sort)归并排序(Merge Sort)希尔排序(Shell Sort)计数排序(Counting Sort)【上述超链接均为相应的百度百科】#include <iostream>using namespace std;// 打印数组void printArr(int *arr, int len){ for原创 2021-01-09 21:48:38 · 328 阅读 · 0 评论 -
算法分析与设计:0-1背包问题(回溯法)【本文算法的时空复杂度都未达到最优,核心目的在于展现并理解回溯法的算法过程】
===== 本文算法的时空复杂度都未达到最优,核心目的在于展现并理解回溯法的算法过程。=====0-1背包问题给定 nnn 种物品和一个背包。物品 iii 的重量为 wiw_iwi,其价值为 pip_ipi,背包的容积为 ccc。问如何选择装入背包中的物品,使得装入背包中物品的总价值最大?回溯法回溯法是最常用的解题方法,有“通用的解题法”之称。当要解决的问题有若干可行解时,则可以在包含问题所有解的空间树中,按深度优先的策略,从根节点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断原创 2021-01-07 21:28:08 · 750 阅读 · 0 评论 -
算法分析与设计:0-1背包问题(动态规划)【本文算法的时空复杂度都未达到最优,核心目的在于展现并理解动态规划的算法过程】
===== 本文算法的时空复杂度都未达到最优,核心目的在于展现并理解动态规划的算法过程。=====0-1背包问题给定 nnn 种物品和一个背包。物品 iii 的重量为 wiw_iwi,其价值为 pip_ipi,背包的容积为 ccc。问如何选择装入背包中的物品,使得装入背包中物品的总价值最大?动态规划动态规划法是一个分阶段判定决策过程,其问题求解策略的基础是决策过程的最优原理:为达到某问题的最优目标 TTT,需要一次作出决策序列 D=D1,D2,…,DkD={D_1,D_2,…,D_k}D=D原创 2021-01-07 18:34:07 · 474 阅读 · 0 评论 -
算法分析与设计:优先级队列分支限界法解决旅行商问题(BBTSP)【超详细建树求解过程】
旅行商问题旅行推销员问题(英语:Travelling salesman problem, TSP)是这样一个问题:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。它是组合优化中的一个NP难问题,在运筹学和理论计算机科学中非常重要。(来源于:百度百科)C++源代码二话不说,先放代码,具体分析往下滑 ↓↓#include <iostream>#include <vector>#include <cstring>#inclu原创 2021-01-06 13:31:29 · 10163 阅读 · 2 评论 -
算法分析与设计:最小生成树算法—— (Prim) VS (Kruskal)
Prim 算法和 Kruskal 算法都能从连通图找出最小生成树。Prim算法:此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。图的所有顶点集合为V;初始令集合u={s},v=V−u;在两个集合u,v能够组成的边中,选择一条代价最小的边(u0,v0),加入到最小生成树中,并把v0并入到集合u中。重复上述步骤,直到最小生成树有n-1条边或者n个顶点为止。由于不断向集合u中加点,所以最小代价边必须同步更新;需要原创 2021-01-07 12:49:10 · 836 阅读 · 0 评论 -
算法分析与设计:贪心算法实现最少硬币找钱问题(支付+找零共花费硬币数最少)
硬币找钱问题Problem Description设有六种不同面值的硬币,各硬币的面值分别为5分,1角,2角,5角,1元,2元。现要用这些面值的硬币来购物和找钱。购物时可以使用的各面值的硬币个数存于数组 Coin[1;6]Coin[1;6]Coin[1;6] 中,商店里各面值的硬币有足够多。在一次购物中希望使用最少的硬币个数。例如,一次购物需要付款0.55元,没有5角的硬币,只好用 2×20+10+52 \times 20+10+52×20+10+5 共4枚硬币来付款。如果付出1元,找回4角5分,同样原创 2020-11-26 16:33:26 · 12788 阅读 · 0 评论 -
算法分析与设计:动态规划(空间复杂度优化)(背包问题 & 最少硬币问题)
背包问题Problem Description由于高数巨养的喵星人太傲娇了,要天天吃新鲜猫粮而且还经常欺负高数巨,所以高数巨决定买几条哈士奇尝尝鲜。这天高数巨来到了二手狗市场买哈士奇,高数巨看完了所有的哈士奇,记下了每条哈士奇的价格,并根据对它们的好感程度给它们每只都赋予了一个萌值。高数现在手里有X元,她想通过购买若干条哈士奇来获得尽可能多的萌值。现在给定高数巨手里的钱X以及N条哈士奇的价格和萌值,求高数巨最多可获得多少萌值Input多组输入。对于每组输入,第一行有两个整数N,X(1≤N≤100,1原创 2020-11-15 12:50:17 · 1619 阅读 · 1 评论 -
算法分析与设计:矩阵连乘问题(动态规划)
问题描述给定nnn个矩阵A1,A2,……,An{A1,A2,……,An}A1,A2,……,An,其中AiA_iAi与Ai+1A_{i+1}Ai+1是可乘的,i=1,2,……,n−1i=1,2,……,n-1i=1,2,……,n−1。例如:计算三个矩阵连乘A1,A2,A3{A_1,A_2,A_3}A1,A2,A3;维数分别为10×10010 \times 10010×100 , 100×5100\times5100×5 , 5×505\times505×50按此顺序计算需要的次数((A1∗A2原创 2020-11-11 19:57:49 · 2738 阅读 · 0 评论 -
算法分析与设计:二元归并树贪心算法(Huffman树)
贪心算法有一类问题是要从所有的允许解中求出最优解,其策略之一是“贪心法”,即逐次实施“贪心选择”:在每个选择步骤上做出的选择都是当前状态下最优的。贪心选择依赖于在此之前所做出的选择,但不依赖于后续步骤所需要的选择,即不依赖于后续待求解子问题。显然,这种选择方法是局部最优的,但不是从问题求解的整体考虑进行选择,因此不能保证最后所得一定是最优解。贪心法是求解问题的一种有效方法,所得到的结果如果不是最优的,通常也是近似最优的。数据结构选用vector和二叉树的结构对问题进行表示。C++语言中的STL里面的原创 2020-11-11 18:22:39 · 1901 阅读 · 0 评论 -
算法分析与设计:分治递归实现斯特拉森(Strassen)矩阵乘法
分治问题分治法的基本思想是将一个规模很大的问题分解为许多规模较小的子问题,这些子问题互相独立且与原问题相同。对这些子问题递归地进行求解后合并,得到原问题的解。斯特拉森(Strassen)矩阵乘法设A和B是两个n×nn \times nn×n的矩阵,其中nnn可以写成2k2^k2k。将A和B分别等分成4个小矩阵,此时如果把A和B都当成2×22 \times 22×2矩阵来看,每个元素就是一个 (n/2)×(n/2)(\mathrm{n} / 2) \times(\mathrm{n} / 2)(n/2)原创 2020-10-14 18:04:03 · 6841 阅读 · 4 评论