数据结构与算法
文章平均质量分 94
算法不苦
秦少游在淮海
自由
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数据结构与算法 - 二叉树 #四种遍历方式 #求二叉树的结点个数 #叶节点个数 #树的高度 #第K层的结点个数 #查找值为x的结点 # 销毁 #判断二叉树是否为完全二叉树
1、前序遍历(前根遍历):若二叉树为空,则返回空操作; 否则访问根节点的操作发生在遍历其左右子树之前,即其的访问顺序为:根节点、左子树、右子树2、中序遍历(中根遍历):若二叉树为空,则返回空操作;否则访问根节点的操作发生在遍历左右子树之中,即访问的顺序为:左子树、根节点、右子树3、后序遍历(后根遍历):若二叉树为空,则返回空操作;否则访问根节点的操作发生在遍历左右子树之后,即访问的顺序为:左子树、右子树、根节点;即从左向右先叶子后节点的方式遍历访问左右子树,最后访问的是根节点;4、层序遍历:若二叉树原创 2024-12-25 08:35:37 · 1434 阅读 · 0 评论 -
数据结构与算法 - 归并排序 #递归版本 #非递归版本 #文件归并
1、归并排序(MERGE-SORT) 是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer) (分治可以理解为递归) 的一个非常典型的应用。将有序的子序列进行合并得到完全有序的序列;即先使每个子序列有序,再使得子序列段间有序。若将两个有序的子序列合并为一个有序的序列,称为二路归并;2、外排序(External sorting)是能够处理极大数据量的排序算法;通常来说,外排序的数据不能一次性全部装入内存之中,只能放在读写较慢的外存储器之中(eg.硬盘)。外排原创 2024-12-24 15:01:47 · 1057 阅读 · 0 评论 -
数据结构与算法 - 树-堆 相关算法的时间复杂度分析 #向上调整 #向下调整 #向上调整建堆 #向下调整建堆 #堆排序
向上调整建堆是将本节点与其祖先节点进行比较,而节点所在的层数越大,那一层的节点数越多,该层一个节点所要向上调整的次数也就越多,即节点数量多的层*调整次数多,节点数量少的层*调整次数少;而向下调整是将本节点与其子孙节点进行比较,而层数越大,该层的节点数量越多,调整的次数少;层数越小,该层的节点数量越少,调整的次数越多,即节点数量多的层*调整次数少,节点数量少的层*调整次数多;原创 2024-12-23 18:21:15 · 928 阅读 · 0 评论 -
数据结构与算法 - 动态顺序表 --概念+实现
1、线性表:在逻辑结构上呈现线性,其物理结构不一定呈现线性;线性表包括:顺序表、链表、栈、队列、串等;2、顺序表就是数组,但是在数组的基础上,它还要求数据是从头开始连续存储的,并不能跳跃间隔;并且顺序表作为线性表的一种,其逻辑结构与物理结构均呈现线性;3、线性表的实现定义动态顺序表的类型初始化顺序表功能接口函数的实现(增删查改打印)一些细节的接口函数(销毁动态开辟的空间)小技巧,倘若想迅速搓出一个顺序表,可以先写指定pos位置的插入、指定pos位置的删除这两个函数,头插、尾插、头删、原创 2024-10-12 08:55:30 · 1152 阅读 · 0 评论 -
数据结构与算法 - 排序 #直接插入排序 #希尔排序 #直接选择排序 #堆排序 #冒泡排序 #快速排序(hoare、挖坑、lomuto) #非递归版本快速排序 #归并排序 #非递归版本归并 #计数排序
1、直接插入排序:将待排序的数据往有序的序列中插入,将该数据与序列中的数据依次比较,在序列中找到合适的位置并挪动数据将这个位置空出来,然后再将该待排序数据放到该位置上;2、希尔排序:又称缩小增量法;先选定一个整数(通常是 gap=n/3+1), 将待排序序列分为多组,所有的距离相等的数据分在同一组中,并对每一组中内的数据进行排序;然后再gap=gap/3+1 将数组再分组(组会越来越少),并进行插入排序,当gap为1的时候,就相当于直接插入排序;3、直接选择排序:在待排序列中找最大值、最小值,找到之原创 2024-12-23 19:48:47 · 1290 阅读 · 0 评论 -
数据结构与算法 - 快速排序 #hoare版本 #挖坑法 #lomuto前后指针 #三数取中 #三路划分 #introsort自省排序
快速排序是Hoare 于 1962年提出的一种二叉树结构的交换排序方法;其基本思想为:任取待排序元素序列中的某元素作为基准值,然后再根据所得到的基准值的下标将待排序序列分割成两子序列,其中左子序列中所有元素均小于等于基准值,右子序列中给的所有的元素均大于等于基准值,然后其左右子序列又重复该过程,直到所有元素均排到其应该到的相应的位置上为止;原创 2024-12-24 09:40:19 · 960 阅读 · 0 评论 -
数据结构与算法 - 树 #数的概念 #二叉树 #堆 - 堆的实现/堆排序/TOP-K问题
1、树是一种非线性的数据结构,它是由 n (n>=0) 个有限结点组成的具有层次关系的集合,将此结构叫做树的原因是因为此结构像一棵倒挂的树,即其根在上,而叶朝下;2、二叉树(Binary Tree) 是n (n>=0) 个结点的有限集合,该集合或者为空集(即空二叉树),或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树的二叉树构成,3、堆是一种数据结构,可以在其中插入、删除数据,让其结构仍为堆;利用堆来进行选数是非常方便的,不用我们自己去建堆、调整。(注:以后在c++中还有一种数据结构原创 2024-10-18 21:46:21 · 1288 阅读 · 0 评论 -
数据结构与算法 - 队列
队列:只允许在一端(队头)进行插入数据的操作,在另外一端(队尾)进行删除数据操作的特殊线性表,并且队列具有先进先出(FIFO)的特点;队列最好不要用数组来实现,因为尾插或者头删存在一个一个挪动数据的可能性而导致效率低下;可以使用链表来实现,介于当可以用单链表实现的时候就采用单链表,能节约一点空间是一点空间,当单链表不能完成当前问题的时候再考虑使用双链表。队列可以用单链表实现,故而本文中的队列使用单链表来实现的;原创 2024-10-14 15:28:26 · 1013 阅读 · 0 评论 -
数据结构与算法 - 栈
栈是一种特殊的线性表,只允许在固定的一端(栈顶)进行插入和删除元素的操作。进行数据的插入与删除的一端称为栈顶,另外一端称为栈底;栈中的元素遵循先进先出(LIFO:Last In First Out)的原则;压栈:将数据放入栈中的操作称为压栈/入栈,在栈顶进行入栈的操作出栈:将栈中的数据删除也称为出栈,出数据在栈顶荐用数组,因为数组的CPU高速缓存命中率高;原创 2024-10-13 15:08:47 · 724 阅读 · 0 评论 -
数据结构与算法 - 顺序表与链表的区别
顺序表与链表各有优缺,很难说明二者谁更优;准确来说这两个结构之间是相辅相承的关系;1、顺序表(动态顺序表):逻辑结构上是线性的,物理结构上也上一定是线性结构支持随机访问(利用下标)但是在任意位置上插入或者删除数据需要一个一个地挪动数据以保证顺序表结构的连续性,时间复杂度为O(N),效率不高;并且插入数据,会面临扩容的问题,扩容本身就存在消耗,就地扩容消耗不大(开辟空间,返回该空间的地址),但倘若是异地扩容,便会找新空间,拷贝旧空间的数据到新空间中,释放旧空间中的数据,返回新空间的地址;并且扩容的原创 2024-10-13 15:08:18 · 1169 阅读 · 0 评论 -
数据结构与算法 - 单链表 & 双链表 -- 概念+实现
链表有八种(下述三种特性任意组合):单向或者双向带头或者不带头循环或者非循环1、其中,在单结构中,链表分为单向链表、双向链表;单向链表:上一个结点存放了下一个结点的地址;双向链表:前一个结点存了后一个结点的地址,后一个结点也存放了前一个结点的地址;注:如若想在单链表中找倒数第k个结点,是非常麻烦的,因为单向链表只记录了数据与下一结点的地址,也就是说单链表中的结点不能找到自己的上一结点;但是对于双向链表来说,就完全不是事;并且在双向链表中,删除结点无需保存上一个结点的地址(相较于单链表);原创 2024-10-12 08:56:31 · 1266 阅读 · 0 评论 -
数据结构与算法 #时间复杂度 #空间复杂度
算法的时间复杂度是一个函数,它定量地描述了该算法的运行时间(该算法执行所消耗的时间);理论来说,时间复杂度是不可能算出来的,只有当此程序在机器上跑起来的时候,才可以知道此算法运行的时间;注:此处所述的函数,并不是在C语言中的那个函数,而是在数学之中的函数表达式;时间复杂度为什么不是用来计算该代码运行了多少秒呢?因为并没有一个准确的方式去计算一个算法运行了多少秒;相同的算法在不同的机器上,是有差异的,即一个算法的执行速度受环境的影响;那么时间复杂度究竟计算的是什么呢?计算的是一个算法之中基本原创 2024-09-23 19:00:45 · 1348 阅读 · 0 评论 -
解题—求两数的最大公约数与最小公倍数 #辗转相除法
(a,b)-->求 a,b 的最大公约数(a,b)本质原理:a/b=q…r如果有两个整数a,b 便会存在唯一的一个整数q和r,满足式子 a/b=q...r经过上面图形的启发,我们可得知:(a,b)=(b,r)如何验证这个公式呢?由a/b=q…r,可得a=b*q+r;以及r=a-b*q;假设(a,b) = d1; 则可以得到 a= d1*m,b=d1*n,其中(n,m)=1,即m与n 互质;存在n与m均属于整数那么可知:r=d1*m -di*n*q= d1(m-ng);原创 2024-08-22 23:18:05 · 4457 阅读 · 0 评论 -
字符串查找 - 模拟实现strstr 、BF算法 、 KMP算法
KMP算法是一种字符串匹配算法,由D.E.Knuth.J.H.Morris和V.R.Pratt提出,因此被称为克努特-莫里斯-普拉特操作(简称KMP算法)。该算法的核心是利用匹配失败后的信息,尽量减少使用子串与主串的匹配次数,即在匹配成功得串中找与字串其前段字符匹配的串,以达到快速匹配的目的;具体实现是通过一个数组:next 数组,每次匹配失败后j 回退的下标的信息在next 数组中(此next 数组中会包含字串的局部匹配信息);想要得到数组需要通过写函数计算得到;原创 2024-08-12 21:25:00 · 1246 阅读 · 0 评论
分享