数据结构与算法
文章平均质量分 65
silence1772
为者常成,行者常至
展开
-
并查集
并查集的实现比较简单,注意一点在查找时执行路径压缩即可。vector<int> Parent(100);vector<int> Rank(100, 0);void Init(){ for (int i = 0; i < Parent.size(); ++i) Parent[i] = i;}int Find(int x){ if (x != P...原创 2018-11-04 16:52:19 · 122 阅读 · 0 评论 -
KMP字符串匹配算法
“看毛片”算法可以说是许多人学习数据结构路上的一道坎,虽说代码并不算难,但总是写了就忘,其算法思想也是难以理解。其实多写几遍就会发现,也就那么回事。主要思想:kmp算法主要是通过一个next数组来加速匹配的过程,这个next数组也称为失配数组。现在我们来考虑下面这种情况,母串与匹配串匹配到了如图箭头位置,但此时A和B并不匹配,怎么办呢?注意到图中蓝色部分是相等的子串,因此我们直接移动匹配串让A...原创 2018-11-04 14:42:01 · 158 阅读 · 0 评论 -
二叉搜索树及AVL平衡二叉搜索树
二叉搜索树二叉搜索树是二叉树的的一种,只不过多了个限制条件,即左子树节点的值都小于该点,右子树节点的值都大于该点。定义:// 树节点template &lt;typename T&gt;class Node{public: T key; Node* parent; Node* left; Node* right; Node(T k, Node* p = nullptr,...原创 2018-11-06 13:39:54 · 232 阅读 · 0 评论 -
二分查找
二分查找主要思想就是在一个排好序的数组中,取到位于中间的元素,根据这个元素与要查找的值进行比对,来判断是往左边走还是右边。时间复杂度为O(logn),是许多题目的解题关键。三分支版传入数组的起始和结束边界,以及要查找的值,查找到则返回下标,否则返回-1,因为最坏情况下要进行两次比较,所有时间复杂度的常数项稍微高一点。int BinarySearch(vector<int>&...原创 2018-11-03 23:25:32 · 129 阅读 · 0 评论 -
二叉树各种遍历算法
#include &amp;amp;lt;iostream&amp;amp;gt;using namespace std;struct Node{ int value; struct Node* left; struct Node* right; Node(int data) : value(data), left(nullptr), right(nullptr) {};};// 先序遍历void Pre...原创 2018-11-01 22:15:12 · 20549 阅读 · 1 评论 -
二叉树的Morris遍历
二叉树的普通遍历算法有很多,但它们都无法做到额外空间复杂度O(1),因为它们总要用到栈来保存信息,才能够从下层回到上层。这里介绍Morris遍历,能够做到时间复杂度为O(n),额外空间复杂度为O(1)。Morris中序遍历Morris遍历其实就是利用了树中大量的null指针。如下图,我们现在先来考虑中序遍历,对于节点4,什么时候会打印它呢?由中序遍历的序列得知,在节点4的左子树都打印完毕后,...原创 2018-11-03 13:34:14 · 341 阅读 · 0 评论 -
选择、冒泡、归并、插入及希尔排序
选择排序选择排序每次遍历一遍数组,找出最小的数,然后跟数组的第一个元素交换。再从剩下的元素中重复此步骤直至数组排序完毕。时间复杂度与输入数据无关,为O(n^2)。代码:void SelectSort(vector&lt;int&gt;&amp; a){ int n = a.size(); for (int i = 0; i &lt; n - 1; ++i) { int min ...原创 2018-10-30 23:16:37 · 151 阅读 · 0 评论 -
桶排序、基数排序
桶排序主要思想:对于输入的数据(大小范围为0~max),创建0到max个桶,第一步装桶:遍历数据,将与元素值相等的桶计数加1;第二步收集:遍历桶,如果桶计数n不为0,则在原数组中增加n个与桶标号相等的数。代码:// 需传入数据中的最大值void BucketSort(vector<int>& a, int max){ int n = a.size(); int ...原创 2018-10-31 23:50:08 · 174 阅读 · 0 评论 -
堆排序
基本思想堆排序是利用二叉堆实现的一种排序算法,它的最好、最坏、平均时间复杂度均为O(nlogn),为不稳定排序,可实现就地排序,额外空间复杂度为O(1)。先了解一下堆的结构。堆本质上是完全二叉树,分为大顶堆和小顶堆,每个结点的值都大于或等于左右孩子的称为大顶堆,反之为小顶堆。【图】下面我们都以大顶堆为例。将该二叉堆结构按照层次遍历的次序映射到数组中,则该数组逻辑上也是一个堆。【图】对于...原创 2018-10-29 22:44:51 · 336 阅读 · 0 评论 -
快速排序
快速排序快速排序基于分治策略,时间复杂度最好O(nlogn),最差O(n^2),平均O(nlogn),为不稳定排序。算法思想:选取一个数作为轴点,然后把小于轴点的元素移到左边,大于轴点的移到右边,接着递归处理左右两部分,最终处理完毕的数组即为排序后的数组。...原创 2018-10-29 13:18:40 · 158 阅读 · 0 评论 -
红黑树
红黑树是一种特殊的二叉搜索树,原创 2018-11-07 20:02:50 · 251 阅读 · 0 评论