data structure
zhanyue666
这个作者很懒,什么都没留下…
展开
-
汉诺塔问题和其时间复杂度
数据结构课老师留的第一道作业题首先来看一下什么是汉诺塔问题汉诺塔问题:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。(摘自百度百科)所以我们假设...原创 2018-10-12 09:35:13 · 12908 阅读 · 1 评论 -
栈的排序(c++)
题目要求如下:试设计算法,将栈S中的元素排序。要求不用辅助数据结构,仅通过对S自身的操作完成S中元素的排序。实现思路如下:借鉴冒泡排序的思路利用递归实现栈的排序,空间复杂度为O(1)代码如下:#include"pch.h"#include<iostream>#include<stack>#include<cstdlib>#inclu...原创 2018-10-21 22:25:15 · 1760 阅读 · 0 评论 -
kmp算法的c++实现
推荐先在B站搜索KMP看一个印度小哥讲解的视频:首先简介kmp算法: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模...原创 2018-10-31 09:25:01 · 4638 阅读 · 0 评论 -
最长公共子序列(c++实现)
问题:给定两个长度分别为m,n的字符串,求他们的最长公共子序列,要求时间复杂度为O(m+n)。解决思路:声明两个二维数组,cArray[i][j]代表在此位置时两个字符串已经存在了多少公共字符,sArray[i][j]用于回溯找到最长公共子序列。代码实现:#include"pch.h"#include<iostream>#include<string>...原创 2018-10-31 16:42:27 · 9501 阅读 · 0 评论 -
最长公共子序列的长度(递归解法)(c++实现)
问题:求两个给定的字符串的最长公共子序列的长度。思路:可以从两个字符串的末尾开始寻找,如果两个对应的字符相等,分别对两个字符串的倒数一位进行同样的操作。如果不相等,一个字符串退一位,另一个字符串不变,求这两种情况的·最大值。递归的边界是是否到达了字符串的开头,如果是的话,再次比较是否相等,相等的话返回1,不相等的话返回0。代码实现:#include"pch.h"#include...原创 2018-10-31 17:01:16 · 2057 阅读 · 4 评论 -
单链表的应用
// 单链表的应用.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include "pch.h"#include <iostream>using namespace std;class ListNode {public: int data; ListNode* next; ListNode() { data = 0; n...原创 2018-11-03 17:58:42 · 163 阅读 · 0 评论 -
二叉树的三种遍历的实现(c++)
void PreOrder(BiTree T)//先序递归遍历{ if(T!=NULL) { cout<<T->data<<" "; PreOrder(T->lchild); PreOrder(T->rchild); }}void SqlPreOrder(BiTree T)//...转载 2018-11-07 17:43:28 · 702 阅读 · 0 评论 -
并查集(c++)
并查集简介:在一些应用问题中,需要将n个不同的元素划分为一组不相交的集合,在划分过程中需要反复查询某个元素归属于哪个集合。并查集就是一种适合于描述这类问题的抽象数据类型。并查集主要支持的操作: 1. merge(Root1, Root2) //并操作; 2. get (x) //搜索操作; 3. UFS (s) //构造函数。一般情形,并查集主要涉及两种数据类型:集合名类型和...原创 2018-12-05 17:07:32 · 1254 阅读 · 0 评论 -
图的深度优先遍历和广度优先遍历(c++实现)
二者的时间复杂度和空间复杂度均相同,不同的是,广度优先遍历更像是树的层次遍历,而深度优先遍历更像是树的前序遍历。下面是实现的代码:// BFS.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include "pch.h"#include <iostream>#include<vector>#include<queu...原创 2018-12-05 20:28:47 · 8674 阅读 · 1 评论 -
prim算法的实现(c++)
视频讲解传送门:https://www.bilibili.com/video/av33533137/?p=24算法简介:1).输入:一个加权连通图,其中顶点集合为V,边集合为E;2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;3).重复下列操作,直到Vnew = V:a.在集合E中选取权值最小的边<u, v>,其中...原创 2018-12-05 20:44:05 · 514 阅读 · 0 评论 -
克鲁斯卡尔算法的实现(寻找最小生成树)
视频讲解传送门:https://www.bilibili.com/video/av33533137/?p=23克鲁斯卡尔算法和prim算法均为解决最小生成树问题的算法,算法简介如下:先构造一个只含 n 个顶点、而边集为空的子图,把子图中各个顶点看成各棵树上的根结点,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,即把两棵树合成一棵树,反之,...原创 2018-12-05 20:47:39 · 273 阅读 · 0 评论 -
迪杰斯特拉算法的实现(c++)
迪杰斯特拉算法是一种用于求解最短路径的算法,关键在于每一次循环均能确定下一个永久标号点,从而方便求解最短路径。教程传送门:https://www.bilibili.com/video/av33533137/?p=23按路径长度递增次序产生算法:把顶点集合V分成两组:(1)S:已求出的顶点的集合(初始时只含有源点V0)(2)V-S=T:尚未确定的顶点集合将T中顶点按递增的次序...原创 2018-12-05 20:51:24 · 1472 阅读 · 0 评论 -
弗洛伊德算法的实现(c++)
视频教程传送门:https://www.bilibili.com/video/av33533137/?p=23弗洛伊德算法也是一种寻找最短路径的算法,算法核心思路如下:路径矩阵通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 [3] 从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(...原创 2018-12-05 20:54:58 · 1977 阅读 · 1 评论 -
关键路径的实现(AOE)(c++实现)
https://blog.csdn.net/xufeiayang/article/details/78568338转载 2018-12-05 21:31:36 · 1019 阅读 · 1 评论 -
逆转栈(c++)
题目要求如下:现有栈S,试设计算法,将S中的元素逆置。要求不用辅助数据结构,仅通过对S自身的操作完成S中元素的逆置。代码如下:#include"pch.h"#include<iostream>#include<stack>#include<cstdlib>#include<ctime>using namespace std;...原创 2018-10-21 22:01:40 · 1128 阅读 · 0 评论 -
判断序列是否是弹出序列(c++实现)
题目要求如下:若入栈元素属于任意符号集合S,入栈序列是S中集合元素的一个排列C。试设计算法,判定S的另一个不同于C的排列,是否可能是一个对应于S的出栈序列。实现思路:构造一个辅助栈,在一系列操作结束后,如果该辅助栈非空,则不是有效序列。代码:#include"pch.h"#include<iostream>#include<stack>#incl...原创 2018-10-21 15:47:56 · 219 阅读 · 0 评论 -
快速排序(c++实现)
partaion函数用于找到分节点,然后利用分治的想法将数组排序。#include"pch.h"#include<iostream>#include<cstdlib>#include<ctime>using namespace std;int partaion(int a[], int start, int end){ int label ...原创 2018-10-21 15:06:33 · 1184 阅读 · 0 评论 -
n位二进制数加一的时间复杂度
这是数据结构老师布置的第二道作业题,题目要求如下:下列算法完成对一个n位二进制数加1的操作(假如无溢出)。显然,该算法在最坏情况下的时间复杂度为O(n),试问平均情况下的时间复杂度是什么?请用数学推导或实验验证的方式证明你的结论。void Inc(int A[]) { int i; i=n-1; while (A[i]==1) { A[i]=0; i--; } ...原创 2018-10-12 10:07:47 · 1216 阅读 · 0 评论 -
找出n个符号中所有m个符号的组和
这是数据结构老师布置的第三道作业题,题目具体要求如下:具体实现思路如下: 假如说我们要找出在{1,2,3,4}中所有的两个符号的组合,那么我们可以先把1选中,然后看2。这里出现了分支,如果我们将2也选中,那么就结束;如果说我们不选中2,而是在剩下的2个元素中选出最后一个元素...如此看来,这是一个可以用递归解决的问题,递归的思路如下: 当我们碰到了某个数,我们可以选中它,然后在...原创 2018-10-12 16:17:08 · 164 阅读 · 0 评论 -
走台阶
这是数据结构老师布置的第四道题:题目要求如下:很典型的动态规划问题,可以用递归求解,代码如下:#include"pch.h"#include<iostream>#include<cstdio>#include<vector>using namespace std;int climbStairs(int n){ if (n == ...原创 2018-10-12 17:17:34 · 310 阅读 · 0 评论 -
求集合的子集
这是数据结构老师布置的第五道题目(我要吐血了。。。)题目要求如下:实现思路:和之前拿到求组合的题目想法差不多,都要用递归来解决。递归的话,思路是这样的:当我遇到一个元素时,我可以考虑把它加入子集,也可以考虑不把它加入子集,到达递归边界时,输出子集的内容。代码:#include"pch.h"#include<iostream>#include<stri...原创 2018-10-12 20:23:13 · 104 阅读 · 0 评论 -
最大的差值
这是数据结构老师布置的第6道题,题目要求如下:显然这是一个O(n^n)的算法,下面是我自己实现的O(n)的算法,和leetcode上卖股票的题相类似。代码实现:#include"pch.h"#include<iostream>#include<vector>#include<cmath>#include<math.h>#i...原创 2018-10-12 20:59:54 · 205 阅读 · 0 评论 -
求子序列的最大和
这是数据结构老师布置的第七道题,题目要求如下:具体实现思路:声明一个sum变量代表当前已经得到的和,声明一个max代表当前最大的和,每次先让sum累加,然后比较sum是否小于零,如果小于零,则直接将sum归零,进行下一次累加。然后比较sum和max大小,如果sum比max大,更新max的值。最后便得出max的值。代码如下:#include"pch.h"#include<...原创 2018-10-13 09:37:44 · 457 阅读 · 0 评论 -
黑白格问题(c++实现)
这是数据结构老师布置的实验A,题目描述如下: 在一个矩形网格中,每一个格子的颜色或者为白色或者为黑色。任意或上、或下、或左、或右相邻同为黑色的格子组成一个家族。家族中所有格子的数量反映家族的大小。要求找出最大家族的家族大小(组成最大家族的格子的数量)。例如下图中最大家族的格子数量为 8。 要求: 1、网格用二维数组表示。 2、数组中的元素的值随机产生,分别用0和1表示白...原创 2018-10-17 21:20:22 · 2652 阅读 · 0 评论 -
十以内带括号的加减法(c++)
这是数据结构老师在课上讲的例题,具体教程可以看我上传的ppt,问题要求如下: 输入一串字符串,为十以内带括号的加减乘除,输出后缀表达式和结果。解决思路: 先将字符串转化为后缀表达式,然后利用后缀表达式得出结果。中缀表达式转化为后缀表达式当中缀表达式中有括号时,后缀表达式计算结果:代码实现:#include "pch.h"#include <...原创 2018-10-16 19:10:41 · 2437 阅读 · 0 评论 -
深度优先搜索实现走迷宫问题(c++实现)
这是数据结构老师的一道例题,具体的话:先生成一个15*15的矩阵,起点在矩阵的左上角,终点在矩阵的右下角,问是否能走出迷宫,如果可以的话,输出迷宫路径。代码实现:#include"pch.h"#include<iostream>#include<ctime>#include<cstdlib>#include<stack>#incl...原创 2018-10-17 18:36:21 · 3059 阅读 · 0 评论 -
广度优先搜索实现走迷宫问题(c++实现)
广度优先搜索可以找到最短的走出迷宫的路径,看能不能走出迷宫很简单,由于广度优先搜索总是找到离某点最近的下一个点,找到的路径一定是最短路径,详见算法笔记上关于广度优先搜索的介绍,问题是如何输出走出迷宫的路径,我们可以申请一个和迷宫一样大的储存点信息的path二维数组,path中的任意元素为到达他之前的点的信息,然后输出path即可。代码如下:#include"pch.h"#include...原创 2018-10-20 10:54:18 · 2347 阅读 · 0 评论 -
在数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数
题目要求如下:在长度为n的一维数组A中,数组元素为互不相同的整型数。若存在这样的数x,它大于它左侧所有数,小于右侧所有数,则称x为A中的一个中间数。例如:若数组A={3, 1, 6, 4, 5, 7, 9, 8, 10, 14, 12},则A中有中间数7和10。试设计一个线性时间复杂度的算法,找出给定数组A中的所有中间数。实现思路:先倒序遍历数组, 获得每一个元素右边的最小值...原创 2018-10-20 15:47:29 · 2001 阅读 · 0 评论 -
重排链表(c++实现)
这道题同时也是leetcode上的重排链表题题目要求如下:给定一个单链表L: A0→A1→…→An-1→An, 将它重排为: A0→An→A1→An-1→A2→An-2→…。要求原地(in-place)操作且不改变结点中的内容。例如:给定1→2→3→4,重排为1→4→2→3。代码实现思路:利用快慢指针求解,可以设定两个指针,一个快指针,一个慢指针,快指针一次走两个节点,慢指针一次走...原创 2018-10-21 10:49:39 · 1803 阅读 · 0 评论 -
两数相加(c++实现)
这道题原来是leetcode上的两数相加,数据结构老师把他换了一下,换成空间复杂度为O(1),时间复杂度为O(m+n).题目要求如下:用单链表表示整数,例如:整数12345可表示为:1→2→3→4→5。试设计算法,通过对单链表的操作,实现两个整数的加法运算运算结果依然用单链表表示。要求算法的时间、空间复杂度分别为O(m+n)和O(1),其中m、n为表示两个整数的单链表的长度。代码实现:...原创 2018-10-21 11:55:19 · 5260 阅读 · 0 评论 -
斐波那契搜索(c++)
1. 斐波那契搜索简介: 斐波那契搜索就是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数F[k],将原查找表扩展为长度为F[n](如果要补充元素,则补充重复最后一个元素,直到满足F[k]个元素),完成后进行斐波那契分割,即F[k]个元素分割为前半部分F[k-1]个元素,后半部分F[k-2]个元素,找出要查找的元素在那一部分并递归,直到找到。...原创 2018-12-10 16:55:27 · 1251 阅读 · 0 评论