自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 散列函数

散列函数的构造方法散列表:也叫哈希表,根据键而直接访问存储位置的数据结构,将所需查询的数据映射到表中一个位置来访问记录加快查找速度。散列存储:选取某个函数,以该函数的关键字计算元素的存储位置,有时这个关键码会映射到同一个位置,这是冲突。散列函数冲突较少,执行速度比较快,关键字长度较少,存放比较均匀,容易查找,散列表的大小合适,则这个散列比较好。直接定址法:直接以关键码的线性函数值为散列地址...

2020-03-06 22:10:08 400

原创 快速排序

快速排序是冒泡排序的改进。实现步骤:找一个基准数 basic ,设置两个指针Low,high。low指向序列的起始位置,high指向序列的末尾。首先用high指向的元素和基准数basic进行比较,如果high指向的元素比basic大,那么high继续向左移动,如果high指向的元素值比basic小,high停止移动,然后让low指向的值赋值为high指向的值,让low指向的元素与basic进行...

2020-03-05 13:14:17 225

原创 堆排序

堆排序是一种选择排序。堆是完全二叉树,大顶锥的每个结点的值都大于或等于其左右孩子结点的值,小顶锥的每个结点的值都小于或等于其左右孩子结点的值。基本思想:把数组构造成一个大顶锥,取堆顶的数字,就是最大值,然后把剩下的所有数字再构成一个大顶锥,再取堆顶数字,重复该操作直至取完所有数字,就能得到一个从大到小的有序序列。...

2020-03-05 12:43:13 209

原创 希尔排序

