数据结构和算法
ccshijtgc
这个作者很懒,什么都没留下…
展开
-
约瑟夫问题
约瑟夫问题是一个利用循环链表的经典问题,问题描述如下:(度娘搜滴)约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”) 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是原创 2013-12-19 16:21:50 · 742 阅读 · 0 评论 -
基本数据结构:单链表
链接方式存储的线性表简称为链表(Linked List)。 链表的具体存储表示为: ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的) ② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))注意原创 2013-12-19 11:19:26 · 675 阅读 · 0 评论 -
图的表示--邻接表
图的表示: 主要有两种,邻接矩阵和邻接表,前者空间复杂度,O(V2),后者为O(V+E)。因此,除非非常稠密的图(边非常多),一般后者优越于前者。上篇讨论了邻接矩阵的实现,本篇讨论邻接表的实现GraphLink.h#include "Graph.h"#include #include using std::cout;using std::cin;using s原创 2014-01-09 11:40:02 · 864 阅读 · 0 评论 -
图的表示--邻接矩阵
定定义邻接矩阵(Adjacency Matrix):是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V={v1,v2,…,vn}。G的邻接矩阵是一个具有下列性质的n阶方阵:①对无向图而言,邻接矩阵一定是对称的,而且对角线一定为零(在此仅讨论无向简单图),有向图则不一定如此。②在无向图中,任一顶点i的度为第i列所有元素的和,在有向图中顶点i的出度为第i行所有元素的原创 2014-01-09 01:03:25 · 1089 阅读 · 0 评论 -
拓扑排序
拓扑排序对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。一般应用拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。例如,在日常工作中,可能会将项目拆分成A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项原创 2014-01-09 22:04:39 · 571 阅读 · 0 评论 -
Dijkstra算法
Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短原创 2014-01-10 16:42:53 · 1090 阅读 · 0 评论 -
Floy算法
Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。算法思想:1、Floyd算法递归地产生一个矩阵序列adj(0),adj(1),…, adj(k) ,…, adj(n)2、adj(k)[i,j]等于从顶点Vi到顶点Vj中间顶点序号不大于k的最短路径长原创 2014-01-13 11:11:58 · 767 阅读 · 0 评论 -
00 开篇
前日,与老同学喝酒聊天,一起追忆起大学里青春飞扬的岁月,感叹起岁月的流逝,默然回首,老同学们都在IT业混的风声水起,唯有我却在行业外做着非主流的事情,回家看着沾满灰尘的大学课本,感慨万千!曾经的梦想不知道藏在内心那个角落,望着熟睡的妻儿,默默做出决定,IT,我终究会回来的!本系列博文以清华尹人昆版数据结构、算法导论2本书为主线,所有代码均采用C++实现,少用文字,多用代码和注释,重新再一次原创 2013-12-18 09:33:53 · 561 阅读 · 0 评论 -
Prim算法
边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。 最小生成树(MST):权值最小的生成树。 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路。可以把边上的权值解释为线路的造价。则最小生成树表示使其造价最小的生成树。 构造网的最小生成树必须解决下面两个问题: 1、尽可能选取权值小的边,但不能构成回原创 2014-01-13 15:56:05 · 756 阅读 · 0 评论 -
快速排序
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-an原创 2014-01-26 00:26:47 · 693 阅读 · 0 评论 -
并查集
并查集是一种特殊的集合,由一些不相交子集构成,合并查集的基本操作是:Find:判断两个结点是否在同一个集合中Union:归并两个集合因此可以将并查集中每个结点只保存一个指向其父结点的指针域,通过判断节点的父指针是否相同可以判断2个节点是否是同一个并查集用父指针表示的树形结构实现的并查集可以很容易地解决等价类问题:1、约定森林F={T1,T2,…,Tr}表原创 2014-01-17 11:31:06 · 1691 阅读 · 0 评论 -
Kruskal算法
占位原创 2014-01-13 16:00:31 · 763 阅读 · 0 评论 -
递归的经典应用----汉诺塔问题
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。#include using std::cin;using std::cout;using std原创 2013-12-24 12:25:02 · 842 阅读 · 1 评论 -
基本数据结构:循环单链表
上篇对单链表进行了详细说明,本篇接下来说说单循环链表单循环链表就是在单链表基础上,尾巴元素指向了头,形成了圆圈,操作时只有注意尾部元素链接头就OK,废话不多说,直接上代码单循环链表定义类 CircleLinkedList.h#ifndef CIRCLE_LINKEDLIST_H#define CIRCLE_LINKEDLIST_H#include #include using原创 2013-12-19 13:13:06 · 765 阅读 · 0 评论 -
基本数据结构:链式队列
队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表 (1)允许删除的一端称为队头(Front)。 (2)允许插入的一端称为队尾(Rear)。 (3)当队列中没有元素时称为空队列。 (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。 队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾原创 2013-12-23 22:08:49 · 595 阅读 · 0 评论 -
插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。步骤⒈从有序数列{a1}和无序数列{a2,a3,…,an}开始进行排序;⒉处理第j个元素时(j=2,3,…,n),数列{a1,a2,…,aj-1}是已有序的,而数列{aj,aj+1,…,an}是无序的。用aj与aj原创 2013-12-20 21:25:05 · 559 阅读 · 0 评论 -
最大子序列和问题
问题: 给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大 例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到O(n^3)。原创 2013-12-20 10:00:30 · 630 阅读 · 0 评论 -
最小堆
最大堆和最小堆是二叉堆的两种形式。最大堆:根结点的键值是所有堆结点键值中最大者的堆。最小堆:根结点的键值是所有堆结点键值中最小者的堆。不失一般性,只讨论根结点为最小层的情况。插入[编辑]只需要将节点插在二叉树的最后一个叶子结点位置,然后比较它对它父亲节点的大小,如果大则停止;如果小则交换位置,然后对父亲节点递归该过程直至根节点。复杂度为O(log(n原创 2014-01-06 12:46:54 · 599 阅读 · 0 评论 -
归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。数据结构与算法分析C++描述中图解如下:可以看出合并有序原创 2013-12-20 22:27:30 · 462 阅读 · 0 评论 -
STL库list的模拟
直接看代码#ifndef LIST_H#define LIST_Htemplate class List{private: struct Node { T data;//值域 Node *prev;//前驱 Node *next;//后继 Node( const T & d = T(), Node * p = nullptr, Node原创 2013-12-22 22:26:16 · 627 阅读 · 0 评论 -
二叉查找树
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的查找树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉查找树中序周游二叉排序树可得到一个升序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。每原创 2014-01-05 21:58:54 · 564 阅读 · 0 评论 -
二叉树
最近在mooc上发现了清华、北大2门数据结构的课程,一直在潜心学习他们的课程,博客没有及时更新,今天刚刚学习了二叉树,趁热打铁,记录下二叉树的学习经历吧,老规矩,还是看代码二叉树节点类的实现:#ifndef BINARY_TREE_NODE_H#define BINARY_TREE_NODE_Htemplate class BinaryTree;template class原创 2014-01-02 00:33:06 · 971 阅读 · 0 评论 -
STL库中vector的模拟
数据结构和算法分析C++描述中作者对STL中vector进行了模拟,实现了vector的简单功能,好东西不能独享,代码奉上#ifndef VECTOR_H#define VECTOR_H#include "dsexceptions.h"template class Vector{public: explicit Vector(int size = 0) : theSize(s原创 2013-12-22 12:29:31 · 512 阅读 · 0 评论 -
哈夫曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。基本术语哈夫曼树(霍夫曼树)又称为最优树.1、路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规原创 2014-01-06 21:33:08 · 704 阅读 · 0 评论 -
基本数据结构:栈
堆栈(英语:stack),也可直接称栈。在计算机科学中,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端(称为堆栈顶端指标,英语:top)进行加入资料(英语:push)和输出资料(英语:pop)的运算。另外堆栈也可以用一维阵列或连结串行的形式来完成。堆栈的另外一个相对的操作方式称为伫列。由于堆栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last原创 2013-12-23 17:13:22 · 636 阅读 · 0 评论 -
基本数据结构:顺序表
顺序表,数组就是典型的顺序表,顺序表便于查询元素,单移动、删除时间开销比较大,好了废话少说,直接上代码,对照源码看吧#ifndef SEQLIST_H#define SEQLIST_H#include #include using std::cin;using std::cout;using std::cerr;using std::endl原创 2013-12-18 17:21:27 · 1009 阅读 · 0 评论 -
希尔排序
希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成(n除以d1)个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2 该方法实质上是一种分组插入方法。 比较相隔较远距离(称为增量)的原创 2014-01-20 17:18:02 · 491 阅读 · 0 评论