数据结构与算法
文章平均质量分 56
数据结构与算法
砸war鲁多
这个作者很懒,什么都没留下…
展开
-
A星寻路算法
通过该节点访问其上右下左的四个点,并判断这些点是否能够加入开放表(坐标超出网格范围,节点在关闭表,节点是障碍点。最后判断坐标点是否在开放表,不在开放表的点构建节点并加入开放表,这里默认两点间的代价为1;A星算法结合了广度优先搜索(BFS)和最佳优先搜索(Best-First Search)的特点,通过使用启发式函数评估节点的重要性,优先选择最有希望达到目标节点的节点进行扩展,从而有效地缩小搜索范围。public int CompareTo(AstarNode other) //排序方式。原创 2024-01-02 00:40:05 · 3091 阅读 · 0 评论 -
最长上升子序列学习笔记
最长上升子序列求一组数中最长上升子序列,该子序列严格满足 若i < j ,则a [ i ] < a [ j ]。动态规划:a [ i ] 表示该组数,b [ i ] 表示以a [ i ]为上升子序列最后一个数的最长上升子序列长度。遍历数组,再找到已经遍历过数字x (设为x)中比当前遍历到的数字y (设为y) 小并且b [ x ]最大的数。 即x < y 且 b [ x ] 最大。b [ y ] = b [ x ]+1 因为上升子序列,子序列最后一个数一定是序列中最大的数。最长只要原创 2020-11-18 17:23:15 · 87 阅读 · 1 评论 -
最短路之弗洛伊德(Floyd)
算法特点: 1.一次性可以求出任意两点之间的最短距离。 2.可以处理带有负边权的图 3.时间复杂度高O(n^3) 算法思路: 两点a,b之间是否能通过第三个点c使a到达b的距离更短, 每次让两点之间的距离取最小值。a->b ---> a->c->b. mp[a][b]=min(mp[a][c]+mp[c][b],mp[a...原创 2020-01-12 09:10:03 · 244 阅读 · 0 评论 -
最短路之迪杰斯特拉
算法特点: 1.求单源点到任意点的最短距离; 2.不适合处理带负边权的图; 3.时间复杂度相对低O(n^2).算法思想: 先遍历所有的点到源点的距离,利用贪心思想。 设置两个集合:没有访问的点,访问过的点。 每次在未被访问过的点中选出距离最小的点,把这个点标记为访问过。 再对其它点进行一次松弛操作,更新其它点到源点的距离。 再在未被访问过的点中选出距离最小的点....直...原创 2020-01-12 10:57:28 · 72 阅读 · 0 评论 -
线性表的两种存储方式--顺序存储和链式存储
线性表是一种存储方式,可以想象是很多个车厢连起来的火车。每个车厢有两个区域,一个存放数据一个链接下一节车厢。线性表的一些基本操作。初始化,增加元素,删除元素,查找元素,输出表中元素。链式存储例如链表一样通过指针把不同区域的数据联系起来形成顺序存储。#include<stdio.h>#include<stdlib.h>typedef struct node *list;//node重命名为指针*liststruct node{ //建立结构体原创 2020-09-11 20:23:36 · 3483 阅读 · 0 评论 -
最大连续子序列和问题求解
最大连续子序列和问题题描述:求一组数列中连续子序列的最大和想法:从前往后遍历数组,设置两个变量maxsum和nowsum。分别存储到当前元素的最大序列和,到当前元素的序列和。如果nowsum大于maxsum,则让maxsum=nowsum。当nowsum大于0时,继续往后加,若nowsum小于0,则让nowsum=0。任何数加上一个小于0的数的和肯定比之前更小。for(int i=0;i<m;i++){ scanf("%d",&a); nowsum+=a; if(n原创 2020-08-04 23:05:50 · 240 阅读 · 0 评论 -
链式前向星笔记
**链式前向星**一个简单实用的存图结构。 遍历一遍时间复杂度O(E) 空间复杂度O(E)就好比一个静态的邻接表。链式前向星用数组代替了邻接表的链式存储方式。简单来说就是两个数组,相当于包租婆和租户的关系和两栋房子。head里住着n个包租婆,edge里住着m户租户,edge属于head中所有包租婆共同的财产。某天租户a来租包租婆1房子,租在了一楼,然后包租婆1就记着a向我租1楼房子,又来了租户b,b看包租婆1不顺眼,不去向包租婆1租房,转去向包租婆2租房,包租婆2可开心了,因为1楼已经被租给了a原创 2021-03-27 22:16:56 · 215 阅读 · 1 评论 -
字符串匹配kmp算法
Kmp算法:把字符串匹配优化到O(m+n)的时间复杂度(m和n分别为文本串和模式串的长度)思路:暴力匹配是把模式串与文本串字符逐一匹配,一旦发现不匹配的字符把模式串向右移动一位继续逐一匹配。时间复杂度O(m*n)。这样每次遍历有很多字符重复遍历了很多遍。Kmp是先处理模式串,找到模式串中所有子串的前缀与后缀相同的最大长度,这样在匹配时,如果已经匹配过的字符串中有相同前缀和后缀,前缀就可以不用匹配,直接从前缀之后的字符开始匹配就行。1.从第一项开始匹配,发现第三项不匹配模式串右移一位,继续匹原创 2020-12-21 15:35:14 · 93 阅读 · 0 评论 -
树状数组笔记
功能动态区间求和。在区间中的每个元素都可能会发生改变的情况下进行区间求和复杂度区间求和 O(logn)单点更新 O(logn)操作用tree代表树状数组,a代表一般数组,tree[x]表示a[x-t]到a[x]的所有a的和,t为x在二进制表示下第一个1代表的值。1.额外操作,计算lowbit。lowbit是树状数组中各级连接的纽带,通过lowbit可以把tree联系起来int lowbit(int x) //计算lowbit { return x&(-x);}2.单点更新原创 2021-04-11 17:52:33 · 66 阅读 · 0 评论 -
变种快排:寻找最大的前K个数
寻找n个数中的最大前K个数,一般可以想到选择排序或者堆排序,这里介绍一种利用快排思想的方法。快排每一轮是把一组数据分成三部分,小于基准数的数,基准数,大于等于基准数的数。可以想到当大于等于基准数的数量等于K时这一部分就是所求答案。我们可以使用快排降序排序思想,因为快排每次会确定一个基准数的最终位置,每次得到基准数的下标(下标从0开始)后我们将之与k-1比较,当等于时,说明基准数和基准数左边的数是前K大的数(注意这些数并不是降序序列)。当小于时,说明此时基准以及左侧的数不够K个,但可以确定基准数以及基准数左原创 2022-04-21 14:11:37 · 1220 阅读 · 0 评论 -
数据结构-排序
以下排序均以升序为例。排序的基本概念排序:将序列中的元素按照某种要求重新排列。排序一般会有两个操作,比较和移动,通过比较两个关键字的大小确定两个关键字的相对位置,再通过移动调整关键字位置。算法稳定性:如果序列中有关键字相同的两个元素a,b。排序前a在b前面,排序后a仍在b前面,则这个排序算法是稳定的,否则是不稳定的。内部排序和外部排序:排序期间元素都在内存中称为内部排序,排序期间需要进行内外存移动的排序称为外部排序。排序算法可分为五大类:插入排序,交换排序,选择排序,归并排序,基数排序。插入排序原创 2022-04-02 13:49:46 · 1841 阅读 · 0 评论 -
数据结构-查找
数据结构-查找查找基本概念1.查找:在数据集合中寻找满足要求的的数据元素成为查找,查找有两种结果1.查找成功,找到目标元素;2.查找失败,遍历完集合仍未找到目标元素。2.查找表:用于查找的数据集合叫做查找表,由同一类型的数据元素组成。对查找表的操作一般有四种1.查找某个元素是否在查找表中 2.访问目标元素 3.向查找表中插入元素 4.从查找表中删除元素。查找的类别顺序查找顺序查找又叫线性查找,从线性表的一端顺序查找到另一端。顺序查找既可用于顺序表,也适用于链表。当被查找的线性表有序时,则不必一一原创 2022-04-01 19:04:05 · 2501 阅读 · 0 评论 -
A*寻路算法
4.从open中取出F最小的点M,将M点周围可直接到达的点加入open,用该点更新该点周围的点(当周围的点在close中时则不处理,当周围的点P在open中时尝试更新P点的F:F=min(更新前,更新后)),将M点从open中删除,并加入close。2.open中的有一个value(记为F),有两个值:G(从起点到该点的距离),H(从该点到终点的距离)。1.设置两个数组open和close,分别存放可能会经过的点(open)和已经过的点(close)。重复4直到找到终点或者失败。原创 2023-07-24 15:43:30 · 39 阅读 · 0 评论