希尔排序把一个较大的集合隔一个间隔取一个数,分成几个小组,然后对每个小组进行插入排序,然后把这个间隔取小,再重复操作,直到这个间隔取1时,再排序,就能得到一个有序序列。希尔排序的复杂度和增量序列相关。Hibbard提出一种增量序列,{1,3,7,…2^k-1 },时间复杂度为O(n^1,5)Sedgewick提出了几种增量序列,其时间复杂度为O(n^1.5),最好的一个序列是{1,5,19...

2020-03-03 21:38:32 133

原创 《Head First Java》3.1

引用对象的变量所携带的是远程控制而不是对象本身。方法只可以有一个返回值。必须明确转换。

2020-03-03 08:41:26 158

原创 拓扑排序

拓扑序:如果图中从v到w有一条有向路径,则v一定排在w之前。而获取拓扑序的过程就叫做拓扑排序,拓扑序必定是有向无环图。算法思想:把图中没有入度的点(顶点)先拿出来,然后把这个点从图中删除,再继续找没有入度的点(顶点),进行排序。实现:bool TopSort( LGraph Graph, Vertex TopOrder[] ){ /* 对Graph进行拓扑排序, TopOrder[]顺序...

2020-03-02 16:24:29 240

原创 什么是图,图的遍历

什么是图图表示“多对多“的关系,图包含一组顶点,通常用v来表示顶点集合,包含一组边,通常用E来表示边的集合。图的操作集:建立并返回空图,插入,广度优先遍历,深度优先遍历,计算最小生成树,计算图中顶点到任意其他顶点的最短距离。无向图:是没有方向,只是单纯连接在一起的关系,全部由有向边构成的图称为无向图。有向图:有方向。图的表示:邻接矩阵G[i][j]用二维数组表示,但是这样很浪费空间,所以...

2020-03-02 15:33:23 358

原创

堆是什么堆是一种特殊的队列,优先队列,取出元素的顺序是依照元素的优先权大小,而不是按照元素进入队列的先后顺序。堆有两个特性:一个是结构性,用数组表示的完全二叉树,有序性,用任意一个结点的优先权是其子树所有结点的最大值或最小值。(最大堆和最小堆)堆的实现实现堆有两种方式:一种用数组,一种用链表。如果用数组实现优先队列,我们要从数组的尾部插入元素,删除最大或最小的关键字。如果用链表实现优先...

2020-03-01 20:59:37 125

原创 二叉搜索树,平衡二叉树

二叉搜索树二叉搜索树,满足左子树的所有键值小于其根结点的键值,右子树的所有键值大于其根结点的键值。且左右子树皆为二叉搜索树。查找方法有静态查找和动态查找。二叉搜索树就是用动态查找。二叉搜索树的查找操作:从根结点开始,如果树为空,返回NULL。若搜索树非空,则根结点关键字和x进行比较:若x小于根结点的键值,只需要再左子树种继续搜索,若x大于根结点的键值,在右子树种继续搜索,如果相等就完成搜索...

2020-03-01 19:07:44 171

原创

树与树的表示树具有层次关系,通过树能实现查找。查找有两种方式:静态查找和动态查找。静态查找:两种方法,一种顺序查找,一种二分查找。顺序查找:typedef struct LNode *List;struct LNode{ int a[MAXSIZE]; int len;};int search(List t,int k){ int i; t-&...

2020-03-01 16:38:25 169

原创 线性结构

线性表及其实现线性表是由同类型数据元素构成的有序序列的线性结构。线性表的基本操作:插入,删除,查找。线性表的实现方式有两种,一种线性表的顺序存储实现,一种是线性表的链式存储实现。线性表的顺序存储实现初始化:List MakeEmpty(){ List L; L = (List)malloc(sizeof(struct LNode)); L->Last = ...

2020-02-29 22:21:15 1442

原创 《Head First Java》2.27

Java的工作方式:编写源代码,用编译器运行代码,其中如果有bug就需要修改,然后输出,产生字节码,再用java虚拟机来读写执行这些字节码。例:申明一个int类型,名称为size的变量,并赋值为27:public class test{ public static void main(String[] args){ int size; size=27; System.out.pr...

2020-02-27 22:55:08 177

原创 2.20数据结构的基本概念

1.什么是数据结构?通过老师讲的例题,思考了一些,如何摆放书?摆放书的方法有很多种,如何高效的摆放,选择适合的方法摆放,这些就是思想。比如找某本指定的书,我们按照书名的首字母将书排序,这样我们就能通过二分法找到这本书。还有一个例题,打印一个1到n的全部整数,如果用递归,虽然代码简洁,但是计算机无法运行出来,占内存太大,在写代码时,递归并不是一个好的选择,写递归是方便我们自己理解代码,方便别人的代...

2020-02-20 23:14:16 151

原创 赫夫曼树(哈夫曼树)

赫夫曼树的基本概念路径:从树的一个结点到另一个结点之间的分支构成这两个结点的路径。结点的路径长度:两节点间路径上的分支数目。树的路径长度:从树根到每一个结点的路径长度之和叫做树的路径长度。(结点数目相同的二叉树中,完全二叉树的路径长度最短的二叉树)权:树中的结点的值,这个数值叫做该结点的权。结点的带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘积。树的带权路径长度:树中所有...

2020-02-20 20:17:33 653

原创 线索二叉树

线索二叉树类似链表,二叉树中的每个数据都有前驱和后继指针,称为线索,加上线索的二叉树就叫做线索二叉树。如图:线索二叉树的实现将二叉链表的空指针改为前驱或后继的线索。定义一个二叉树线索存储结构:...

2020-02-20 19:13:13 80

原创 树的存储结构

树的定义树的数据逻辑结构是一对N的,除了根节点,每个元素只有一个前驱,但是可以有多个后继,具有层次关系,像家谱就是一个树的例子。树是有n个结点的有限集合,当n大于零时,这个树有且仅有一个称为根的结点,从根节点延申出来的元素可以时n个,同时可以再延申。n=0时,该树就是空树。树的第一层就是根结点,第二层都是称为第一层的孩子,第一层为第二层的父结点。第三层的都称为第二层的孩子,以此类推。结点的...

2020-02-20 18:25:31 266

原创 串的存储结构

串的定义串处理的数据元素只能是字符,是由零个或多个字符串组成的有序序列,又名叫字符串。串的存储结构串中元素逻辑关系和线性表的相同,串也分为顺序存储结构和链式存储结构。串的顺序存储结构顺序存储结构就是数据元素的逻辑关系直接映射到物理位置,用物理位置的先后表示逻辑先后。顺序存储结构的实现串的顺序存储可以用数组实现:typedef struct Node{ char ch[SI...

2020-02-20 15:41:23 1008

原创 循环队列

循环队列,如其名,循环,在一个给定长度len的队列里,当队列队尾已经是最后一个,tail=len时,再入队时,从队头开始入队。像这样队列头尾相接的顺序存储结构称为循环队列。循环队列入队时,要看队列是否已满,出队时要看队列是否为空。创建一个循环队列:typedef struct Node{ int data[10]; int front;//头指针 int rear;...

2020-02-20 15:16:27 116

原创 栈的链式存储结构及的实现

栈的链式存储结构链表的头指针指向空,那么链栈的空就是top=NULL建立一个链栈的基本代码:typedef struct Node{ int data; struct Node *next;}stackNode,*Linkstackptr;typedef struct Linkstack{ Linkstackptr top; int count;}L...

2020-02-20 13:08:07 374

原创 双向链表

双向链表有一个前驱指针,有一个后驱指针。基本套路:typedef struct Node{ inr data; struct Node *pre;//前驱指针 struct Node *next;//后继指针}Node;双向链表的操作和单链表相同,对于一个...

2020-02-20 12:36:40 151

原创 最短路径——Dijkstra算法

单源最短路和Floyd算法一样,仍然使用二维数组来存储顶点之间边的关系。不同的是我们还要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程。我们将此时dis数组中的值称为最短路程的“估计值”。也就是贪心的思想。首先把起点到所有点的距离存下来找到最短距离,然后松弛一次再找出最短的距离。松弛就是遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离。基本代码如下...

2020-02-18 21:16:27 255

原创 最短路径——Floyd-Warshall算法

算法特点解决任意两点间最短路径的一种算法,可以正确处理有向图或负权,同时也被用于有向图的传递闭包。算法思路计算最短路径时,需要引入两个矩阵,矩阵S中的元素a[ i ] [ j ]表示第i个顶点到第j个顶点的距离,矩阵P中的元素b[ i ][ j ]表示顶点i到顶点j经过了b[ i ][ j ]记录的值所表示的顶点。初始时,矩阵D中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不...

2020-02-18 17:03:13 427

原创 广度优先搜索BFS

广度优先搜索假如我们走一个迷宫,深度优先搜索是走到遇到障碍物再回溯,而广度优先搜索是一次走完一步的所有地方——也就是走每一步时,走完这一步里可以走的所有地方。具体思想void bfs(Vertex v)//从v这个顶点开始遍历{ visited[V]=true;//确认v inqueue(V,queue);//把v放入队列中 while(!isEmpty) ...

2020-02-18 14:56:41 113

原创 深度优先搜索dfs

深度优先搜索假如我们在走一个迷宫,在毫无头绪的情况下,只能一直走到遇到障碍物为止,遇到障碍物就回到上一个拐弯的地方,拐另一个方向,直到找到出口。基本套路void dfs(int step){ //1.判断边界,判断本阶段的搜索是否已经结束 if(foo==bar) return ; //2.尝试每一种可能,类似走迷宫中的在每一个点尝试每个方向 ...

2020-02-18 11:41:39 189

原创 线性表的链式存储

顺序存储结构的插入和删除需要移动大量元素,显然很浪费时间。如果用链表来创建线性表,让两个元素之间能够有联系,找到一个元素就能知道它的下一个元素的位置在哪里。创建一个线性表的链表typedef struct Node{ int data; //数据域 struct Node *next; //指针域}Node;typedef struct Node *LinkList;...

2020-02-07 18:30:32 138

原创 线性表的顺序存储

线性表线性表是零个或者多个数据元素的有序数列。也就是一个元素之间有顺序的序列。像一根线把数字串起来,找到其中一个就能找到它的前一个元素和后一个元素。简单的线性表可以用数组表示,复杂的线性表一个数据元素可以由若干个数据项组成。每个数据的数据类型相同,线性表的顺序存储线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的存储结构。线性表的顺序存储的代码:#define MAX...

2020-02-07 17:23:15 267

原创 二叉堆

堆的定义堆是完全二叉树,可以看做一棵树,堆中任意节点的值总是不大于(或不小于)其子节点的值,所以堆的顶端一定是最大的(或最小的)。堆一般分为小根堆和大根堆。堆的顶端是最小,任意一个节点不大于其子节点的堆叫做小根堆,反之大根堆的堆顶端是最大的。除了二叉堆,常见的堆还有左倾堆,斜堆,二项堆,斐波那契堆等。二叉堆的定义二叉堆分为两种:最大堆和最小堆。最大堆:父节点的值总是大于或等于任何一个子节点...

2020-02-06 20:46:31 110

原创 快速乘

快速乘计算ab%mod,直接计算ab,如果a和b都是long long int类型就会溢出,快速乘就能保证ab不会溢出1234213用小学乘法列竖式:1234213=12343+1234101+12341002转化为二进制10101×101= 10101 * 1 + 10101 * 2 * 1 + 10101 * 2^2 * 0 + 10101 * 2^3 * 1因为转化为二进制后,...

2020-02-06 16:51:01 136

原创 单调栈

单调栈单调栈是一个单调递增或单调递减的栈,可以用来找到从左或从右遍历,比它更大或更小的元素的位置。单调栈的入栈和出栈假如 5 6 9 7 2,从左到右依次入栈,此栈为单调递赠的栈,如果栈为空或者入栈元素小于栈顶元素。5入栈时,栈为空,入栈,栈内元素为106入栈时,栈顶元素5比6小,则5出栈,6入栈,栈内69入栈时,栈顶元素6比9大,则9入栈,栈内元素6,97入栈时,栈顶元素9比7小,...

2020-02-02 21:35:21 126

原创 字符串哈希

字符串Hash字符串hash就是把一个字符串变成一个整数当两个字符串相同时,它们通过hash计算后得到的整数相同,当两个字符串不同时,它们的数字就不同。Hash公式首先设一个进制数base,和一个取模数mod给定一个字符串Sid(x)=x - ‘a’ + 1*hash[ i ] =hash[ i -1 ] base + id(s[ i ])hash冲突比如orzc的哈希值为233...

2020-02-01 21:14:38 365

原创 并查集

并查集并查集算法实际上是找不相交的集合的算法。例如:有n个人,m种关系,如果a认识b,b认识c,那么a能通过b认识c,最后能有几个朋友圈。刚开始时,每个人都是独立的,假如有总共有五个人,建立一个一维数组s[6](需要进行初始化),s[1]~s[5]分别表示这五个人,数组的下标分别代表他们朋友圈中的那个“boss”,通过给出的关系,来合并朋友圈。假设每个人最开始的“boss”是自己,s[1]...

2020-01-23 19:46:33 186

原创 学习总结2020.1.15-1.20

在这五天里,我复习了留校期间学习的二叉树,队列和栈,kmp算法,归并排序。我发现,归并排序并不只是用来排序,还可以运用归并的思想解决更多的问题,比如求逆序数。让我明白了我们比起掌握一个代码,更重要的是要掌握思想。听了17号早上的课,掌握了一些做题的技巧,当遇到一个题目的时候,想到正确的方法很重要,遇到很难用计算机建立的算法,可以采用模拟策略,还有就是要有建模的思想,当时他提到了约瑟夫问题,这个问...

2020-01-21 19:53:00 188

原创 归并排序

归并排序的优点相比于冒泡排序,归并排序的效率更高,它的效率为O(nlogn),而且比起快速排序,归并排序更加稳定。归并排序的原理要将一组乱序的数字排列成有序,用归并来思考,就是分治,即大化小,化为最小的有序数字,即只有一个数字时,合并到上一步,将小化大。步骤为下面的GIF:用更加清楚的图表现它:简而言之,就是将小的子序列排序为有序序列合并,这样就没有冒泡的反复比较大小交换的过程,效率...

2020-01-19 18:24:28 211 1

原创 尺取算法

尺取的用途尺取一般用来选取有一定规律的区间,对一定区间先判断是否符合条件后,再将这个区间推进。尺取算法尺取算法就像毛毛虫,一伸一缩的取区间,找到问题的答案。例如:给长度为n的数组和一个整数m,求总和不小于m的连续子序列的最小长度输入n = 10,m = 155 1 3 5 10 7 4 9 2 8输出2首先找到一个满足条件(总和不小于m)的子序列,再往后推进。找出满足条件的长...

2020-01-18 19:43:18 827

原创 快速幂和快速幂取模

快速幂朴素算法求幂使用for循环一直累乘得到结果,代码如下:int pow(int a,int b){ int i,ans=1; for(i=1;i<=b;i++) { ans=ans*a; } return ans;}该算法的时间复杂度为O(n),而有一种更快速的算法——快速幂,时间复杂度为O(logn)能更快的计算出a...

2020-01-17 16:18:35 139

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除