DataStruct
数据结构
Kyda
行于思
展开
-
栈的实现
栈是限定仅在表尾进行插入或者删除操作的线性表。因此对于栈来说,表尾端有其特殊含义,称为栈顶,表头端称为栈底,不含元素的栈称为空栈。说明下,栈在编程中的使用频率挺高的。今天看到一个项目经理写的框架,里面大量使用到栈。栈主要有两种形式:1.用数组实现,称为静态栈。2.用链表实现,称为动态栈。这次,我们以动态栈为例来讲栈。首先,我们来看栈的结构1.空栈2.存有数据的栈原创 2017-03-09 19:32:46 · 419 阅读 · 0 评论 -
循环链表
循环链表是在单向链表的基础上,将尾节点指回头结点。#includeusing namespace std;typedef int ELemtype;typedef struct CLNode { //循环链表的节点 ELemtype elem; struct CLNode *next;}*CLList;void init_List(CLList Head)原创 2017-03-17 00:32:51 · 418 阅读 · 0 评论 -
二叉查找树(二叉搜索树)
二叉查找树,对于树的每个节点X,它的左子树中的所有关键字值小于X的关键字值,而它的右子树所有关键字值大于X的关键字值。如图,左边是二叉查找树,右边不是。二叉查找树比较麻烦的操作是删除。在删除一个节点时,需考虑节点有是否存在左右子树。假如左右子树同时存在,需要将右子树的元素去替代该节点的元素,然后删除该节点。特点:在二叉查找树中,大部分操作为O(logN).#pragma o原创 2017-04-23 20:40:01 · 681 阅读 · 0 评论 -
图的储存结构之邻接表
邻接表是图的一种链式储存结构。在边数小于节点数的图中,如果继续使用邻接矩阵,那么就会造成资源浪费。比如我们有一个有图,一共五个节点,却只有4 条边,生成5*5的邻接矩阵时,此时在这25个内存空间中只有4个被有效的利用,这就造成了浪费。这时,我们可以联想到链式结构。在前面的知识中,可以知道,链表相对与数组可以更有效的利用起内存空间,避免资源浪费。因为链表是动态的,大小不用事先确定。那原创 2017-05-06 17:45:55 · 691 阅读 · 0 评论 -
图的遍历(深度,广度)
一.图的深度优先搜索遍历(Deep First Search) 类似于二叉树的先序遍历。基本思想就是:首先访问出发点v(可以是任意的),并将其表记为已访问;然后选取与v邻接未被访问的任意一个顶点w,并访问他;再选取与w邻接的未被访问的任意一点并访问, 依次重复进行。 当一个顶点所有的邻接顶点都被访问过时,则依次退回到最近被访问过的顶点,若该顶点还有其他邻接顶点未被访问,则从这些原创 2017-05-07 00:50:15 · 2236 阅读 · 0 评论 -
最小(代价)生成树
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。一.普利姆算法从图中任意取出一个顶点,把他当作一棵树,然后从这棵树相接的边中选取一条最短(权值最小)的边,并将这条边及其所连接的顶点也并入这棵树中,此时得到一颗有两个顶点的树。然后在这棵原创 2017-05-07 21:13:09 · 17555 阅读 · 4 评论 -
最短路径
用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。有两种算法:迪杰斯特拉和弗洛伊德前者用于求解一个顶到其他顶点的最短路径后者用于求解各顶点到其余顶点的最短路径Dijkstra算法1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是原创 2017-05-16 17:18:22 · 548 阅读 · 0 评论 -
拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。原创 2017-05-10 13:28:55 · 602 阅读 · 0 评论 -
快速排序
快排,快排,不快怎么行呢!但我们在实际应用中,处理大量数据时,如果采用普通排序(如冒泡排序)就会使得时间复杂度变为O(N^2),这是我们我们不愿意看到的。而快速排序就很好的解决了这个问题。它的时间复杂度大概是O(logN),最坏的情况下为O(N^2)。当然我们一般情况下遇到最坏情况是很少见的。快排,用到的一个重要的思想就是分治。分治分治,就是分而治之。简单来说,就是找到一个规律,将问题原创 2017-04-24 20:52:54 · 605 阅读 · 0 评论 -
排序算法(选择,插入,冒泡)
介绍下三种简单的代码,主要参考了一个博客里介绍的排序问题,他那里介绍了八种,而且很详细,但鉴于对于我们这种初学者只需要了解一些简单的排序就行啦,各位有兴趣可以去那篇博文看看。链接:http://www.cnblogs.com/zhaoshuai1215/p/3448154.html#include#include#include#define ArraySize 10using nam原创 2017-03-05 15:39:47 · 433 阅读 · 0 评论 -
排序算法(堆排序,直接插入排序,折半插入排序,希尔排序)
今天下午一口气看了四种排序算法,加上之前已经有的三种排序算法,以及拓扑排序,目前我的博客里面已经有八种排序算法。还差两到三种算法也会在后面更出来。由于排序算法已经有很多人总结过了就不一一详细说明。不过我会附上一些优秀博主总结的链接。一.堆排序 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定原创 2017-05-19 22:09:14 · 853 阅读 · 0 评论 -
二分查找实现与分析
在有序表或者数组进行查找元素的的时候,如果对其中的元素逐个进行比较查找的话,当数据量很大时,假设数组的元素个数为N个,那么所对应的时间复杂度就是O(N)。对于O(N),其实已经效率算是很快了。但作为贪心而又充满智慧的人类,我们总是能够想到效率更快的算法。天下武功,唯快不破。于是二分查找就横空出世。所谓,二分查找法,就是将表中元素不断的进行折半,与所形成的子表的中间的元素进行比较。比如在(1原创 2017-04-14 10:23:14 · 541 阅读 · 0 评论 -
数据结构和算法的选择
本部分总结前面介绍的数据结构和算法,并讨论在不同的情况下如何进行选择。通用数据结构:数组、链表、树、哈希表专用数据结构:栈、队列、优先级队列排序:插入排序、希尔排序、快速排序、归并排序、堆排序图:邻接矩阵、邻接表外部存储:顺序存储、索引文件、B-树、哈希方法1 通用数据结构转载 2017-04-14 16:14:15 · 1001 阅读 · 1 评论 -
堆分配储存结构的串
串在程序中是不可或缺的。char a[]="abcd",就是一个字符串。学习串的目的就是为了对串进行操作。不过,编译器已经有专门的库来对串进行操作了。所以,我们可以利用这些库,就不要造轮子了。我们学习了串,也就可以自己试着造个轮子来处理串啦!回到正题。串有三种表达方式:定长顺序储存,堆分配储存,块链储存。这里,只讲堆分配。堆分配储存结构的串既有顺序储存结构的特点,处理方便,操作中对原创 2017-03-18 11:00:57 · 1456 阅读 · 0 评论 -
链表的一些题目
1.已知指针la和lb分别指向两个无头结点单链表中的首元结点。 下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中第i个元素之前。试问此算法是否正确? 若有错,则请改正之。实现下列函数:Status DeleteAndInsertSub(LinkList &la, LinkList &lb, int i,原创 2017-03-18 12:47:12 · 3854 阅读 · 0 评论 -
队列的实现
队列(Queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。(先进先出)队列有两种表现形式:1.用链表的形式 2.用数组的形式队列的结构原创 2017-03-10 13:11:54 · 427 阅读 · 0 评论 -
广义表(C语言,傻瓜式实现)
广义表广泛应用于人工智能中,不可不谓很重要!在学习的过程中,书里没有给出确切的实现方法。而在网上大多数是用c++面向对象来写的。程序冗长。而用C语音写出来的大多有点复杂。所以我结合了一下,写了一个比较容易实现的广义表。广义表的节点分为两类:一类是原子(atom),另一类是子表(list)。在写节点时候我们需要给节点做标记,以便对节点类型做出判断,然后执行相应的操作。下面是广义表的一个简原创 2017-03-22 01:33:16 · 4163 阅读 · 4 评论 -
二叉树算法(递归与非递归)
首先我们来了解下二叉树的基本概念和构造1. 父节点,子节点,兄弟节点很容易理解,2和3的父节点就是1,反过来说就是2和3是1的子节点。2和3就是兄弟节点。2. 结点的度 其实”度“就是”分支数“,比如1的分支数有两个“2和3",那么1的度为2。3. 树的度看似比较莫名其妙吧,他和”结点的度“的区别就是,树的度讲究大局观,乃树中最大的结点度,其实也就是2。4.原创 2017-03-25 10:16:26 · 612 阅读 · 0 评论 -
双向链表
双向链表,顾名思义就是一个节点有两个方向,一个指向前驱,一个指向后继。双向链表主要是为了方便查找前驱,但同时也牺牲了一定的空间。双向链表与循环链表有个相似,就是都能回到起点。(循环链表我不打算写一篇博文介绍,双向链表就是循环链表的一个升级版本,搞懂双向链表,循环链表自然就懂了)。打个比方,有两堆人,各自围成一圈,第一堆人,每个人的左手牵着前面一个人的右手,右手牵着后面一个人的左手,这样围成原创 2017-03-02 12:43:52 · 423 阅读 · 1 评论 -
顺序表的实现
在顺序表中,每个数组储存的地址是连续的。如下图我们在写顺序表是要定义一个指针来储存我们的数据,在定义这个指针的时候,需要对指针赋予一定是储存空间。运用malloc进行操作:List.Elem = (int *)malloc(List_size * sizeof(int));为了方便以后对表进行操作,我们需要定义一个int类型的参数来存放当前表的长度,我的代码用了:Length来表示原创 2017-03-05 10:20:46 · 473 阅读 · 0 评论 -
汉诺塔的实现
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。说白了就是有三根柱子,柱子上有若干按大小摆好的盘子,小的只能在大的盘子上面。通过不断的移动将这根柱子上的所有的原创 2017-03-17 19:21:11 · 352 阅读 · 0 评论 -
图的储存结构之邻接矩阵
邻接矩阵是表示顶点之间相邻关系的矩阵。说白了就是我们有一个图,我们利用矩阵来表示这个图顶点之间的关系。图的特性:1.有向与无向:有向就是顶点从一个顶点指向另外一个顶点。下面两个图分别就是有向与无向2.有权或者无权:就是顶点之间边的权值。下面两个图就是有权与无权。(边上带权的图为带权图,也称网)把上面的两个图分别用矩阵表示:第一个为无权无向图。0表示顶原创 2017-05-04 19:20:10 · 626 阅读 · 0 评论 -
python实现链表的深度优先遍历
在《python cookbook》(简称python奇技淫巧书)中看到的,觉得太简洁了,遂记录下来:class Node(object): def __init__(self, value): self._value = value self._children = [] # 添加子元素 def add_children(self, value)原创 2017-12-10 20:00:26 · 1546 阅读 · 0 评论