
数据结构与算法 (C++)
文章平均质量分 68
amoscykl
Casablanca!
展开
-
递归——线性递归与二分递归
递归线性递归例子1:数组求和int sum( int A[], int n) { //数组求和算法:线性递归版 if ( 1 > n ) //平凡情况,递归基 return 0; //直接计算 else //一般情况 return sum(A, n-1) + A[n - 1]; //递归:前n-1项之和,再累计第n-1项}每一递归实例对自身的调用至多一次。于是,每...原创 2018-06-29 23:35:57 · 4893 阅读 · 1 评论 -
经典排序算法实现和总结
算法分类非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。算法复杂度:稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本...原创 2018-12-22 00:26:25 · 529 阅读 · 0 评论 -
拓扑排序
原文地址:http://blog.youkuaiyun.com/lisonglisonglisong/article/details/45543451一、什么是拓扑排序在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:1.每个顶点出现且只出现一次。2.若存在...转载 2018-11-05 12:30:42 · 2659 阅读 · 0 评论 -
红黑树的原理分析与(C++)实现: 模板类、插入算法双红修正、删除算法双黑修正 (C++)
红黑树1.概述定义由红、黑两色节点组成的二叉搜索树若满足以下条件,即为红黑树 (red-black tree): (1) 树根始终为黑色 (2) 外部节点均为黑色 (3) 其余节点若为红色,则其孩子节点必为黑色 (4) 从任一外部节点到根节点的沿途,黑节点的数目相等 从以上条件可得:红节点均为内部节点,且其父节点及左、右孩子必然存在。红节点之父必为黑色...原创 2018-08-12 17:07:10 · 1812 阅读 · 0 评论 -
数据结构(C++)——二叉树的遍历:先序,后序,中序,层次遍历
递归式遍历 1.先序遍历template <typename T, typename VST> //元素类型、操作器void travPre_R(BinNodePosi(T) x, VST& visit) { //二叉树先序遍历算法 if (!x) return; visit( x->data); travPre...原创 2018-08-02 23:31:17 · 3590 阅读 · 0 评论 -
数据结构(C++)——二叉树 BinTree
二叉树的实现 二叉树节点—BinNode模板类#define BinNodePosi(T) BinNode<T>* //节点位置#define stature(p) ((p) ? (p).height: -1) //节点高度typedef enum { RB_RED, RB_BLACK } RBColor; //节点颜色template <typenam...原创 2018-08-02 22:58:41 · 1706 阅读 · 0 评论 -
多路平衡搜索树—B-树的原理实现和分析:模板类,查找、插入、删除算法以及上溢下溢处理 (C++)
B-树 1.多路平衡查找多路搜索树具体地如图8.10所示,比如可以两层为间隔,将各节点与其左、右孩子合并为“大节点”,每个“大节点”拥有四个分支,故称作四路搜索树。一般地,以k层为间隔如此重组,可将二叉搜索树转化为等价的2^k路搜索树,统称多路搜索树(multi-way search tree)。 多路平衡搜索树所谓m阶B-树 (B-tree),即m路平衡搜索树(m...原创 2018-08-11 23:53:20 · 1051 阅读 · 0 评论 -
伸展树的实现与分析:伸展算法的实现,查找、插入、删除算法的实现 (C++)
伸展树(splay tree)通常在任意数据结构的生命期内,不仅执行不同操作的概率往往极不均衡,而且各操作之间具有极强的相关性,并在整体上多呈现出极强的规律性。其中最为典型的,就是所谓的“数据局部性”(data locality),这包括两个方面的含义: 1)刚刚被访问过的节点,极有可能在不久之后再次被访问到 2)将被访问的下一节点,极有可能就处于不久...原创 2018-08-11 19:00:34 · 2667 阅读 · 0 评论 -
平衡二叉搜索树:AVL树的实现与分析 以及 统一重平衡算法 (C++)
平衡二叉搜索树既然二叉搜索树的性能主要取决于高度,故在节点数目固定的前提下,应尽可能地降低高度。相应地,应尽可能地使兄弟子树的高度彼此接近,即全树尽可能地平衡。 等价变换等价二叉搜索树:若两棵二叉搜索树的中序遍历序列相同,则称它们彼此等价;反之亦然。 旋转调整最基本的修复手段,通过围绕特定节点的旋转,实现等价前提下的局部拓扑调整。zig和zag: ...原创 2018-08-11 16:19:05 · 1531 阅读 · 1 评论 -
二叉搜索树:BST模板类、查找、插入、删除操作 (C++)
二叉搜索树 1.顺序性任一节点r的左(右)子树,所有节点均不大于(小于)r 2.中序遍历序列对二叉搜索树做一次中序遍历,即可将该树转换为一个线性序列,且该序列中的节点严格按照其大小次序排列。任何一棵二叉树是二叉搜索树,当且仅当其中序遍历序列单调非降 3.BST模板类二叉搜索树属于二叉树的特例,故自然可以基于BinTree模板类#include ...原创 2018-08-11 15:59:01 · 2583 阅读 · 1 评论 -
栈(Stack)的应用—试探回溯法:八皇后问题、迷宫寻径
栈的应用 试探回溯法1.八皇后问题皇后类struct Queen { //皇后类 int x, y; //坐标 Queen (int xx = 0, int yy = 0 ) : x(xx), y(yy) {}; bool operator==( Queen const& q ) const { //重载判等操作符,检验不同皇后之间存在的...原创 2018-08-01 15:29:16 · 1137 阅读 · 0 评论 -
栈(Stack)和队列(queue)及其应用(C++)
栈栈操作实例: 栈可试作序列的特例,将栈作为向量的派生类#include "../Vector/Vector.h" //以向量为基类,派生出栈模板类template <typename T> class Stack: public Vector<T> { //将向量的首/末端作为栈底/顶public: ...原创 2018-08-01 15:22:20 · 1226 阅读 · 0 评论 -
数据结构(C++)——图的遍历算法:广度优先搜索、深度优先搜索、优先级搜索算法
图的遍历算法图的遍历都可以理解为,将非线性结构转化为半线性结构的过程。经遍历而确定的边类型中,最重要的一类即所谓的树边,它们与所有顶点共同构成了原图的一棵支撑树(森林),称作遍历树(traversal tree)。 广度优先搜索(BFS)广度优先搜索(breadth-first search, BFS)采用的策略,可概括为: 越早被访问到的定点,其邻居越优先被选用...原创 2018-08-03 22:53:09 · 5661 阅读 · 0 评论 -
数据结构(C++)——图:基于邻接矩阵实现的图结构
抽象数据类型操作接口:图支持的操作接口分为边和顶点两类 Graph模板类typedef enum { UNDISCOVERED, DISCOVERED, VISITED } VStatus; //顶点状态typedef enum { UNDETERMINED, TREE, CROSS, FORWARD, BACKWARD } EStatus; //边状态template...原创 2018-08-03 22:46:09 · 2758 阅读 · 0 评论 -
列表—List 底层实现
列表的元素构成一个线性逻辑次序,元素的物理地址可以任意。链表(linked list)是一种典型的动态存储结构,其中的数据分散为一系列节点单位。节点之间通过指针相互索引和访问。为了引进新节点或删除原有节点,只需在局部,调整少量相关节点之间的指针。这意味着,采用动态存储策略,可以大大降低动态操作的成本。列表节点模板类typedef int Rank; //秩#defin...原创 2018-07-06 00:18:39 · 4670 阅读 · 0 评论 -
向量—vector 底层实现
最为基本的线性结构统称为序列,根据其中数据项的逻辑次序与其物理存储地址的对应关系不同,又可进一步地将序列区分为向量(vector)和列表(list)。在向量中,所有数据项的物理存放位置与其逻辑次序完全吻合,此时的逻辑次序也称为秩(rank)。在列表中,逻辑上相邻的数据项在物理上未必相邻,而是采用间接定址的方式通过封装后的位置(position)相互引用。Vector模板类/...原创 2018-07-04 00:05:42 · 867 阅读 · 0 评论 -
动画: 什么是散列表? (Hash Table 哈希表)
本文来自算法爱好者! (部分详细介绍)散列表散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。散列函数散列函数,顾名思义,它是一个函数。如果把它定义成hash(key...原创 2019-02-11 22:30:26 · 937 阅读 · 0 评论