![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构&算法
数据结构
喜欢吃冰棍de谷利文君
日拱一卒,功不唐捐
展开
-
链表
链表需要先定义好节点Node,可以使用class或者结构体的形式。当然定义一个头结点,可以实现后面添加和删除操作的统一性。多注意下使用递归实现链表尾部添加元素。具体实现://链表template <class T>class Node{public: T e; Node *next; Node(T e,Node *next):e(e),next(...原创 2020-04-28 23:21:50 · 89 阅读 · 0 评论 -
队列
队列的操作和栈比较类似,只不过是队列是先进先出的,同样只需要实现好顶层的接口,底层可以使用数组作为数据存储。实现如下:template <class T>class ArrayQueue : public Queue<T>{private: Array<T> *array;public: ArrayQueue(int capacity...原创 2020-04-28 22:09:14 · 109 阅读 · 0 评论 -
栈
栈的实现顶层接口是固定的,一致的;如下所示:template <class T>class Stack{public: int getSize(); bool isEmpty(); void push(T e); T pop(); T peek();};但是底层实现,可以是数组,也可以是链表,只需要提供顶层相应的接口就可以了。下面这...原创 2020-04-27 23:07:25 · 84 阅读 · 0 评论 -
数组
重新整理一下数组的实现!1、数组的定义数组定义需要的成员变量:T *data; //数据int size; //个数int capacity; //容量2、主要操作1)数组的构造函数需要注意数据需要使用new来开辟一定的空间大小,默认是10;2)在进行添加和删除操作时,需要维护size;3)一般操作包含:添加、查询、修改、包含、搜索、删除;4)下面的实现中使用了泛型;5...原创 2020-04-27 22:38:54 · 89 阅读 · 0 评论 -
堆排序
关于堆的数据结构的讲解这里不再赘述,可以参考前面的博客:优先队列&堆堆排序的思路比较简单, 将所有的元素依次添加到堆中, 在将所有元素从堆中依次取出来, 即完成了排序。这里采用的是最大堆,那么每次取出的元素的都是序列中最大的元素,只需要将取出的元素依次存放,就可以实现排序。无论是创建堆的过程, 还是从堆中依次取出元素的过程, 时间复杂度均为O(nlogn) 。整个堆排序的整体时间...原创 2020-03-16 14:54:28 · 114 阅读 · 0 评论 -
快速排序
1 快速排序法通常使用第一个元素作为分界点;1)i处的元素大于v,直接添加在大于v的后面;2)i处的元素小于v,则将其和j后面一个位置的元素进行交换;3)最后,将v和j后面一个位置的元素进行交换。partition操作:int __partition(T arr[], int l, int r) {// 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot ...原创 2020-03-15 17:17:38 · 156 阅读 · 0 评论 -
归并排序Merge Sort
这里的层数是log(N)log(N)log(N),N为元素个数,Nlog(N)Nlog(N)Nlog(N)原创 2020-03-14 22:05:17 · 133 阅读 · 0 评论 -
排序基础
1 选择排序时间复杂度:O(n2)O(n^2)O(n2);唯一的好处:不占用额外的内存空间。算法步骤:1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾;3)重复第二步,直到所有元素均排序完毕。void selectionSort(T arr[],int n){ for(int i=0;...原创 2020-03-13 20:13:32 · 125 阅读 · 0 评论 -
线段树
线段树存储的不是区间的所有元素,而是由具体操作确定的,例如求和,那么存储的就是这个区间段的和。原创 2020-03-13 13:38:15 · 106 阅读 · 0 评论 -
哈希表
哈希表O(1)的查找操作哈希表充分体现了算法设计领域的思想:空间换时间键通过哈希函数得到的索引,分布越均匀越好1 哈希函数的设计1)整型小范围正整数直接使用;小范围负整数进行偏移;大整数:取模,模一个素数;下面的右侧分布就比较均匀:2)浮点型3)字符串转换成整型处理:优化一下:代码实现:4)复合类型转成整型处理:2 哈希冲突的处理——链地址法(S...原创 2020-03-12 21:00:55 · 135 阅读 · 0 评论 -
优先队列&堆
普通队列:先进先出;后进后出优先队列:出队顺序和入队顺序无关;和优先级相关1 优先队列所以,使用堆实现优先队列比较好。2 堆的基本结构二叉堆Binary Heap二叉堆是一棵完全二叉树;堆中某个节点的值总是不大于其父节点的值;最大堆(最小堆);1)用数组存储二叉堆从1开始存储:从0开始存储:2)节点索引计算计算父节点索引:// 返回完全二叉树的数组表示...原创 2020-03-12 15:18:54 · 164 阅读 · 0 评论 -
集合&映射
一、集合Set集合是一种抽象数据结构,和底层实现无关。我们可以使用动态数组、链表、二分搜索树等底层实现。1、有序集合基于搜索树实现在集合的基础上,还保持这所存储元素的顺序。在有序集合中,可以提供接口,供调用者完成下列操作:找到所存储元素的最大值(maximum),最小值(minimum),某个元素的下一个元素(succesor),上一个元素(predecessor),第k大元素(sele...原创 2020-03-12 10:21:45 · 146 阅读 · 0 评论 -
红黑树
《算法导论》中关于红黑树的定义:每个节点或者是红色的,或者是黑色的;根节点是黑色的;每一个叶子节点(最后的空节点)是黑色的;如果一个节点是红色的,那么他的孩子节点都是黑色的;从任意一个节点到叶子节点,经过的黑色节点是一样的。在算法4中,讲述了红黑树与2-3树的等价性,我们先理解2-3树和红黑树之间的关系。1 2-3树(绝对平衡的树)满足二分搜索树的基本性质,节点可以存...原创 2020-03-11 00:04:16 · 108 阅读 · 0 评论 -
平衡二叉树 AVL
平衡二叉树 AVL先弄清楚几个概念:1)满二叉树:除了叶子节点,都是满的;2)完全二叉树:整体而言,空缺的节点一定是位于树的右下方;整棵树的叶子节点最大深度值和最小深度值,相差不会超过1;3)平衡二叉树:对于任意一个节点,左子树和右子树的高度差不能超过1。1 平衡因子通过平衡因子可以判断出是否为平衡二叉树,这决定了是否需要进行左旋转或右旋转操作。第一步,标注节点的高度;节点的高度=...原创 2020-03-07 23:21:50 · 760 阅读 · 0 评论 -
二分搜索树
二分搜索树1 添加元素添加元素的思路:1)判断,若树为空,则创建一个新的节点,直接使用添加的元素初始化;2)不为空,则比较添加元素与节点元素的大小,然后使用递归左(右)子树;3)递归终止条件:节点为空,创建新的节点并初始化返回。 //向以node为根的二分搜索数中插入元素e,递归算法 //返回插入新节点后二分搜索树的根 TNode<T> *add(TNode...原创 2020-03-06 18:51:48 · 160 阅读 · 0 评论 -
并查集算法
出处链接:ht...转载 2019-11-26 19:24:38 · 113 阅读 · 0 评论 -
数据结构——绪论
文章目录1 基本术语2 逻辑结构3 存储结构4 数据类型5 算法分析5.1函数的渐近增长5.2算法时间复杂度 数据的逻辑结构描述 数据的存储结构表示 数据结构的运算定义 设计实现运算的算法 分析算法的效率培根:方法是旧的,问题是新的。 求解问题→\rightarrow→数据逻辑结构→\rightarrow→数据存储结构→\rightarrow→数据基本运...原创 2019-10-05 16:39:47 · 147 阅读 · 0 评论 -
KMP模式匹配算法
KMP模式匹配算法1、前缀值求解2、KMP实现3、来源学习到串这一章,碰到一个不太好理解的算法,记录一下。数据结构:串;字串的定位操作通常称为串的模式匹配,算是串中最重要的操作之一。这里主要讲一下KMP模式匹配算法(即克努特-莫里斯-普拉特算法)。1、前缀值求解在进行KMP算法操作之前需要求解将要匹配的字符串的前缀值,表现为一个前缀数组。第一步,前缀表下面是即将要匹配的字符串,先写出...原创 2019-03-27 11:56:05 · 296 阅读 · 0 评论