DSA
ISJINHAO
Living & Working!
公众号:ISJINHAO。
github:https://github.com/isjinhao。
展开
-
二叉搜索树(BST)的基本操作
二叉搜索树(BST)的创建、增加、删除、查找。需要注意:BST的左子树必小于根,右子树必大于根,所以不存在值相同的结点。#include<bits/stdc++.h>using namespace std;/* BST基本操作: 00)递归插入 01)非递归插入 02)调用insert()创建树 03)...原创 2018-08-14 19:42:26 · 311 阅读 · 0 评论 -
队列的基础操作
#include<bits/stdc++.h>#define MAX 1010#define ERROR -1using namespace std;class MyQueue{ private: int vals[MAX]; int front, end, size; public: MyQueue() ...原创 2018-08-24 20:59:15 · 131 阅读 · 0 评论 -
桶排序(Bucket Sort)
#include<bits/stdc++.h>using namespace std;/* 基于比较的排序,效率最优的情况下算法时间复杂度也是O(NlogN)。用判定树可证明... 假设数据的范围是W,数据个数是N,当|W| << N时,某些情况下可以把时间复杂度降为O(N) 桶排序: 举例解释: 假...原创 2018-09-04 12:58:42 · 1083 阅读 · 0 评论 -
AOE网络和关键路径
更加具体的知识点请取中国大学MOOC搜索浙大版数据结构,这里只给出了代码的实现。这个算法我没有找到比较好的实现,所以自己实现的有些复杂,欢迎大家拍砖。 #include<bits/stdc++.h>#define INF 99999999using namespace std;/* AOE: 在现代化管理中,人们常用有向图来描述和分析一项工程的计划和...原创 2018-08-25 23:00:20 · 2705 阅读 · 1 评论 -
基数排序(Radix Sort)
#include<bits/stdc++.h> using namespace std;/* 桶排序的弊端: 基数排序是桶排序的改进。在桶排序中,数据规模 >> 数据范围。 当数据规模 << 数据范围时,桶排序的效率就会很低。 基数排序: 基数排序是利用数据的基数建桶,比如有一组十进制数据:...原创 2018-09-04 16:56:25 · 170 阅读 · 0 评论 -
基于比较排序的时间复杂度的下界
快排的O(NlogN)真的最快了吗?相信大家都已经知道如归并排序、快速排序等算法能在把排序的时间复杂度降为O(NlogN)级别,而排序的时间复杂度理论上最好是O(N)级别,因为最优情况也得把数据读取一遍。所以要探讨的问题是还有没有排序算法能把时间复杂度降为O(N)或者说趋近于O(N)?由于本人也不是数学专业,所以证明排序时间复杂的下界不多说。但是在特定条件下排序的时间复杂度可以降到O(N)级别...原创 2018-09-04 17:11:51 · 7691 阅读 · 2 评论 -
最小生成树 - Prim
#include<bits/stdc++.h>#define INF 99999999 using namespace std;/* 最小生成树: 某个图的最小生成树包含如下要求: 1)是一颗树:无回路、V个顶点的图有V-1条边 2)生成树:图的所有顶点都包含在树中、树的所以边都是图中的边 ...原创 2018-08-30 11:31:39 · 338 阅读 · 0 评论 -
字符串匹配 - KMP算法
#include<bits/stdc++.h>using namespace std;int *getNext(string p){ int l = p.length(), k = -1, i = 0; int *next = new int[l]; next[0] = -1; while(i < l ...原创 2018-09-02 11:48:57 · 153 阅读 · 0 评论 -
Huffman编码的解码
关于Huffman编码和KMP的知识请看我的这两篇文章:Huffman编码、KMP。#include<bits/stdc++.h>using namespace std;/* Huffman解码: 为什么把这个单独提出来,是因为我想把它和KMP结合起来使用。 */class Node{ public: char c; ...原创 2018-09-02 13:28:04 · 443 阅读 · 0 评论 -
二路归并排序(Merge Sort)
图片来源#include<bits/stdc++.h>using namespace std;/* 有序子列的归并: 对于两个有序子列:1 3 5 6 、 2 4 7 8 易知可以在线性时间复杂度内把这两个序列合成一个有序序列。 二路归并排序: 见图 *//* 左右开始和左右结束都...原创 2018-09-02 15:55:06 · 630 阅读 · 0 评论 -
堆排序
#include<bits/stdc++.h>using namespace std;/* 堆排序应该是理解上最简单的了。如何提升空间利用率是堆排序的关键。 对于正常的思路,把数组建堆,然后取出堆顶保存就可以,但是这样做的话需要单独开辟一块和数据规模同样大小的空间用以保存数据 如下方法可以不开辟内存达到排序的效果 假设升序排序构建的堆如下: ...原创 2018-09-02 17:25:51 · 103 阅读 · 0 评论 -
快速排序(Quick Sort)
#include<bits/stdc++.h>using namespace std;/* 按升序排序理解 快速排序: 自顶而下每次通过选定的主元把数据分成两个部分,左边小于主元,右边大于主元 递归至数据规模小于等于1 。(归并排序是至底向上)*//* 选主元的方法: 选主元的方法很多,下面的一种方法...原创 2018-09-02 22:34:17 · 157 阅读 · 0 评论 -
矩阵图的四个算法 - DFS、BFS、Dijkstra、Topological Sort
之前总结的图的基本算法有DFS、BFS、Dijkstra、Topological Sort、关键路径、Prim和Kruskal。但PAT甲级中目前只使用到了如下四个算法,而且一般都是用矩阵图来实现,所以把这四个算法用矩阵图实现一下总结成一篇文章。#include <bits/stdc++.h>#define INF 1010 using namespace std;clas...原创 2018-09-02 22:45:53 · 497 阅读 · 0 评论 -
哈希表 - 闭散列
闭散列主要就是需要注意一下“墓碑”的操作,其他的其实都简单。ASL的计算忘了,找了两道题都没算对,这才是我不写的真正原因…代码里是装13用的…#include<bits/stdc++.h>using namespace std;/* 哈希表: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也...原创 2018-09-05 21:57:25 · 686 阅读 · 0 评论 -
哈希表 - 开散列
开散列很简单。ASL的计算忘了,找了两道题都没算对,这才是我不写的真正原因…代码里是装13用的…#include<bits/stdc++.h>using namespace std;/* 哈希表: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关 键码值映...原创 2018-09-05 22:48:26 · 210 阅读 · 0 评论 -
基于插入排序的表排序
具体知识点请去中国大学MOOC看浙大版数据结构,这里只给出了算法的实现。#include<bits/stdc++.h>using namespace std;/* 表排序: 之前的排序中我们是直接对数据进行交换来进行排序。适用于数据项的sizeof()较小时, 但是对于数据项的sizeof()较大时,直接交换数据项太浪费时间,表排序便...原创 2018-09-03 19:12:51 · 1099 阅读 · 0 评论 -
栈的基础操作
#include<bits/stdc++.h>#define MAX 1010#define ERROR -1using namespace std;class MyStack{ private: int vals[MAX]; int top; public: MyStack() { ...原创 2018-08-24 20:58:44 · 125 阅读 · 0 评论 -
拓扑排序(Topological order)
#include&lt;bits/stdc++.h&gt;#define INF 99999999 using namespace std;/* AOV: 一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity)。在整个工程中,有些子工 程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工程的开始是以它的所有前...原创 2018-08-21 21:06:09 · 2424 阅读 · 0 评论 -
Dijkstra
把链式图和矩阵图的Dijkstra写了一下。矩阵图用二维数组保存的,链式图用一维vector数组保存的。#include <bits/stdc++.h>#define INF 99999999using namespace std;/* 过程变量: int length; //原点到顶点的最短路径 int visit; ...原创 2018-08-12 15:57:02 · 148 阅读 · 0 评论 -
二叉树的基本操作
这篇文章只有二叉树的基本操作,对于AVL、Huffman等不涉及。基本都是计科专业课内的知识点。#include <bits/stdc++.h>#define MAX 1010using namespace std;/* 树的基本操作: 00)由前序结果建树 01)前序递归周游 02)前序非递归周游 ...原创 2018-08-12 15:59:21 · 207 阅读 · 0 评论 -
平衡二叉树(AVL)的基本操作
AVL树的插入、创建和删除。主要是参考中国大学MOOC浙大版数据结构。#include<bits/stdc++.h>using namespace std;/* AVL基本操作: 00)插入 01)创建 02)删除 *//* AVL: 1)是一棵空树 2)具有下列性质的二...原创 2018-08-15 17:33:02 · 578 阅读 · 0 评论 -
图的BFS周游
#include<bits/stdc++.h>#define INF 99999999 #define MAX 1010using namespace std;/* 算法: 初始化时把开始结点如队列 循环: 获得队列头结点。 把和此结点相连的边都压入队列中 至队列为空 ...原创 2018-08-22 13:36:34 · 205 阅读 · 0 评论 -
图的DFS周游
#include<bits/stdc++.h>#define INF 99999999 #define MAX 1010using namespace std;/* 算法: 访问当前结点 递归进入当前结点的第一个连接且未被访问结点 直至退栈 */class MGraph //矩阵图 ...原创 2018-08-22 13:45:01 · 145 阅读 · 0 评论 -
Huffman树和Huffman编码
Huffman树的创建和Huffman编码。使带权路径最短的树。#include<bits/stdc++.h>#define MAX 1010using namespace std;/* Huffman树: 带权路径长度最小的树 各结点到根的距离与结点的权相乘之和叫带权路径长度。 Huffman编码: 把Hu...原创 2018-08-19 16:04:47 · 299 阅读 · 0 评论 -
栈的典型应用 - 中缀表达式求值
#include<bits/stdc++.h> #define MAX 1010using namespace std;/* 表达式求值有两步,一步是中缀表达式转后缀表达式,一步是后缀表达式求值。 中缀转后缀: 从左到右遍历中缀表达式的每个数字和符号, 1)若是数字就输出,即成为后缀表达式的一部分。 2)待入栈元素...原创 2018-08-26 15:56:37 · 501 阅读 · 0 评论 -
三种简单排序 - 冒泡、选择、插入
#include<bits/stdc++.h>using namespace std;/* 简单排序: 平均时间复杂度都是O(N方)级别。包括:冒泡排序、插入排序、选择排序 说明: 实现的算法都是升序排序。 */void swap(int &e1, int &e2){ int temp = e1;...原创 2018-08-26 22:40:44 · 179 阅读 · 0 评论 -
堆(Heap)的基本操作
堆分为最大堆和最小堆,本文以最大堆为例。其实主要就是adjustDown()和adjustUp()这两个操作。一个删除时调整堆,一个插入时调整堆。#include <bits/stdc++.h>#define MAX_SIZE 1010#define INF 99999999 using namespace std;/* 堆: 1)堆中某个节点的值总...原创 2018-08-17 09:23:07 · 1409 阅读 · 0 评论 -
二分查找(binary search)
#include<bits/stdc++.h>#define ERROR -1using namespace std;int binarySearch(int *arr, int data){ int begin = 0; //开始的点为首索引 int end = 9; ...原创 2018-08-20 12:04:11 · 250 阅读 · 0 评论 -
并查集
这个概念参考中国大学MOOC浙大的数据结构,时间复杂度比它给的源码大,是因为代码中没有使用索引值作为数据值。#include<bits/stdc++.h>using namespace std;/* 并查集: 并查集就是能进行合并和查找根运算的集合。 集合就是数学上所指的集合。 *//* 分析: 集合可以直接使...原创 2018-08-20 12:52:55 · 694 阅读 · 0 评论 -
最小生成树 - Kruskal
#include<bits/stdc++.h>#define INF 99999999#define MAX 1010using namespace std;/* 最小生成树: 某个图的最小生成树包含如下要求: 1)是一颗树:无回路、V个顶点的图有V-1条边 2)生成树:图的所有顶点都包含在树中、树的所以边...原创 2018-08-30 20:49:20 · 241 阅读 · 0 评论 -
希尔排序(Shell Sort)
#include&lt;bits/stdc++.h&gt;using namespace std;/* 说明: 下面的内容全是按照升序排序来写的。 */ /* 逆序对: 对于下标i &lt; j,若arr[i] &gt; arr[j],则称arr[i]和arr[j]是一个逆序对。 在排序过程中,最终的目的就是需要消除全部的...原创 2018-08-27 20:04:34 · 192 阅读 · 0 评论 -
简易的并查集
#include<bits/stdc++.h>using namespace std;/* 简易版的并查集: 集合的元素使用数组的下标。集合的数据是它的父结点 */int getRoot(int *parent, int x){ if(parent[x] < 0) return x; return parent...原创 2018-08-30 21:51:20 · 86 阅读 · 0 评论 -
链表的基础操作
#include<bits/stdc++.h>using namespace std;/* 链表的基本操作: 0)创建 1)插入 2)删除 3)倒置 4)查找倒数第k个字符串 在任何情况下最多只周游链表一遍。即不用求链表长度 */typedef class Nod...原创 2018-08-24 12:00:55 · 161 阅读 · 0 评论 -
树转化为二叉树
#include&lt;bits/stdc++.h&gt;#define INF 99999999using namespace std;/* 树: 树是一种特殊的图,这种图是连通的,并且边数恰好比顶点数少一,即:树集 = { G=(V,E) :|V|=0 或 G连通且|E|=|V|-1}*//* 默认0是根结点 */cla...原创 2018-09-06 16:30:32 · 718 阅读 · 0 评论