算法
麻子来了
这个作者很懒,什么都没留下…
展开
-
动态规划之线性动归
线性规划是一类问题。目标函数为特定变量的线性函数,约束是这些变量的线性不等式(standard form)或等式(slack form),目的是求目标函数的最大值或最小值。这类动态规划是平时比较常见的一类动态规划问题。一、钢条切割问题:假设公司出售一段长度为i英寸的钢条的价格为Pi(i = 1, 2, …单位:美元),下面给出了价格表样例:长度i原创 2016-07-08 11:17:56 · 7344 阅读 · 3 评论 -
数据结构之红黑树
一、红黑树性质:红黑树是具有以下性质的二叉查找树(左小右大):1.每一个节点或者是红色或者是黑色2.根是黑色3.如果一个节点是红的,那么它的子节点必须的黑的4.从一个节点到一个NULL指针的每一条路径必须包含相同数目的黑色节点。红黑树的高度最多是2log(N+1),平均红黑树的深度和AVL树一样,(所以查找时间一般接近最优)红黑树的优点是执行插入操作所需要的开销原创 2017-05-05 20:56:27 · 382 阅读 · 0 评论 -
数据结构–基本树
目录1、树的基本概念2、二叉树3、二叉查找树(由于没有时间对自己搭建的博客进行维护,所以将之前的文章全部搬过来,以便自己以后复习的时候可以用到) 树的基本概念:节点的度:一个节点含有的子树的个数称为该节点的度;树叶节点:度为0的节点称为树叶节点;树的深度:对任意节点ni ,ni的深度为从根到ni的唯一路径长。根的深度为0。原创 2017-06-10 20:13:31 · 314 阅读 · 0 评论 -
数据结构–伸展树
引言:假设想要对一个二叉查找树执行一系列的查找操作。为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法,在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。伸展树应运而生。(由于没有时间对自己搭建的博客进行维护,所以将自己之前的博客全部搬过来,备忘)概念:【伸展树】:保证从空树开始任意连续M次对树的操作原创 2017-06-10 20:17:16 · 346 阅读 · 0 评论 -
常用排序算法之快速排序
快速排序:快速排序也是一种分治的递归算法。快速排序算法基本思想:取数组S中任一元素v,作为枢纽元。用枢纽元将S中的元素分成俩部分,对这两部分分别再次进行快速排序。当S中元素个数是0或1时,则返回。因为快速排序要根据枢纽元将元素分成俩部分,因此,枢纽元的选取对程序的时间复杂度是有影响的。一般的枢纽元选取策略是取左端、右端和中间位置上的三个元素的中值作为枢纽元。原创 2017-05-05 20:40:26 · 274 阅读 · 0 评论 -
常用排序算法之归并排序
归并排序基本思想:取两个输入数组A和B,一个输出数组C,以及三个计数器Aptr,Bptr,Cptr,计数器开始都被置于对应数组的开始端。A[Aptr]和B[Bptr]中的较小者被拷贝到C中的下一个位置,相关的计数器向前推进一步。当A和B俩个表中有一个用完时,则将另一个表中剩下的部分拷贝到C中。归并排序是递归算法的很好的实例,也是经典的分治策略。将问题分解为一些较小的问题原创 2017-05-05 20:38:33 · 322 阅读 · 0 评论 -
常用排序算法之堆排序
堆排序基本思想:要进行堆排序,首先要建立N个元素的二叉堆,建立好二叉堆后,我们执行N次DeleteMin操作。按照顺序,最小的元素最先离开该堆,通过将这些元素记录到第二个数组然后再将数组拷贝回来,即可得到N个元素的排序。涉及到堆,就一定要保持堆的性质:(结构性质、堆序性质)结构性质:堆是一颗被完全填满的二叉树,有可能的例外是在底层,底层上的元素从左到右填入。这样原创 2017-05-05 20:37:16 · 725 阅读 · 0 评论 -
常用排序算法之简单选择排序
简单选择排序:基本思想:在要排序的一组数中,选出最小的一个数与第1个位置的数交换;然后在剩下的数当中再找最小的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。程序实现:#includeusing namespace std;void print(int a[], int n ,int i)原创 2017-05-05 20:35:47 · 455 阅读 · 0 评论 -
数据结构-AVL树
AVL树【概念】1、AVL树性质:是带有平衡条件(这个平衡条件必须容易保持,必须保证树的平均深度为O(logN))的二叉查找树。 一颗AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。(空树的高度定义为-1) 插入一个节点可能会破坏AVL树的特性。如果发生这种情况,那么就要把性质恢复后才认为这一步插入完成。2、旋原创 2016-07-08 11:21:57 · 410 阅读 · 0 评论 -
单链表排序(代码详解)
struct Student{float stuScore;Student *pNext;};void SortList(Student* HEAD){Student*p, *prep, *temp, *tail;//temp是中间变量,tail判断第一层循环结束的条件,prep是待交换指针的前一个指针,p是待交换指针tail = NULL;原创 2017-05-05 20:20:07 · 1430 阅读 · 0 评论 -
常用排序算法之基数排序
#include"vld.h"//检测是否有内存泄漏#includeusing namespace std;struct MyInt{int val;MyInt *next=NULL;};struct MyBase{MyInt *head = NULL;MyInt *tail = NULL;};//每轮排好一位数后,将排好序的数放入另一个桶中,如果两个数排序位都为0,则都链接在base[0]后My原创 2017-05-18 21:45:52 · 314 阅读 · 0 评论 -
常用排序算法之冒泡排序
冒泡排序:基本思想:在要排序的一组数中,对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。就像水中轻的气泡冒出来,重的物体沉下去一样。程序实现:#includeusing namespace std;void print(int a[], int n){ for(int j= 0; jn; j++) { c原创 2017-05-05 20:42:42 · 248 阅读 · 0 评论 -
常用排序算法之插入排序
插入排序基本思想: 假设一共有N个数。插入排序是:当将第P个元素进行插入时,从位置0到位置P-1上的元素是已经排过序的(这也是插入排序的名字由来)。我们只需要比较位置P上的元素与位置0到位置P-1上的所有元素的值,将第P个元素放到适当位置即可。当然,P是从1开始的(但是数组下标从零开始)。如下表是插入排序示例:原理分析:第一次P=1,原创 2017-05-05 20:32:31 · 289 阅读 · 0 评论 -
常用排序算法之希尔排序
希尔排序希尔排序并不能见名知意,因为希尔排序的名称起源于它的发明者Donald Shell。基本思想: 希尔排序是每次比较相邻一定间隔的元素(而每次需要相邻多少个元素进行比较,是由一个增量序列来决定的。因此,希尔排序有时也叫做缩小增量排序),直到只比较相邻元素的最后一趟排序为止。因此使用希尔排序时,每趟排序先将所有元素按某个增量d分成若干组子序列,对每个子序列进原创 2017-05-05 20:34:30 · 443 阅读 · 0 评论 -
动态规划之01背包问题
0-1背包问题一、问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为j。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?(对于一种物品,要么装入背包,要么不装。所以对于一种物品的装入状态可以取0和1,此问题称为0-1背包问题。)有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在原创 2016-07-08 15:37:05 · 3673 阅读 · 1 评论