
算法
huangyimo
这个作者很懒,什么都没留下…
展开
-
C++实现堆、最大堆、最小堆 -- 堆排序插入删除操作
堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值。最大堆和最小堆是二叉堆的两种形式。最大堆:根结点的键值是所有堆结点键值中最大者。最小堆:根结点的键值是所有堆结点键值中最小者。而最大-最小堆集结了最大堆和最小堆的优点,这也是其名字的由来。最大-最小堆是最大层和最小层交替出现的二叉树,即最大层结点的儿子属于最小层,最小层结点的儿子属于最大层。以最大...转载 2018-04-22 17:24:45 · 1147 阅读 · 0 评论 -
二叉搜索树(BST)的删除算法原理解析
二叉搜索树的删除算法主要分两种情况:1、要删除的节点只有一个孩子(左孩子或右孩子),这种情况比较简单,只需要将该孩子连接到当前节点的父节点即可。 下面重点讲讲第二种情况:2、第二种情况便是要删除的节点有两个孩子,这个时候的算法就比较复杂(相比较于只有一个孩子的情况)。首先我们需要找到待删除节点的左子树上的最大值节点,或者右子树上的最小值节点,然后将该节点的参数值与待删除的节点参数值...转载 2018-07-21 17:48:09 · 2178 阅读 · 0 评论 -
处理海量数据的高级排序之——希尔排序(C++)
常见排序算法一般按平均时间复杂度分为两类:O(n^2):冒泡排序、选择排序、插入排序O(nlogn):归并排序、快速排序、堆排序简单排序时间复杂度一般为O(n^2),如冒泡排序、选择排序、插入排序等高级排序时间复杂度一般为O(nlogn),如归并排序、快速排序、堆排序。两类算法随着排序集合越大,效率差异越大,在数量规模1W以内的排...转载 2018-04-21 15:59:24 · 489 阅读 · 0 评论 -
八大排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分...转载 2017-10-29 16:10:50 · 403 阅读 · 0 评论 -
归并排序
归并排序的原理如下。递归的将数组两两分开直到最多包含两个元素,然后将数组排序合并,最终合并为排序好的数组。假设我有一组数组 [3, 1, 2, 8, 9, 7, 6],中间数索引是 3,先排序数组 [3, 1, 2, 8] 。在这个左边数组上,继续拆分直到变成数组包含两个元素(如果数组长度是奇数的话,会有一个拆分数组只包含一个元素)。然后排序数组 [3, 1] 和 [2, 8] ,然后再排序数组 ...转载 2018-08-06 21:01:24 · 145 阅读 · 0 评论 -
链接法(chaining)构建散列表(hash table)(C++实现)
散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过把键值通过一个函数的计算,映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。========================================================================...转载 2017-04-18 17:20:04 · 765 阅读 · 0 评论 -
彻底搞懂红黑树(一)
红黑树和c++ 虚拟继承内存分布 几乎成了我的死敌,因为完全没用过,所以导致每次看懂了之后都忘了(也许不是真的看懂了,有些关键性的东西没理解透),这次准备把这两个难题(其实也不难)仔细看懂,然后再写一份比较详细的文档作为备忘。 首先是红黑树零 八卦起源 1972年,鲁道夫贝尔最先发明,但是他称之为“对称二叉B树”,真正的称之为“红黑树”是在1978年Leo J. Gu...转载 2018-08-12 21:41:52 · 5117 阅读 · 7 评论 -
深入理解红黑树
第一篇:教你透彻了解红黑树:http://blog.youkuaiyun.com/v_JULY_v/archive/2010/12/29/6105630.aspx第二篇:红黑树算法的层层剖析与逐步实现http://blog.youkuaiyun.com/v_JULY_v/archive/2010/12/31/6109153.aspx第三篇:教你彻底实现红黑树:红黑树的c源码实现与剖析http://blog.csdn....转载 2018-08-12 21:44:11 · 875 阅读 · 0 评论 -
浅谈数据结构-二叉树
二叉树是树的特殊一种,具有如下特点:1、每个结点最多有两颗子树,结点的度最大为2。2、左子树和右子树是有顺序的,次序不能颠倒。3、即使某结点只有一个子树,也要区分左右子树。一、特殊的二叉树及特点 1、斜树所有的结点都只有左子树(左斜树),或者只有右子树(右斜树)。这就是斜树,应用较少2、满二叉树所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样就是...转载 2018-08-13 13:23:19 · 565 阅读 · 0 评论 -
最小/大堆的操作及堆排序
摘自:《啊哈算法》我们要用1, 2, 5, 12, 7, 17, 25, 19, 36, 99, 22, 28, 46, 92来建立最小堆,并且删除最小的数,并增加一个数23如何建立这个堆://建堆n = 0;for (int i = 1; i <= m; i++) { n++; h[n] = a[n]; shiftup(n);}我们还有更快的...转载 2018-08-08 20:37:54 · 400 阅读 · 0 评论 -
彻底搞懂红黑树(三)
从红黑树上删除一个节点,可以先用普通二叉搜索树的方法,将节点从红黑树上删除掉,然后再将被破坏的红黑性质进行恢复。 我们回忆一下普通二叉树的节点删除方法:Z指向需要删除的节点,Y指向实质结构上被删除的结点,如果Z节点只有一个子节点或没有子节点,那么Y就是指向Z指向的节点。如果Z节点有两个子节点,那么Y指向Z节点的后继节点(其实前趋也是一样的),而Z的后继节点绝对不可能有左子树。因此,仅...转载 2018-08-20 20:42:43 · 1316 阅读 · 1 评论 -
红黑树(RB-tree)比AVL树的优势在哪?
今天看了STL源码剖析中关于红黑树的原理和实现,看完复杂的节点插入、节点颜色变换后不禁想:这些功能经典的AVL树也能实现,为什么要提出红黑树?查了些资料,并且加上自己理解,感叹红黑树的巧妙。首先红黑树是不符合AVL树的平衡条件的,即每个节点的左子树和右子树的高度最多差1的二叉查找树。但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决...转载 2018-08-20 21:18:04 · 144 阅读 · 0 评论 -
二叉查找树和二叉堆
A. 二叉查找树(Binary Search Tree),又称为有序二叉树,排序二叉树,满足以下性质:1)没有键值相等的节点。2)若左子树不为空,左子树上节点值均小于根节点的值。3)若右子树不为空,右子树上节点值均大于根节点的值。 二叉查找树中对于目标节点的查找过程类似与有序数组的二分查找,并且查找次数不会超过树的深度。设节点数目为n,树的深度为h,假设树的每层都被塞满(第L层有...转载 2018-08-20 21:33:02 · 1015 阅读 · 0 评论 -
用实例给新手讲解RSA加密算法
SA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助。 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest...转载 2018-10-09 11:28:29 · 559 阅读 · 1 评论 -
【排序算法】插入排序(C++实现)
插入排序的基本思想是每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。常见的插入排序有插入排序(Insertion Sort),希尔排序(Shell Sort),二叉查找树排序(Tree Sort),图书馆排序(Library Sort),Patience排序(Patience Sort)。下面介绍前两种:(一)直接插入排序最差时间复杂度:O...转载 2018-07-02 19:52:22 · 11344 阅读 · 1 评论 -
红黑树(四)之 C++的实现
红黑树的介绍红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。除了具备该特性之外,红黑树还包括许多额外的信息。红黑树的每个节点上都有存储位表示节点的颜色,颜色是红(Red)或黑(Black)。红黑树的特性:(1) 每个节点或者是黑色,或者...转载 2018-06-07 21:35:36 · 205 阅读 · 0 评论 -
红黑树(一)之 原理和算法详细介绍
R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。红黑树的特性:(1)每个节点或者是黑色,或者是红色。(2)根节点是黑色。(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!](4)如果一个节点是...转载 2018-06-07 21:29:21 · 170 阅读 · 0 评论 -
c++实现最大堆和最小堆
注释部分已经说明如何建立最大堆template<class T>class MinHeap{public: MinHeap() { _maxSize = 0; _index = -1; _minHeap = NULL; } MinHeap(int maxsize) { _maxSize = maxsize; _index = -1; _...原创 2018-04-23 11:25:30 · 2528 阅读 · 0 评论 -
归并排序的C++实现
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将...转载 2018-04-23 21:38:13 · 151 阅读 · 0 评论 -
C++类实现二叉树的构建和遍历、深度
二叉树原创 2018-03-03 15:47:57 · 495 阅读 · 0 评论 -
常用负载均衡算法
在服务器集群中,为了避免某一台服务器因过载而崩溃,除了每台服务器限定了最大连接数外,还对服务器的负载进行了均分。本文介绍了几个常见的负载均衡算法。随机通过随机数生成算法从服务器组中选取一个,然后把请求发送给它。轮询所有的服务器组成一个队列,不管连接数、响应时间,从队列首取出一个,然后放到队尾,不断循环。最终把所有的请求平均分给所有的服务器。适用于服务器性能差异不大的情况。加权轮询给每台服务器加一个...转载 2018-03-03 14:10:17 · 346 阅读 · 0 评论 -
二叉查找树 C++实现(含完整代码)
一般二叉树的查找是通过遍历整棵二叉树实现,效率较低。二叉查找树是一种特殊的二叉树,可以提高查找的效率。二叉查找树又称为二叉排序树或二叉搜索树。 二叉查找树的定义 二叉排序树(Binary Search Tree)又称二叉排序树(Binary Sort Tree),或者是一颗空二叉树,或者是具有一下特性的二叉树: 若它的左子树不为空,则左子树上的所有结点的值均小于根节点的值...转载 2018-03-03 18:43:24 · 5129 阅读 · 1 评论 -
AVL树之 C++的实现
AVL树的介绍AVL树是高度平衡的而二叉树。它的特点是:AVL树中任何节点的两个子树的高度最大差别为1。 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1;而右边的不是AVL树,因为7的两颗子树的高度相差为2(以2为根节点的树的高度是3,而以8为根节点的树的高度是1)。 AVL树的C++实现1. 节点1.1 AVL树节点template <class T>...转载 2018-03-04 19:05:04 · 556 阅读 · 0 评论 -
AVL树详解
AVL树定义:AVL树又称为高度平衡的二叉搜索树。它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。AVL树性质:左子树和右子树的高度之差的绝对值不超过1树中的每个左子树和右子树都是AVL树每个节点都有一个平衡因子(balance factor--bf),任一节点的平衡因子是-1,0,1。(每个节点的平衡因子等于右子树的高度减去左子树的高度 ) AVL树效率:一棵AVL树有...转载 2018-03-06 16:54:19 · 426 阅读 · 0 评论 -
树的孩子兄弟表示法及遍历操作
/* @孩子兄弟表示法建立的一般树*/#include<iostream>#include <cstdio>#include <cstdlib>#include <cstring>#define OK 1#define ERROR 0#define FALSE 0#define TRUE 1#define OVERFLOW -...转载 2018-04-16 22:00:17 · 4881 阅读 · 0 评论 -
【c++】二叉树的线索化
什么是二叉树的线索化?或者问什么是线索二叉树?按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列。在改序列中,除第一个结点外每个结点有且仅有一个直接前驱结点;除最后一个结点外每一个结点有且仅有一个直接后继结点。这些指向直接前驱结点和指向直接后续结点的指针被称为线索(Thread),加了线索的二叉树称为线索二叉树。以上是搜狗百科的一段文字,反正我是没看太懂。简单点,以我的理解...转载 2018-04-17 11:11:19 · 189 阅读 · 0 评论 -
二叉搜索树之前驱后继
什么是二叉搜索树想必对二叉树都有了解,那么什么是二叉搜索树呢? 首先给出每个节点的属性: 1)keykey 关键字 2)pp 父亲节点 3)leftleft 左孩子 4)rightright 右孩子 其定义如下: 对于任何的节点xx,其左子树的关键字最大不超过x.keyx.key,其右子树的关键字最小不小于x.keyx.key。 下面的所有性质都是围绕该定义展开的。 方法: 1)遍历搜索二叉树:同...转载 2018-04-17 15:52:17 · 1302 阅读 · 1 评论 -
红黑树之 C++的实现
红黑树的介绍红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。除了具备该特性之外,红黑树还包括许多额外的信息。红黑树的每个节点上都有存储位表示节点的颜色,颜色是红(Red)或黑(Black)。红黑树的特性:(1) 每个节点或者是黑色,或者...转载 2018-04-17 20:42:01 · 271 阅读 · 0 评论 -
算法导论 13-3 AVL平衡二叉树
题目 AVL树的主要操作 在本篇博客中我们只实现AVL平衡树的insert、erase、edit和locate以及两个遍历操作,当然还包括一些配套函数,主要论述insert和erase操作,其他诸如successor、minimum等等操作可以参考二叉查找树和红黑树,实现很类似,并没有太大不同。 此外,这些操作我将全部用递归实现,所以和上述两种树以及treap(树堆)节点有所不同,不再...转载 2018-06-07 14:35:36 · 484 阅读 · 0 评论 -
算法导论 第12章 二叉查找树
二叉查找树的概念和性质 二叉查找树(Binary Search Tree)是这样的一棵树:设节点x的左右孩子分别为y,z,那么key[x] <= key[z]且key[x] >= key[x],而它的以y和z分别为根的左右子树也是满足这样条件的二叉树。 二叉查找树支持多种动态集合操作,包括locate,minimum,maximum,predecessor,su...转载 2018-06-07 16:10:06 · 162 阅读 · 0 评论 -
RC4加密解密算法
RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码。RC4是流密码streamcipher中的一种,为序列密码。RC4加密算法是Ron Rivest在1987年设计出的密钥长度可变的加密算法簇。起初该算法是商业机密,直到1994年,它才公诸于众。由于RC4具有算法简单,运算速度快,软硬件实现都十分容易等优点...转载 2018-10-09 12:08:59 · 28642 阅读 · 0 评论