数据结构与算法
文章平均质量分 82
FreeeLinux
A3GM5H3647LPD4QVYMYAER2S47P4WZ2UKBXBCGZES2V62WEY2HULQA
展开
-
无向图的邻接矩阵和邻接表实现各种操作 -- C++语言描述
一:实现代码#ifndef _GRAPH_H#define _GRAPH_H#include #include using namespace::std;/////////////////////////////////////////////////////////////////////////////////////////////通用图结构template原创 2016-08-16 19:00:27 · 6836 阅读 · 1 评论 -
C++实现二叉树所有操作 -- 创建递归遍历迭代遍历拷贝清空查找
本文代码实现了二叉树输入流创建,字符串创建,带返回值的创建,前中后序递归及迭代遍历二叉树,拷贝二叉树,求大小,高度,查找元素,查找父节点,子节点,清空,比较等等二叉树所有操作。文中所有代码均经过测试。#ifndef _BIN_TREE_H#define _BIN_TREE_H#include #include #include #include #include using n原创 2016-08-04 20:19:25 · 1009 阅读 · 0 评论 -
C++引用计数思想--利用引用计数器自定义String类
什么是引用计数? 最直观的垃圾收集策略是引用计数。引用计数很简单,但是需要编译器的重要配合,并且增加了赋值函数 (mutator) 的开销(这个术语是针对用户程序的,是从垃圾收集器的角度来看的)。每一个对象都有一个关联的引用计数 —— 对该对象的活跃引用的数量。如果对象的引用计数是零,那么它就是垃圾(用户程序不可到达它),并可以回收。每次修改指针引用时(比如通过赋值语句),或者当引原创 2016-07-31 19:54:43 · 2164 阅读 · 0 评论 -
位向量实现的bitset集合
PS:停电了一天,唉,无语,昨天晚上特意9点多在实验室躺着休息了一会,等着他们说好的11.59来电,我11.50去厕所刷牙洗脸,坐在电脑旁,打算把一天的思路敲出来,结果确实窗外黑压压一片,依旧没有来电。用位向量实现集合,采用16位无符号短整数数组bit_vector[]作为集合元素的存储,1和0分别表示在或不在集合之中。如何将集合元素i的值存入位向量之中,采用put_member()函原创 2016-11-13 11:42:59 · 2191 阅读 · 1 评论 -
C语言实现哈希表HashTable及迅雷面试题哈希表桶结构代码
本文利用除留取余法+链地址法实现哈希表,并针对迅雷面试题写出相关代码。一:哈希表哈希表代码如下:#ifndef _HASH_TABLE_H#define _HASH_TABLE_H#include #include #include #include #define ElemType int#define N 7typedef struct HashNode{原创 2016-08-10 19:56:33 · 2218 阅读 · 0 评论 -
C++实现队列--数组实现和链表实现
队列是一个简单的等待序列,在尾部加入元素时队列加长,在前端删除数据时队列缩短。与栈不同,队列是一种两端的结构:一端用来加入新元素,另一端用来删除元素。因此,元素必须等到排在它之前的所有元素删除之后才能操作。队列是FIFO(first in first out)结构。一:队列的数组实现我们用 first 和 last 存储队列首元素和尾元素的下标。*当队列为空时,习惯上设置 first原创 2016-07-30 22:14:42 · 9196 阅读 · 0 评论 -
实现单向链表节点删除
本文将介绍单向链表的建立,遍历,删除操作。首先是结构体定义:#include #include typedef struct Integer{ int num; struct Integer *next;}Node, *Linklist;单向链表的创建如下(不带头节点):Node* create_list(const int n){原创 2016-06-01 21:39:49 · 1447 阅读 · 0 评论 -
二叉树的创建与前序遍历(递归方式)
首先是二叉树的结构部分:#include #include typedef char ElemType;typedef struct BiTreeNode{ ElemType m_chValue; struct BiTreeNode *m_pLeft; struct BiTreeNode *m_pRight;} BiTNode, *B原创 2016-06-02 21:55:50 · 909 阅读 · 0 评论 -
C++实现单向链表
****************************IntSLList.h*****************************/#ifndef _INTSLLIST_H_#define _INTSLLIST_H_class IntSLLNode{public: IntSLLNode(){next = 0;} IntSLLNode(int el,原创 2016-06-01 16:43:58 · 735 阅读 · 0 评论 -
双向链表的创建查找与删除元素
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。#include <stdio.h>#include <stdlib.h>#define ERROR printf("ERROR");#define MAXSIZE 20#define YE原创 2016-05-14 23:46:06 · 1558 阅读 · 0 评论 -
汉诺塔递归实现
*> 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后原创 2016-05-13 22:16:47 · 1169 阅读 · 1 评论 -
C语言单链表和双链表的创建和输出
本文将描述C语言实现单向链表和双向链表的创建、输出操作方法。单向链表 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点; 列表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向nuLL的指原创 2016-05-12 12:04:09 · 6825 阅读 · 0 评论 -
红黑树的插入与删除算法
一:旋转操作将几种情况之前先看一下旋转操作。1.rotate_left代码如下:void rb_tree::rotate_left(node_type* x) //x is the rotate point{ assert(x != nil_); node_type *y = x->right_; x->right_ = y->lef原创 2016-10-29 22:43:33 · 892 阅读 · 0 评论 -
顺序表的实现--C语言泛型编程
一:顺序表代码实现#ifndef _SEQ_LIST_H#define _SEQ_LIST_H#include #include #include #include #define ElemType float //以float类型测试算法通用性,而不是以惯用的int#define INIT_SIZE 10 //顺序表默认初始化大小原创 2016-08-21 20:48:20 · 1606 阅读 · 0 评论 -
完全二叉树统计节点个数【使用二分搜索】
【题目】给定一棵完全二叉树的根节点root,返回这棵树的节点个数。如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。给定树的根结点root,请返回树的大小。”打眼“一看,这是一道递归求解数的高度的题,于是我不到30秒敲了几行代码就解决:class CountNodes {public: int count(TreeNode* root) {原创 2016-12-16 02:29:27 · 4119 阅读 · 0 评论 -
UFSet并查集的定义与实现
上篇写到集合,干脆把并查集一块写了。一:什么是并查集并查集是一种用途广泛的集合,也称为disjoint set,它支持一下3中操作:1. Union(Root1, Root2):把子集合Root2并入到集合Root1中。要求Root1和Root2互不相交,否则执行合并。2.Find(x):搜索单元素x所在的集合,并返回该集合名字。3.UFSets(s):构造函数,将并查原创 2016-11-13 17:40:57 · 1599 阅读 · 0 评论 -
单源最短路径复习--Dijkstra算法和Floyd算法
昨天复习了一下单源最短路径问题,今天总结一下。解决单源最短路径问题,我们熟知的算法首先就是Dijkstra算法了。Dijkstra算法的核心就是贪心思想。我在以前的博客中也写过这个算法:图的拓扑排序、关键路径、最短路径算法 – C++实现,现在看以前的博客,我的代码思路还是很清晰的。Dijkstra算法可以求出某一点到其他所有点的最短路径,本文还将介绍一种可求出所有点对的最短路径的算法——Floyd原创 2017-02-09 12:06:32 · 1160 阅读 · 0 评论 -
AVL树插入删除算法详解(有图) -- C++语言实现
一:AVL树介绍AVL树本质上还是一棵二叉搜索树,它的特点是:1.本身首先是一棵二叉搜索树。2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。在本文中用分别用-1,0,1定义左边树高,等高,右边树高。平衡因子用m_bf表示。也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。二:插入算法由于AVL树具有BST树的原创 2016-08-14 21:42:44 · 12219 阅读 · 4 评论 -
求最大子序列长度及最大字段和 --动态规划法C++语言
证明我就不够出了,我参考了这位博主的博客点击打开链接,以及这是麻省理工算法导论关于该问题的讲解视频点击打开链接,我就是参看以上看明白的。以下代码目的仅为记录和分享,采用C++语言描述腾讯出的题目是这样的:一:递归描述:#include #include #include using namespace std;int max_csubstr(const string原创 2016-09-23 13:46:15 · 3313 阅读 · 0 评论 -
C++实现线索二叉树 -- 创建遍历查找等操作
本文代码为C++实现线索二叉树,文中所有代码均经过测试。#ifndef _THREAD_BIN_TREE_H#define _THREAD_BIN_TREE_H#include #include #include using namespace::std;typedef enum{LINK, THREAD}Tag;templateclass _Thread_Bin_Tre原创 2016-08-04 20:23:20 · 975 阅读 · 0 评论 -
C++森林转化为二叉树代码
#ifndef _TREE_H#define _TREE_H#include using namespace std;template class Tree;template class TreeNode{ friend class Tree;public: TreeNode() :m_data(T()), firstChild(NULL), nextSibling(NU原创 2016-08-06 14:30:19 · 6263 阅读 · 1 评论 -
图的深度优先搜索和广度优先搜索算法、最小生成树两种算法 --C++实现
一:通用图结构#ifndef _GRAPH_H#define _GRAPH_H#include #include #include #include using namespace::std;#define MAX_COST 0x7FFFFFFF //花费无限大设为整型最大值///////////////////////////////////////////////原创 2016-08-18 22:10:31 · 3775 阅读 · 1 评论 -
图的拓扑排序、关键路径、最短路径算法 -- C++实现
一:拓扑排序对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。拓扑排序就是要找到入度为0的顶点,并依次压栈。首先将栈顶顶点输出,删除以此顶原创 2016-08-20 14:11:21 · 7795 阅读 · 1 评论 -
C++实现堆、最大堆、最小堆 -- 堆排序插入删除操作
堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值。最大堆和最小堆是二叉堆的两种形式。最大堆:根结点的键值是所有堆结点键值中最大者。最小堆:根结点的键值是所有堆结点键值中最小者。而最大-最小堆集结了最大堆和最小堆的优点,这也是其名字的由来。最大-最小堆是最大层和最小层交替出现的二叉树,即最大层结点的儿子属于最小层,最小层结点的儿原创 2016-08-09 15:10:36 · 8453 阅读 · 0 评论 -
C++实现二叉排序树BSTree --插入删除摧毁查找等操作
一:二叉排序树定义二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树。二叉排序树是这样一棵树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;(4)没有键值相等的结点。二:删除算法(重点)原创 2016-08-11 18:02:02 · 2946 阅读 · 0 评论 -
单链表的逆置 --C语言泛型编程
本文章采用泛型算法实现了单链表的建立与逆置。代码如下:一:头文件#ifndef _LIST_H#define _LIST_H#include #include #include typedef struct list_node{ void *data; struct list_node *next;} node_type, *node原创 2016-09-22 15:56:07 · 803 阅读 · 0 评论 -
MD5算法--C++实现
函数说明:update函数:这是一个可重入的函数。每次调用传进去的字符串都会和之前的字符串链接。当然,第一次调用update时,之前的字符串长度为0。count[]数组内部保存了字符串长度的位数,所以每次用count[]数组计算时要注意byte与bit的转化。调用该函数时,首先会计算字符串长度,等于已有字符串长度加上新加字符串长度,然后判断总长度是否大于64,或者说判断新加的字符串有没有补原创 2016-11-01 13:48:34 · 3566 阅读 · 1 评论 -
跳表的实现插入删除搜索算法详解
跳表久闻其名,以前写过AVL树,红黑树,都是平衡结构。但是跳表呢,它不是树形结构,它是通过链表实现的。我们知道,在链表中查找一个元素的时间复杂度是O(n)。在一个有序链表中,我们如果在链表中部额外增加一个结点,那么查找某个元素的次数将会是 n/2+1 次。类似于二分查找。有了这个思想,那么现在就可以实行跳跃表了。先看图,有个印象,再解释。如图,每个结点都有一个指原创 2016-11-10 13:51:30 · 4600 阅读 · 0 评论 -
辗转相除法、埃拉托色尼筛选法、牛顿迭代法证明与C++实现
1.辗转相除法辗转相除法是用来计算两个数最大公约数的。对于m,n求最大公约数,公式为: gcd(m,n) = gcd(n, m mod n)证明: //最大公约数用e表示。对于m=n时,显然e = m = n: m>n时,有m = kn + m mod n令r = m mod n,则m = kn + r,若存在正整数d|n (|表示整除),且d|r,则必原创 2016-11-11 02:38:11 · 2960 阅读 · 0 评论 -
KMP算法详细解读
PS:自从学会了写伪代码,现在算法水平大大的提升了。KMP看了别人的博客看懂了,然后自己写一次性就AC了。KMP入门请参考这几位大神:http://www.cnblogs.com/yjiyjige/p/3263858.htmlhttp://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algor原创 2016-11-14 01:20:11 · 537 阅读 · 0 评论 -
SplayTree伸展树的实现
伸展树,久仰大名。以前知道天网的那个搜索引擎貌似就用了伸展树。今天特地来实现以下。伸展树介绍伸展树(Splay Tree)是特殊的二叉查找树,又叫自适应查找树。它有一项奇特的技能,它可以自调整,根据结点访问的情况自调整。伸展树当某个节点被访问时,伸展树会通过旋转使该节点成为树根。这样做的好处时时,下次要访问该结点时,能够迅速的访问到该结点。通常数据领域有个八二法则,%20的数据占据了%原创 2016-12-04 01:52:12 · 682 阅读 · 0 评论 -
归并排序递归及非递归实现(自然合并排序)
一:归并排序普通的归并排序递归实现比较简单,就不在此赘述,一看就懂。下面贴上代码。#include using namespace std;template void merge(T arr[], const int start, const int middle, const int end, const int size){原创 2016-09-29 19:07:10 · 4926 阅读 · 0 评论 -
线性时间排序--计数排序、基数排序、桶排序
之前总结的都是通过比较方法进行排序的算法,我们知道,通过比较排序算法平均时间复杂度最多为O(lgN)。这篇文章来分析一下非比较的线性时间排序方法,计数排序,基数排序,桶排序。一:计数排序正如它的名字,计数排序是通过计算待排序元素小于等于该元素的次数这个属性,然后利用该属性将元素以次数为下标挪入另外的数组,不能原地挪动,就得到了排序后的结果。代码如下:void cou原创 2016-12-06 01:38:46 · 489 阅读 · 0 评论 -
经典算法之棋盘覆盖问题 --分治法
一:算法分析棋盘覆盖问题要求在2^k * 2^k 个方格组成的棋盘中,你给定任意一个特殊点,用一种方案实现对除该特殊点的棋盘实现全覆盖。建立模型如图:解决方案就是利用分治法,将方形棋盘分成4部分,如果该特殊点在某一部分,我们就去递归他,如果不在某一部分,我们假设一个点为特殊点,同样递归下去,知道全覆盖。左上角的子棋盘(若不存在特殊方格):则将该子棋盘右下角的那个方格假设为特殊方原创 2016-09-29 11:44:51 · 35117 阅读 · 3 评论 -
全排列问题
一:全排列问题算法描述如下:举例: 345的全排列分别为 345 354 435 453 534 543, 可见将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。又举例:45的全排列有 45 54 可见将第一个数分别与后面的数交换后输出即为45的全排列。所以,对于一个很长一帮子的数,如123412414132,我们需要将1与后面所有的数交换原创 2016-09-28 20:26:03 · 604 阅读 · 0 评论 -
N皇后问题 --递归及回溯解决方案
一:介绍n 皇后等价于要求在一个 n*n 的棋盘上放置 n 个皇后,使得任何两个皇后都不能被放在同一行或同一列或同一斜线上。二:算法设计对于 n 后问题,我们用 n 元组 x[1:n] 表示它的解。其中 x[i] 表示皇后放在棋盘的第 i 行的第 x[i] 列。由于左上角到右下角的主对角线及其平行线上(斜率为-1),元素2个下标值的差(行号-列号)相等。同理,斜率为+1的斜线上,元原创 2016-09-28 17:34:52 · 2761 阅读 · 0 评论 -
Manacher算法总结
Manacher算法算法总结第三弹 manacher算法,前面讲了两个字符串相算法——kmp和拓展kmp,这次来还是来总结一个字符串算法,manacher算法,我习惯叫他 “马拉车”算法。相对于前面介绍的两个算法,Manacher算法的应用范围要狭窄得多,但是它的思想和拓展kmp算法有很多共通支出,所以在这里介绍一下。Manacher算法是查找一个字符串的最长回文子串的线性算法转载 2017-02-22 18:50:43 · 342 阅读 · 0 评论