
数据结构
文章平均质量分 64
杨龙飞的博客
让人迷茫的原因只有一个
__ 那就是本该拼博的年纪,却想得太多,做的太少!
展开
-
图之Kruskal算法实现-----最小生成树
算法思想:把n个顶点看成n棵分离的树(每棵树只有一个顶点),每次选取可连接两个分离树中权值最小的边,把两个分离的树合并成一个新的树取代原来的两个分离树,重复n-1步后得到最小生成树.1.myedge结构体数组存放所有的边及其权值,mytree结构体数组中存放生成的最小生成树的边,vex数组中存放该节点的父节点,初始值为都为0,代表每个节点的父节点都是本身.2遍历图将边存放在myedge结构体数组中,原创 2015-12-09 21:26:33 · 631 阅读 · 0 评论 -
常见排序算法总结
前言本文将介绍常见的9种排序算法,围绕下面几个问题讨论每一种排序算法:这个算法的思想是什么?这个算法的稳定性怎样?时间复杂度是多少?在什么情况下,算法出现最好情况or最坏情况?这个算法的具体实现?以下排序算法都以从小到大排序 1.冒泡排序(交换排序)1.1算法思想:排序每次对相邻的两个元素比较,如果它们的相对排列次序与所希望的不符,便交换它们的次序,这样,各元素就会像水中冒气泡一样通过交换原创 2017-02-08 12:46:38 · 671 阅读 · 0 评论 -
浅谈AVL树,红黑树,B树,B+树原理及应用
背景:这几天在看《高性能Mysql》,在看到创建高性能的索引,书上说mysql的存储引擎InnoDB采用的索引类型是B+Tree,那么,大家有没有产生这样一个疑问,对于数据索引,为什么要使用B+Tree这种数据结构,和其它树相比,它能体现的优点在哪里? 看完这篇文章你就会了解到这些数据结构的原理以及它们各自的应用场景. 二叉查找树简介二叉查找树也称为有序二叉查找树,满足二叉查原创 2016-07-18 09:36:32 · 32902 阅读 · 5 评论 -
会场安排问题
一.贪心算法1问题描述假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场.设计一个有效的贪心算法进行安排(这个问题实际上是著名的图着色问题,若将每一个活动作为图的一个顶点,不相容活动间用边相连,使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数) .算法思想把所有活动的开始时间和结束时间按从小到大的顺序排列,依次遍历,当遇到开始时间时,count++,当遇到结束时间时,count–原创 2016-05-04 21:56:21 · 1616 阅读 · 0 评论 -
动态规划之矩阵连乘
矩阵连乘问题—–动态规划算法思想:给定n个矩阵{A1,A2,……..An},相连的两个矩阵满足矩阵连成的的条件,计算矩阵连乘乘积的计算次序,使得依此次序计算矩阵连乘需要的数乘的次数最少. 找出最优解的性质,刻画其特征结构 对于矩阵连乘问题,最优解就是找到一种计算顺序,使得计算次数最少. 设m[i][j]为从第i个矩阵到第j个矩阵相乘的最优解(记为A[i:j). 假设这个最优解是从第k原创 2016-03-28 23:16:43 · 769 阅读 · 0 评论 -
顺序栈,链栈,多栈运算
1.栈1.栈的定义:栈作为一种限定性的线性表,是将线性表的插入和删除运算限制为仅在表的一端进行,通常将表中允许进行插入.删除操作的一端称为栈顶,因此栈顶的当前位置是动态变化的,它是由一个称为栈顶指针的位置指示器指示,同时标的另一端称为栈底,当栈中没有元素时称为空栈,栈的插入操作被形象的称为进栈或入栈. ADT stack 数据元素:可以是任意类型的数据,但必须属于同一个数据对象. 结论关系原创 2016-03-14 10:00:42 · 703 阅读 · 0 评论 -
通过先序和中序或后序和中序画出二叉树
1.通过先序和中序得出二叉树先序:EBADCFHGIKJ中序:ABCDEFGHIJK基本思路:(递归)1.从先序中找第一个节点,在中序中找到该节点,把树分为了左右子树.2.在从先序中找到第二个点,把左子树又分为左右两个子树.一直划分,直到中序中的点全部被分为单个节点时,树也就画出来了。原创 2016-03-13 08:59:22 · 5247 阅读 · 1 评论 -
非递归创建二叉树
虽然我们能用递归创建二叉树,但是我们是否真正的理解真正的递归过程呢,其实,递归函数的内部还是挺复杂的,想真正弄明白递归也是要下一番功夫的,虽然说,递归算法有效的减少了某些问题的编程,但是它只能简化程序编码,却不能降低程序的时间和空间复杂度,相反,由于执行过程依赖函数或过程的重复调用,会增加函数的时间复杂度.而且返回函数的地址保存需要占用系统栈,从而增加的空间的复杂度。下面是我用栈实现了二叉树的非递原创 2016-03-13 08:57:21 · 2179 阅读 · 2 评论 -
图的dfs递归(非递归)遍历和bfs遍历(邻接表)
1.深度优先遍历是连通图的一种遍历策略.其基本思想如下:设x是当前被访问的顶点,在对x做过访问的标记之后,选择一条从x出发的未检测过的边(x,y),若发现顶点y已经访问过了,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过,然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择原创 2016-03-12 00:20:44 · 2814 阅读 · 0 评论 -
KMP算法
首先,要了解两个概念:'前缀'和'后缀'."前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符的全部尾部组合.而在这里next[j]的值就是"前缀"和后缀的最长的共有元素的长度,在这里以"ABAABCAC"next[0]:j=0,"A"的前缀和后缀都为空集,共有的元素的长度为0;next[1]:j=1"AB"的前缀为[A],后缀为[B],原创 2016-03-12 00:23:51 · 416 阅读 · 0 评论 -
二叉排序树的建立、查找和删除
1.二叉排序树的概念:二叉排序树是一种动态树表.二叉排序树的定义:二叉排序树或者是一颗空树,或者是一颗具有如下性质的二叉树:若它的左子树非空,则左子树上的所有的节点的值均小于根节点的值.若它的右子树非空, 则右子树上的所有节点的值均大于根节点的值.左右子树本身又各是一颗二叉排序树,二叉排序树的性质:按中序遍历二叉排序树,得到的中序遍历是一个递增有序序列.原创 2016-03-12 00:13:44 · 1942 阅读 · 0 评论 -
如何不使用任何判断"if","switch"等来得到两个数之间较大的数
今天在网上看到一道题,听说是某公司招实习生时的面试题,挺有意思的,按照一般人的思维模式,有比较就一定得有判断啊,对,刚开始我也是这样想的,这道题主要想考的是你对负数在计算机中是如何存储的,以及对算术位移和逻辑位移的理解和灵活运用:其实方法很简单,就是相减后看符号位,将减的结果的符号右移移到未尾(最低位),转换为无符号数作为数组的下标:先看代码吧!#includeusing names原创 2016-03-12 00:08:48 · 1217 阅读 · 0 评论 -
求最大字段和问题(常规法,分治法,动态规划法)
算法设计与分析-----求最大字段和问题 问题描述:给定由n个整数组成的序列(a1,a2,a3......,an),求该序列的子段的最大值.常规法:从a1开始,求出以a1开头的子序列最大的和为sum,依次从a2开始,在sum等于以a1开头的基础上,与以a2开头的不同长度的子序列进行比较,取最大值,然后依次从a3,a4......an开头,最后得到最大子序列的和;原创 2016-03-12 00:03:05 · 3220 阅读 · 0 评论 -
求两个有序数组的中位数
问题描述有两个排序的数组,长度都为n,求合并后的排序数组的中位数. 直接遍历法,时间复杂度为O(n)算法思想: 因为两个数组的长度都为n,那么合并后的中位数一定有两个,那么,我们只要在两个数组合并后的数组中找到找到第n个和第n-1个元素加起来除2就能得到其中位数。 (当然,我们不会真正的去合并两个数组). #include<iostream>#include<iomanip>using原创 2016-03-21 20:16:39 · 576 阅读 · 0 评论 -
递归归并排序和非递归归并排序(自然分组)
递归合并排序算法思想:将待排序的集合一分为二,直到排序集合就剩下一个元素为止,然后不断的合并两个排好序的数组。 #include<iostream>#include<cstdlib>#include<random>#include<sys/timeb.h>#include<ctime>#define N 200000using namespace std;int merge(int原创 2016-03-21 19:02:48 · 2267 阅读 · 0 评论 -
最长递增子序列求解
算法难,难于上青天!!!!! 搞懂一个算法不容易,还是写篇博客为以后复习做好准备!!!! 动态规划算法O(n^2)设A[i]表示序列中第i个数,dp[i]表示从0到i这一段中以i结尾的最长上升子序列的长度,初始化dp[i]=1;(i=0,1,2…(len(A)-1).则有动态方程为: dp[i]=max{dp[i],dp[j]+1}(j=0,1,2,….i-1,且A[j] < A[i]);原创 2016-03-30 16:29:38 · 730 阅读 · 1 评论 -
图之Prime算法(邻接表)实现----最小生成树
1.prime算法思想:(只与顶点有关)prime算法求最小生成树时,和边数无关,只和顶点的数量有关,时间复杂度是O(n^2),所以呢,适合于求稠密网的最小生成树;将一个图的顶点分为两部分,一部分是最小生成树的集合,这里就记为(A集合),另一部分是未处理的顶点集合.首先,选择一个节点,将这个节点加入A集合,然后,对集合A中的顶点遍历,找出A中顶点关联的边权值最小的点加入A集合。不断重复第二步,直原创 2015-12-09 21:24:44 · 3492 阅读 · 0 评论 -
哈希表
什么是哈希表1.哈希表又称为散列表,是根据关键码值(Key value)而直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表。 记录的存储位置=f(关键字) f是散列函数 这里的对应关系f称为散列函数,又称为哈希(Hash函数), 采用散列技术将记录存储在一块连续的存储空间,这块连续的存储空间称原创 2017-02-10 21:07:12 · 957 阅读 · 0 评论