算法设计与分析
文章平均质量分 60
二琳爱吃肉
我在进阶大佬的路上
展开
-
【和我一起学算法】查找篇——插值查找
在被查找数列中选取比较点(参考点)时,二分法采用的是中点,Fibonacci法采用的是黄金分割点。二分查找法是最直观的,Fibonacci查找法可能是最"美观",但都不是最科学的。那么如何选取最科学的那个比较点(参考点)呢?通常情况下被查找数列都不是等差的,也不知道数列的差值分布状态,没有办法确定到底选择哪个点作为"最优解"。插值算法则给出了一个大多数情况下的理论上最科学的比较点(参照点)。四、插值查找算法原理举例第一次查找第二次查找代码实现insertSort.pyfro原创 2021-10-26 17:48:47 · 4317 阅读 · 0 评论 -
【和我一起学算法】查找篇——斐波那契查找
斐波那契数列(Fibonacci)又称黄金分别数列,指的是这样一个数列:1,1,2,3,5,8,13,21,...。在数学上,斐波那契被递归方法如下定义:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n≥2)。该数列越往后,相邻的两个数的比值越趋向于黄金比例值(0.618),斐波那契查找就是在分法查找的基础上根据斐波那契数列进行分割的。三、斐波那契查找算法原理Fibonacci查找与二分法查找几乎一样,只是在选取比较点(参照点)的位置有所区别。二分法选的是将数列中间的那个元..原创 2021-10-24 21:24:48 · 685 阅读 · 0 评论 -
【和我一起学算法】查找篇——二分法查找
说到二分查找,相信不少人小时候玩过猜数的游戏,在1~100之间随机挑选一个数,让别人来猜。如果别人猜错了,你要提示他猜的这个数随机数大还是比随机数小,别人继续猜,直到猜到为止。通常这个玩游戏的人都会从50开始猜,因为这样至少排除了一半不可能的数字。如果按照这个方法继续排除,在最大数为100的情况下,最多6次就能猜到这个随机数。这个猜数小游戏和二分查找的思想不谋而合。目录二、二分法查找算法原理举例第一次查找第二次查找第三次查找源码产生随机数列快速排序二分法查找二原创 2021-10-23 18:32:35 · 1155 阅读 · 0 评论 -
【和我一起学算法】查找篇——顺序查找
查找算法是从一个有序的数列中找到一个特定的数,常用于判断某个数是否在数列中,或者找到某个数在数列中的位置。一、顺序查找顺序查找是最简单、最直接的查找算法,顺序查找是将数列从头到尾按照顺序查找一遍,是一种最没有技术含量、最容易理解的算法。算法思想静态查找是指只在数列中查找特定的数字,不对数列做任何的修改(但是可以进行排序),因此静态查找源码...原创 2021-10-22 18:43:07 · 1262 阅读 · 0 评论 -
【跟我一起学算法】排序篇——总结
目录排序讲解冒泡排序选择排序插入排序 归并排序快速排序计数排序算法小结排序算法比较源码源码下载排序讲解点开链接,有算法思想、举例和代码实现(Python)冒泡排序【和我一起学算法】排序篇——冒泡排序选择排序【和我一起学算法】排序篇——选择排序插入排序 【和我一起学算法】排序篇——插入排序归并排序【和我一起学算法】排序篇——归并排序快速排序【和我一起学算法】排序篇——快速排序计数排序【和我一起学算法】排...原创 2021-10-22 11:15:23 · 267 阅读 · 0 评论 -
【和我一起学算法】排序篇——计数排序
往期文章推荐:【和我一起学算法】排序篇——冒泡排序【和我一起学算法】排序篇——选择排序【和我一起学算法】排序篇——插入排序【和我一起学算法】排序篇——归并排序【和我一起学算法】排序篇——快速排序计数排序六、计数排序算法思想举例算法伪代码源码countingSort.pyfrom randomList import randomListimport timeitiList = randomList(20)def countingSort(iL..原创 2021-10-21 14:19:11 · 343 阅读 · 0 评论 -
【和我一起学算法】排序篇——快速排序
往期推荐:原创 2021-10-20 22:08:10 · 708 阅读 · 0 评论 -
【和我一起学算法】排序篇——归并排序
【和我一起学算法】排序篇——插入排序【和我一起学算法】排序篇——选择排序【和我一起学算法】排序篇——冒泡排序我来交作业了,今天讲归并排序。归并排序是一种典型的递归排序。把复杂的排序过程分解成简单的合并子序列的过程。四、归并排序原理归并排序就是将数列分成左右两个部分,将左右两个子序列排序完毕后在合并到一起,两个子序列又要划分成更小的子序列,排完序后在合并。就一直划分,直到最小的子序列长度为1时,再一步一步合并就得到了完整的有序数列。例题还是以数列[7,3,5,1,4,9..原创 2021-10-19 13:15:02 · 411 阅读 · 0 评论 -
【和我一起学算法】排序篇——插入排序
插入排序类似于打扑克,每抽到一张新牌都要跟已有的牌进行比较,插入到合适的位置中。三、插入排序原理插入排序首先将数列分成两个部分,数列的第一个数为left部分,其余数为right部分。然后将right部分的数依次取出,插入到left部分中的合适位置上。当right部分为空时,数列就变成了有序数列,插入排序结束。举例以数列[7,3,5,1,9,4]为例,进行插入排序。初始队列 7 3 5 1 9 4 第一轮排序将数列分成左右两部分,left部分是第原创 2021-10-18 21:56:50 · 426 阅读 · 2 评论 -
【和我一起学算法】排序篇——选择排序
【跟我一起学算法】排序篇——冒泡排序与前一篇的讲的冒泡排序相比,选择排序更加简单粗暴,就是在数列中不断的寻找最大或最小的那个数。目录选择排序原理举例第一轮排序第二轮排序第三轮排序第四轮排序第五轮排序算法伪代码完整源码选择排序原理选择排序总是在数列中寻找最大或最小的那个数,将这个最大或最小数放在合适的位置,然后再抛开这个数,从其他数中再找一个最大或最小数,一直到子序列为空为止。选择排序和冒泡排序不同的是,选择排序并不是像冒泡排序那样比较相邻两...原创 2021-10-18 11:48:00 · 409 阅读 · 0 评论 -
【和我一起学算法】排序篇——冒泡排序
最近在图书馆借了一本有关算法的书,是用Python写的,我之前没有系统的学过Python,正好趁着这次重温算法的机会,学习一下Python。怎么说呢,从我的角度看Python就觉得Python比我之前学过的C、C++、C#、Java都要简洁明了,而且更容易读懂代码,可读性很高,就很适合零基础入门的一种语言,有了之前学习其他编程语言的基础,对我来说,学习Python是更加容易的。好了,废话不多说了,开始了。排序算法算是算法中最简单、最基础的了,排序就是将一组数列(多是打乱顺序的整数数列)按照顺序从小到原创 2021-10-17 23:21:43 · 475 阅读 · 0 评论 -
最小生成树Prim&Kruskal算法
算法及结构Prim算法分析从连通网N=(VE)中的某一顶点U0出发,选择与它关联的具有最小权值的边(U0,v),将 其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合U中。如此继续下去, 直到网中的所有顶点都加入到生成树顶点集合U中为止。假设网中有n个顶点,则第一个进行初始化的循环语句的频度为n,第二个循环语句的频度为n-1;其中有两个内循环:其一是在closedge[v].lowcost中求最小值,其频度为n-原创 2021-06-27 22:30:48 · 1108 阅读 · 0 评论 -
分支限界法求单源最短路径
1.问题描述用优先队列式分支限界法(最小耗费优先法)设计并实现算法,求单源最短路径问题。2.主要数据结构及其作用邻接矩阵c[n][n]:表示图一维数组dist[n]:存储最短路径长度一维数组pre[n]存储构造最短路径需要的信息3.测试用例4.实验结果截图测试用例1测试用例2测试用例35.代码实现#include<iostream>#include<iomanip>#include<algorithm>#include<vecto转载 2021-05-26 14:19:22 · 7907 阅读 · 3 评论 -
用回溯法求解子集合问题
1.算法基本思想该问题的解空间树是一棵子集树。设解向量x=(x1,x2,…,xn),这里是求所有满足目标条件的解,所以一旦搜索到叶子结点(即i>n),如果相应的子集和为W,则输出x解向量。2.主要数据结构及其作用一维整型数组S[n]存储集合S 中的数一维数组x[n]存放子集和的解3.测试用例4.实验结果截图测试用例1测试用例2测试用例35.代码实现#include<iostream>#include<cstring>using namespac原创 2021-05-26 13:55:51 · 1460 阅读 · 0 评论 -
回溯法求解n后问题
1.算法基本思想用n元组x[1:n]表示n后问题的解。其中,x[i]表示皇后i放在棋盘的第i行的第x[i]列。由于不允许将2个皇后放在同一列上,所以解向量中的x[i]互不相同。2个皇后不能放在同一斜线上时问题的隐约束。若两个皇后放置的位置分别是(i,j)和(k,l),且i-j=k-l或i+j=k+l,则说明这2个皇后处于同一斜线上。由此可知,只要|i-k|=|j-l|成立,就表明2个皇后处于同一斜线上。用回溯法解n后问题时,用完全n叉树表示解空间。可行性约束Place剪去不满足行、列和斜线约束的子树。在原创 2021-05-26 13:41:50 · 1935 阅读 · 1 评论 -
贪心算法求解活动安排问题
1.实验要求用贪心策略设计并实现一个贪心算法,求解活动安排问题。2.算法基本思想在满足条件的活动中,选择结束之间最早的。3.主要数据结构及其作用一维数组:存储数据4.测试用例5.实验结果截图测试用例1测试用例2测试用例36.代码实现#include <iostream>#include<stdio.h>#include<stdlib.h>using namespace std;typedef struct{ int start;原创 2021-05-26 13:28:08 · 2269 阅读 · 0 评论 -
贪心算法求解背包问题
1.实验要求用贪心策略设计并实现一个贪心算法,求解背包问题。2.算法基本思想每次找未装包的物品中单位重量价值最大的物品装包,装包的同时也要考虑到背包的剩余容量。3.主要数据结构及其作用动态数组:存储数据4.测试用例5.实验结果截图测试用例1测试用例2测试用例36.代码实现#include<iostream>using namespace std;int main(){ int c,n; cout<<"请输入背包的容量c:"; cin>&原创 2021-05-26 13:23:25 · 4765 阅读 · 0 评论 -
动态规划求解最长公共子序列
1.实验要求采用动态规划策略设计并实现算法,求解最长公共子序列问题。要求算法的复杂度不超过O(m*n)。2.算法基本思想运用递归将求出两个序列中元素相同的路径,然后找出其最长公共子序列。3.主要数据结构及其作用一维数组、二维数组:存储纪录数据和位置.4.测试用例5.运行结果截图测试用例1测试用例2测试用例36.代码实现#include<iostream>using namespace std;void LCSLength(int m,int n,char *x原创 2021-05-26 13:18:59 · 831 阅读 · 0 评论 -
动态规划求解最大子段和
1.实验要求:采用动态规划策略设计并实现算法,求解最大子段和问题。要求算法的复杂度不超过O(n)。2.算法基本思想首先分析问题最优解的结构,建立递归方程,并计算最优值3.主要数据结构及其作用一维数组,纪录保存数据4.测试用例5.实验结果截图6.代码实现#include<iostream>using namespace std;int besti=0,bestj=0;int MaxSum(int n,int *a){ int sum = 0,b = 0;原创 2021-05-26 13:12:15 · 1699 阅读 · 0 评论 -
找众数和重数
1.算法基本思想分治法求众数和重数:利用分治算法先划分为若干个子问题,递归求解每一个子问题,最后将子问题合并,从而求解到整个问题的解。2.主要数据结构及其作用一维数组:存储并记录数据3.测试用例4.实验结果截图测试用例1测试用例2测试用例35.代码实现#include<iostream>using namespace std;void MergeSort(int a[],int l,int r){ if(l==r) return ; int mid原创 2021-05-26 12:48:55 · 792 阅读 · 0 评论 -
分治法求解最大子段和
1.算法基本思想分治法求最大子段和:利用分治算法先划分为若干个子问题,递归求解每一个子问题,最后将子问题合并,从而求解到整个问题的解。2.主要数据结构及其作用一维数组:存储并记录数据3.测试用例:4.实验结果截图:测试用例1测试用例2测试用例35.代码实现#include<iostream>using namespace std;int besti,bestj;int MaxSubSum(int *a,int left,int right){ int原创 2021-05-26 12:41:18 · 4462 阅读 · 1 评论