数据结构算法
yuanCruise
工科生的笔尖
展开
-
【数据结构算法】 图(一):基本概念
图分为有向图和无向图。 无向图 & 有向图无向图:顶点和边; 有向图:顶点和弧。弧:弧尾和弧头(从弧尾指向弧头) 稀疏图 & 稠密图稀疏图&稠密图:按照边的多少阈值为n*logn,根据该阈值判断图为稀疏图还是稠密图(所以说这只是一个相对的问题,与n是有关的) 完全图 & 有向完全图如果任意两个顶点之间都存在边,那么就是完全图 简单图...原创 2018-05-19 12:31:50 · 1750 阅读 · 0 评论 -
【数据结构算法】KMP算法(字符串匹配算法)
BF算法(Brute Force)朴素的字符串模式匹配算法,核心思想是:有两个字符串S和T,长度为N和M。首先S[1]和T[1]比较,若相等,则再比较S[2]和T[2],一直匹配到T[M]为止,若S[1]和T[1]不相等,则T向右移动一个字符的位置,再依次进行比较。 KMP算法由于上述BF算法的匹配方式效率不高,所以提出了KMP算法。 核心思想:提出了next矩阵,用来存储...原创 2018-07-01 13:50:39 · 1657 阅读 · 1 评论 -
【数据结构与算法】树(一)
树的定义树是n个结点的有限集,当n=0的时候称为空树。有且仅有一个特定的称为根的结点。树的度就是树内各个结点的度的最大值。度为0的结点称为叶结点。度不为0的结点称为分支结点。树的存储结构三种不同的表示结构:双亲表示法,孩子表示法,孩子兄弟表示法。双亲表示法 每个结点除了知道自己是谁以外,还知道其双亲在哪里。 #define MAX_TREE_SIZE ...原创 2018-07-01 20:12:54 · 328 阅读 · 0 评论 -
【数据结构算法】栈(一)
定义栈(stack)是一个后进先出的线性表,它只能在表尾进行删除和插入操作,对于栈来说表尾是栈顶,表头是栈底。栈的顺序存储结构typedef struct { ElemType *base; ElemType *top; int stackSize;}sqStack;创建栈#define STACK_INIT_SIZE 100initSta...原创 2018-06-26 21:21:59 · 596 阅读 · 0 评论 -
【数据结构算法】栈(二):实现进制转换
二进制转换为十进制// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include<stdio.h>#include<stdlib.h>#include<math.h>#define原创 2018-06-26 23:49:22 · 2090 阅读 · 0 评论 -
【数据结构与算法】树(二):二叉树
二叉树的特点每个结点最多有两颗子树,所以二叉树的度最大就是2.左子树和右子树是由顺序的,不能够颠倒,即使树中只有一颗子树,也是要区分它是左子树还是右子树的。特殊二叉树1.满二叉树在一颗二叉树中,所有的分支结点都存在左子树和右子树,而且所有的叶子结点都在同一层的树,叫做满二叉树。 特点:叶子结点智能出现在最下面一层。非叶子结点的度一定是2.2.完全二叉树对一颗含有n个...原创 2018-07-02 17:48:10 · 326 阅读 · 0 评论 -
【数据结构算法】栈(三):逆波兰表达式
逆波兰表达式(1-2)(4+5)转换为逆波兰表达式:1 2 - 4 5 + ,这种方式对于计算机来说是容易接受的。只需要利用栈的特点,就可以将这种后缀表达式的性能发挥到极致。利用栈求解逆波兰表达式示意图计算逆波兰表达式:1 2 - 4 5 + *数字1,2入栈,遇到减号运算符则弹出两个元素进行计算,计算结果入栈数字4,5入栈,遇到加号运算符则弹出两个元素进行计算,计算结果入栈...原创 2018-06-27 23:28:18 · 1751 阅读 · 0 评论 -
【数据结构算法】栈(四):中缀表达式转换为后缀表达式
任务将用户输入的中缀表达式转换为后缀表达式,这样就即可以做到用户友好,计算机也友好。假设输入的中缀表达式为: 1+(2-3)*4+10/5原创 2018-06-28 00:06:05 · 664 阅读 · 0 评论 -
【数据结构算法】队列(一)
定义队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列的链式存储结构队列常用链式存储结构实现 typedef struct QNode{ ElemType data; struct QNode *next;}QNode, *QueuePrt;typedef struct{ QueuePrt front, rear;}LinkQ...原创 2018-06-28 00:41:44 · 545 阅读 · 0 评论 -
【数据结构算法】队列(二):循环队列
循环队列循环队列的容量是固定的,并且它的队头和队尾指针都可以随着元素出入队列而发生改变,这样循环队列逻辑上就好像是一个环形的存储空间。注意rear指针指向的是下一个要插入的位置(注意是空的)。 我们发现循环队列只需要灵活改变front和rear指针就可以了。也就是让他两不断加1,即使超出了地址范围,也可以自动从头开始,可以采取取模运算处理:(rear+1)%QueuSize(fr...原创 2018-06-28 00:57:11 · 1314 阅读 · 0 评论 -
【数据结构算法】递归:汉诺塔
汉诺塔游戏在汉诺塔游戏中,我们发现可以将问题简化,这是一种利用递归解决问题的思路,我们不需要具体解决问题的方法是什么,但仍然可以解决该问题,因此这种方法思想简单,但计算复杂度会比较高。假设现在我们有三个柱子,“X”,“Y”,“Z”,现在“X”柱子上有不同大小的64个盘子,要求将这64个盘子移到柱子“Z”上,注意事项为每次只能移动一个盘子并且移动过程中大盘子不能出现在小盘子的上面。我们能...原创 2018-06-28 16:40:26 · 531 阅读 · 0 评论 -
【数据结构算法】:Python实现堆排序
动图展示算法时间复杂度 python堆:程序运行过程中动态分配的内存,比如c中的malloc和c++中的new。这种效率会比较慢,但不用预先定义。 栈:操作系统在建立某个进程或线程时,为其创建的内存空间,该内存空间具有FIFO的特性。当程序结束时,只需要修改栈的头指针就可以直接释放内存了,因此这种效率较快,但需要预先定义。 堆排序的思想:堆是一种数据结构,在这里我们可以将这个堆看...原创 2018-08-14 17:41:05 · 408 阅读 · 0 评论 -
【十大排序算法】
1.非线性时间类排序(时间复杂度未突破0(nlog2n)0(nlog2n) 0(nlog_2n))不稳定的四个排序算法选择排序: 0(n2) 希尔排序: 0(n1.3) 快速排序:0(nlog2n)0(nlog2n) 0(nlog_2n) 堆排序:0(nlog2n)0(nlog2n) 0(nlog_2n)稳定的三个排序算法插入排序: 0(n2) 冒泡排序:0(n2) 归并...原创 2018-08-13 14:21:44 · 282 阅读 · 0 评论 -
【数据结构算法】:Python实现归并排序
动图展示算法时间复杂度o(n*logn) python归并的思路在于先分再和,分的过程如下: 先将数组进行一半一半的拆分,直到不能再拆分未知。 之后进行合并的操作,这个合并的操作主要是合并另个有序数组。我们先比较两个有序数组的第一个元素,将小的放到一个空数组中,然后将这个小的数据原始所在的那个数组的指针往后移一个。继续与另一个数组进行比较,继续将小的放到空数组的下一个中。直...原创 2018-08-13 15:57:13 · 339 阅读 · 0 评论 -
【数据结构算法】:Python实现希尔排序
动图展示算法时间复杂度o(n1.3) python希尔排序的思路就是: 先把待排序的序列分成若干个子序列,并对这若干个子序列分别进行插入排序。这若个子序列的元素间隔是不断减小的,知道间隔为1(此时对序列进行排序就等同于插入排序了)。def shellsort(arr): gaps = [5,3,1] #对于每一个gap都执行一次插入排序 for gap ...原创 2018-08-13 18:03:09 · 378 阅读 · 0 评论 -
算法 | Python实现七大面试转考排序算法
0.简介不稳定的四个排序算法选择排序: 0(n2)希尔排序: 0(n1.3)快速排序:0(nlog2n)堆排序:0(nlog2n)稳定的三个排序算法插入排序: 0(n2冒泡排序:0(n2)归并排序: 0(nlog_2n)所谓稳定和不稳定:稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的...原创 2019-01-20 15:42:20 · 553 阅读 · 0 评论 -
【数据结构算法】递归:八皇后问题
八皇后八皇后问题就是说如下图所示的国际象棋的棋盘中,放入8个皇后,所谓皇后就是国际象棋中的一个角色,它的功能就是能够打掉与它同一行同一列同一斜排的棋子,并且打击距离是整个棋盘。我们的任务就是在棋盘中挑选8个位置放上皇后,使得这八个皇后能够在棋盘中和平共处,不会被对方打掉。解题思路利用递归的手段解决代码#include <stdio.h>//row表示起始行//n...原创 2018-06-30 23:25:42 · 1172 阅读 · 0 评论 -
【数据结构算法】线性表七:双向循环链表
双向链表结点结构typedef struct DualNode{ Elemtype data; struct DualNode *prior; struct DualNode *next;}DualNode, *DuLinkList;双向循环链表双向链表的插入操作//顺序很重要不能搞反s->next = p;s->prior = ...原创 2018-06-25 13:00:16 · 283 阅读 · 0 评论 -
【数据结构算法】:C++ & python实现冒泡排序
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include<iostream>#define ArrayLen 10using namespace std;void swap(int* array, char i, char j);void BubbleSort(int* array);...原创 2018-05-19 17:12:31 · 473 阅读 · 0 评论 -
【数据结构算法】图(二):存储结构(邻接矩阵)
用两种结构表示图的顶点和边(弧)顶点:因为不区分大小、主次,所以用一个一维数组来存储。 边(弧度):边和弧度是顶点与顶点之间的关系,因此我们用二维数组来存储。因此: 图的邻接矩阵是用两个数组来表示图。一个一维数组存储图中顶点信息。一个二维数组(我们称为邻接矩阵)存储图中的边或弧信息。 想要知道某个顶点的度,其实就是...原创 2018-05-20 13:48:30 · 738 阅读 · 0 评论 -
【数据结构算法】:C++&Python实现快速排序
动图展示算法复杂度o(n*logn) C++Python#快速排序的思想:设置一个基准,对基准左右两边进行分别的排序__author__ = '__yuanlei__'def QuickSort(array, left, right): if left < right: #第一步定好那个基准 #然后在基准的左边右边用递归的形...原创 2018-05-21 12:59:40 · 297 阅读 · 0 评论 -
【数据结构算法】:C++&Python实现插入排序
动图展示时间复杂度:o(n*n) C++Python__author__ = '__yuanlei__'def InsertSort(arr): for i in range(1,len(arr)): preIndex = i -1 current = arr[i] while (preIndex>=0...原创 2018-05-21 13:19:39 · 268 阅读 · 0 评论 -
【数据结构算法】图(五):基于邻接矩阵的广度优先搜索(BFS)C++实现
利用邻接矩阵的数据结构表示图,并实现BFS如下图两张图片所示,广度优先搜索就是先找到A,然后接着找BF,找到B接着找CIG;这是一种以A的走向为前方的右手原则。用队列实现这种逻辑。 /*ADT 队列(Queue)Data同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。OperationInitQueue(*Q):初始化操作,建立一个空队列Q。DestoryQueue...原创 2018-05-25 12:58:21 · 3321 阅读 · 1 评论 -
【数据结构算法】线性表(一):顺序存储结构
线性表的顺序存储结构这就是一种用一段地址连续的存储单元依次存储线性表的数据元素。线性表的顺序存储如下:线性表存储结构代码:#define MAXSIZE 20typedef int ElemType;typedef struct{ ElemType data[MAXSIZE]; int length; //当前线性表的长度}SqList;...原创 2018-06-03 14:56:40 · 500 阅读 · 0 评论 -
【数据结构算法】线性表(二):链式存储结构
线性表链式存储结构其特点是用一组任意的存储单元存储数据元素,这组存储单元可以存在内存中未被占用的任意位置。出来存储本身的信息外,还需要存储一个指示其直接后继的存储位置的信息。这连个位置分别叫做:数据域 和 指针域。这两部分信息组成数据元素称为结点(Node)。该种结构只包含一个指针域,因此叫做单链表。...原创 2018-06-03 23:55:27 · 750 阅读 · 0 评论 -
【数据结构算法】图(三):存储结构(邻接表,十字链表,邻接多重表,边集矩阵)
由于邻接矩阵这种存储结构存在一定空间浪费,因此考虑用邻接表邻接表这是一种数组与链表结合一起来存储。无向图有向图(把顶点当弧尾)有向图(把顶点当弧头)【这种叫做逆邻接表】十字链表邻接表固然优秀,但也有不足的地方,比如对有向图的处理的时候,有时需要建立逆邻接表。 十字链表将邻接表和逆邻接表整合在一起。 十字链表虽然结构复杂,但其创建图的时间复杂度...原创 2018-05-24 09:17:36 · 3914 阅读 · 0 评论 -
【数据结构算法】线性表(三):单链表整表创建与删除
单链表创建(头插法)void CreateListHead(LinkList *L, int n){ LinkList p; int i; srand(time(0)); *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL; for(i = 0; i<n; i++) ...原创 2018-06-04 22:53:36 · 598 阅读 · 0 评论 -
【数据结构算法】线性表(四):单链表小结(面试题)
题目:快速找到未知长度单链表的中间节点利用快慢指针原理:设置两个指针*search、 *mid都指向单链表的头节点。其中 *search的移动速度是 *mid的两倍。当 *search指向末尾节点的时候 *mid正好就在中间。这也是标尺的思想。GetMidNode(LinkList L, ElemType *e){ LinkList search, mid; mid ...原创 2018-06-04 23:55:50 · 419 阅读 · 0 评论 -
【数据结构算法】线性表(五):双向链表
双向链表其实循环链表和单链表的主要差异就在于循环链表判断空的条件,原来判断head-&gt;next是否为空,而现在则是head-&gt;next是否等于head。代码后续更新...原创 2018-06-05 00:19:50 · 280 阅读 · 0 评论 -
【数据结构算法】图(四):基于邻接矩阵的深度优先搜索(DFS) C++实现
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。#include &amp;quot;stdafx.h&amp;quot;#include&amp;amp;lt;iostream&amp;amp;gt;#include&amp;amp;lt;stdio.h&amp;amp;gt;#define Acsii -48 //将输入字符转换成数字#defin原创 2018-05-24 19:12:11 · 1147 阅读 · 0 评论 -
【数据结构算法】图(六):基于邻接矩阵的最小生成树(prim算法)Python实现
# coding:UTF-8def prim(graph, vertex_num): INF = 1 << 10 visit = [False] * vertex_num dist = [INF] * vertex_num #preIndex = [0] * vertex_num #对所有的顶点进行循环,首先是确定头结点 #找到当前无向...原创 2018-05-31 13:18:26 · 4493 阅读 · 0 评论 -
【数据结构算法】线性表(六):循环链表2(链表拼接,有无环)
思考在单链表中,我们有了头结点时,我们可以用o(1)的时间复杂度访问第一个结点,但当我们要访问最后一个结点,我们必须要挨个向下索引,所以需要o(n)的时间。结合循环链表的特点,我们能够用o(1)的时间就可以由链表指针访问到最后一个结点。改造循环链表实现上述功能我们不用头指针(但保留头结点),而是用指向终端结点的尾指针来表示循环链表,此时查找开始结点和终端结点都很方便。 所以这个情...原创 2018-06-22 23:01:36 · 525 阅读 · 0 评论 -
【数据结构算法】线性表八:双向循环链表例子
题目要求实现用户输入一个数使得26个字母排列发生变化,如用户输入3则输出结果:DEFGHIJKLMNOPQRSTUVWXYZABC;用户输入-3则输出结果:XYZABCDEFGHIJKLMNOPQRSTUVW//============================================================================// Name ...原创 2018-06-25 12:46:20 · 341 阅读 · 0 评论 -
算法 | 二叉树的构建与遍历
0.简介对于二叉树的遍历,有四种方式:层序输出,前序输出,中序输出,后序输出。但不论利用何种输出方式对二叉树进行遍历,其前提为必须提前已知一颗树。那么什么叫做已知一颗树呢?所谓已知一棵树的意思即为:已经用数据结构定义好的树,通过该树可以知道哪个节点是根;哪个节点是左儿子,右儿子;哪个节点是左儿子的左右儿子等等这样的信息。在本文中,我们把得到这个已知树的过程称之为创建一颗树。1.四种遍历方式示...原创 2019-01-20 16:12:11 · 1084 阅读 · 0 评论