数据结构与算法专栏
文章平均质量分 91
主要介绍基础数据结构理论与实现和各种算法题题解
daipuweiai
这个作者很懒,什么都没留下…
展开
-
单链表的直接插入排序
单链表数据结构typedef struct node{ ElemType data; struct node* next;}Single_List;算法//直接插入排序Single_List* Insert_Sort(Single_List* list){ //这里的单链表是带头结点的单链表 Single_List* cur,*pre,*p; cur原创 2017-11-06 19:02:38 · 2925 阅读 · 0 评论 -
根据中序序列与后序序列构建二叉树
算法如下: 1)先在后序序列中找到根结点, 2)在中序序列中找到根结点位置,(可以将二叉树分为左子树和右子树) 3)用同样的办法构造左子树 。 4)用同样的办法构造右子树。算法如下:BinaryTree* Creat_Node(char ch){ BinaryTree* root; root = new BinaryTree; root->data = ch;原创 2017-10-23 18:44:19 · 5189 阅读 · 0 评论 -
判断二叉树是否为二叉搜索树
概要这题利用二叉搜索树的特性:左子树的所有的关键字小于根节点的关键字,右子树的所有关键字都大于根结点 的关键字。二叉搜索树的中序遍历一定是个有序序列。根据这一特性可以利用二叉树的非递归中序遍历来解答这个问题。算法思路1)初始化堆栈为空,设置data为当前根节点的键值,设置cur指向根节点,标志位flag为true。 2)若cur->lchild非空,那么如果cur->lchild的键值小于data原创 2017-10-26 20:09:59 · 2131 阅读 · 0 评论 -
2016年计算机联考真题——寻求最大子集和的差
概述已知由n(n>=2)个正整数构成的集合A = {ak|0<=k算法思想根据快速排序的思想,把找到最佳的划分,把最小的[n/2]个数放到A1,其余的数放到A2。分组结果即为题意所求。 算法步骤: 1)若i=[n/2],则划分结束。 2)若i<[n/2],则枢轴及之前的所有元素均属于A1,继续对i之后的元素进行划分。 3)若i>[n/2],则枢轴及之后的所有元素均属于A2,继续对i之前的元素原创 2017-09-27 21:35:48 · 6379 阅读 · 2 评论 -
堆排序
概述堆排序是利用堆的特性——堆顶元素一定是这个堆的最大值或者最小值,来使选择排序中每趟选择最值变得更加高效的思路。对于堆的相关内容移步我之前的博客:堆算法思想这里我们默认从小到大排序。 思路一:首先把通过数组构造一个最小堆,之后依次执行最小堆的删除操作直至最小堆为空则能得到一个从小到大的序列。对于时间复杂度一定是O(nlogn)。然而这个算法却带来了O(n)的空间复杂度。那么这显然是不划算的。故这原创 2017-09-24 19:26:52 · 626 阅读 · 0 评论 -
快速排序
概述快速排序和归并排序一样也是分而治之策略的应用,基本思路是在数组中选取一个主元,以它为标准,遍历数组把小于它的数放在右边,大于它的数放在左边。递归上述过程直至有序。选主元选主元与划分子集这两个问题关乎快速排序的效率问题。选主元有很多方式,比如直接那第一个数作主元,那么当数组基本有序时那么时间复杂度就变成了O(n^2)了,而不是O(nlogn),也可以利用随机函数来选取下标,从而确定主元,但是ran原创 2017-09-24 21:28:59 · 1782 阅读 · 0 评论 -
归并排序
概述归并排序是典型的分而治之策略的应用。主要是把一个数组分成若干个子数组进行从小到大的归并直至有序。下面所说的归并排序默认为2路归并排序。递归算法思想1)将数组平分为2等份,对这两个子数组进行从小大到有序归并。 2)递归对左半部分进行2路归并 3)递归对右半部分进行2路归并//一趟归并 void Merge(int* data,int* tmp,int left,int right,int r原创 2017-09-24 20:10:51 · 900 阅读 · 3 评论 -
希尔排序
概述由于之前的冒泡排序和插入排序效率低平均复杂度为O(n^2),那么为了加快排序效率,希尔排序就这样被提出来了。只要思想是定义一个增量序列来反复对数组按增量分割成的子序列进行直接插入排序,直至基本有序。算法思想先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插原创 2017-09-24 16:39:31 · 719 阅读 · 0 评论 -
简单排序
概述排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现。但是了解这些精妙的思想对我们还是大有裨益的。冒泡,插入这三种排序是最简单的排序,本文将主要讲解这两种排序思想。关与图解请参照如下地址的博客(是在不好画图,自己的图就是取自这篇博客):http://www.cnblogs.com/chengxiao/p/610300原创 2017-09-24 16:03:27 · 681 阅读 · 0 评论 -
散列表(下)——分离链接法
概述在我的上一篇博客散列表(上)——开放定址法 主要讲述了开放定址法的三种思路:线性探测法,平法探测法,双散列法三种思路,以及线性探测的代码实现。在这篇博客里,主要讲解第二中解决冲突的办法——分离链接法。分离链接法分离链接法的思想就是:将相应位置上冲突的所有关键词存储在同一个单链表中。主要办法是,构造以所有可能地址的为头的单链表数组。对于单链表的相关操作已经在之前的博客详细讲述了,如有需要请移步我之原创 2017-09-20 21:12:31 · 1162 阅读 · 0 评论 -
散列表(上)——开放定址法
概述散列表,又称哈希表,hash表。散列表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。这个源于散列表设计的特殊性,它采用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。设计思想Hash表采用一个映射函数 f : key —> address 将关键字映射到原创 2017-09-20 19:23:15 · 18254 阅读 · 2 评论 -
拓扑排序
概述拓扑排序:如果图中从v到w有有一条有向路径,则v一定要排在w之前。满足此条件的顶点序列称为一个拓扑序。获得拓扑序的过程就是拓扑排序。有向无环图:一个有向图中不存在环,则称为有向无环图,简称DAG(Directed Acyclic Graph)。AOV网络:如果用DAG图买表示一个工程,其顶点表示活动,用有向边拓扑排序算法思想:从图从选择一个没有前驱结点的顶点输出,之后删除该顶点和所有以它为起始点原创 2017-09-16 17:16:51 · 632 阅读 · 0 评论 -
最小生成树算法(上)——Prim(普里姆)算法
概述最小生成树:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。根据定义可知对于一个有V个顶点的图来说,其最小生成树定包含V个顶点与V-1条边。反过来如果一个图的最小生成树存在,那么图一定是连通图。 对于最小生成树算法最著名的有两种:Prim算法与Kruskal算法。Prim算法Prim算法思想描述: Prim算法可以简单描述成原创 2017-09-14 21:11:12 · 1273 阅读 · 0 评论 -
最小生成树算法(下)——Kruskal(克鲁斯卡尔)算法
概要在我的上一篇文章最小生成树算法(上)——Prim(普里姆)算法 主要讲解对于稠密图较为合适的Prim算法。那么在接下里这片文章中我主要讲解对于稀疏图较为合适的Kruskal算法。Kruskal算法Kruskal算法思想概述: 如果说Prim算法可以用让一颗小树慢慢长大,那么Kruskal算法也可以用一句话来总结:将森林合并成树。就是说它比Prim算法更直接的贪心,把每个顶点看成一棵树,那么恶原创 2017-09-15 08:40:24 · 1086 阅读 · 0 评论 -
最短路径算法(上)——迪杰斯特拉(Dijikstra)算法
概述单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。最短路径的最优子结构性质描述为:如果P(i,j)={Vi….Vk..Vs…Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。假设P(i,j)={Vi….Vk..Vs…Vj}是从顶原创 2017-09-12 21:30:15 · 9042 阅读 · 6 评论 -
最短路径算法(下)——弗洛伊德(Floyd)算法
概述在这篇博客中我主要讲解最短路径算法中的Floyd算法,这是针对多源最短路径的一个经典算法。对于单源最短路径算法请详见我的另一篇博客:最短路径算法(上)——迪杰斯特拉(Dijikstra)算法弗洛伊德(Floyd)算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。算法思想与过程(一)算法思想: Flo原创 2017-09-13 13:48:34 · 25808 阅读 · 15 评论 -
汉密尔顿回路问题
概述这是自己这学期算法课的实验作业。下面给出汉密尔顿图的定义。定义如下:对于连通图G=(V,E),V1,V2,…,Vn是G 的一条通路,且图中任意两个顶点都可达,若 中每个顶点在该通路中出现且仅出现一次,则称该通路为汉密尔顿通路。若 V1=Vn,则称该通路为汉密尔顿回路。算法描述1)初始化最佳路径数组best_path,同时初始化临时路径数组path与访问数组isvisited,设置最小长度min,原创 2017-09-12 10:38:43 · 16887 阅读 · 11 评论 -
算法提高 盾神与条状项链
问题描述 有一天,盾神捡到了好多好多五颜六色的珠子!他心想这些珠子这么漂亮,可以做成一条项链然后送给他心仪的女生~于是他用其中一些珠子做成了长度为n的项链。当他准备把项链首尾相接的时候,土方进来了。 “哇这么恶心的项链你也做得出来!!!” 盾神自知审美不是他的长项,于是他很谦虚地请教土方,怎么才能把项链做得漂亮。 “这个嘛~首先你要在这里加上一个这种颜色的珠子,然后在这里去掉原创 2017-02-12 17:59:44 · 675 阅读 · 0 评论 -
02-线性结构4 Pop Sequence (25分)
Given a stack which can keep MM numbers at most. Push NN numbers in the order of 1, 2, 3, …, NN and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of t原创 2017-03-08 10:42:44 · 966 阅读 · 0 评论 -
02-线性结构2 一元多项式的乘法与加法运算 (20分)
设计函数分别求两个一元多项式的乘积与和。输入格式:输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。输出格式:输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。输入样例:4 3 4 -5 2 6 1 -2 0 3原创 2017-03-22 14:16:38 · 852 阅读 · 0 评论 -
03-树3 Tree Traversals Again (25分)
An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack原创 2017-03-22 15:52:20 · 483 阅读 · 0 评论 -
03-树2 List Leaves (25分)
Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.Input Specification:Each input file contains one test case. For each case, the first line gives a posit原创 2017-03-30 21:25:36 · 486 阅读 · 0 评论 -
04-树4 是否同一棵二叉搜索树 (25分)
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。输入格式:输入包含若干组测试数据。每组数据的第1行给出两个正整数NN (\le 10≤10)和LL,分别是每个序列插入元素的个数和原创 2017-04-01 19:52:51 · 1961 阅读 · 0 评论 -
04-树5 Root of AVL Tree (25分)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is原创 2017-04-01 21:15:15 · 2049 阅读 · 1 评论 -
04-树6 Complete Binary Search Tree (30分)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:The left subtree of a node contains only nodes with keys less than the node’s key. The right subtr原创 2017-04-02 09:48:33 · 645 阅读 · 0 评论 -
03-树1 树的同构 (25分)
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。 现给定两棵树,请你判断它们是否是同构的。 输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数NN (\le 10≤10),即该树的结点数(此原创 2017-04-02 09:51:17 · 801 阅读 · 0 评论 -
05-树7 堆中的路径 (25分)
将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。输入格式:每组测试第1行包含2个正整数NN和MM(\le 1000≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的NN个要被插入一个初始为空的小顶堆的整数。最后一行给出MM个下标。输出格式:对输入中给出的每个下标i,在一行中输出从H[i]到原创 2017-04-02 11:16:56 · 799 阅读 · 0 评论 -
05-树8 File Transfer (25分)
We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer to another. Is it possible to send a file from any computer o原创 2017-04-02 15:58:55 · 877 阅读 · 0 评论 -
06-图3 六度空间 (30分)
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。 图1 六度空间示意图 “六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史原创 2017-04-15 21:54:43 · 816 阅读 · 0 评论 -
06-图1 列出连通集 (25分)
给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N-1N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:输入第1行给出2个整数NN(0#include <iostream>#include <cstring>#include <queue>using namespace std;class Graph原创 2017-04-16 10:13:55 · 729 阅读 · 0 评论 -
06-图2 Saving James Bond - Easy Version (25分)
This time let us consider the situation in the movie “Live and Let Die” in which James Bond, the world’s most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land a原创 2017-04-16 12:31:22 · 697 阅读 · 0 评论 -
07-图4 哈利·波特的考试 (25分)
哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。现在哈利·波特的手里有一本教材,里面列出了所有的变原创 2017-04-29 16:17:19 · 540 阅读 · 0 评论 -
07-图6 旅游规划 (25分)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。输入格式:输入说明:输入数据的第1行给出4个正整数NN、MM、SS、DD,其中NN(2\le N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0~(N-1N−1);MM是原创 2017-05-01 06:54:13 · 823 阅读 · 0 评论 -
08-图7 公路村村通 (30分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。输入格式:输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道路数目MM(\le 3N≤3N);随后的MM行对应MM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到NN编号。输出格式:输出村村通需要的最原创 2017-05-12 19:31:58 · 626 阅读 · 0 评论 -
09-排序2 Insert or Merge (25分)
According to Wikipedia:Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion sort removes one element from the input data, fi原创 2017-05-13 07:05:05 · 726 阅读 · 0 评论 -
10-排序4 统计工龄 (20分)
给定公司NN名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。输入格式:输入首先给出正整数NN(\le 10^5≤10 5 ),即员工总人数;随后给出NN个整数,即每个员工的工龄,范围在[0, 50]。输出格式:按工龄的递增顺序输出每个工龄的员工个数,格式为:“工龄:人数”。每项占一行。如果人数为0则不输出该项。输入样例:8 10 2 0 5 7 2 5 2 输出样例:0:1原创 2017-05-19 14:30:59 · 829 阅读 · 0 评论 -
10-排序5 PAT Judge (25分)
The ranklist of PAT is generated from the status list, which shows the scores of the submissions. This time you are supposed to generate the ranklist for PAT.Input Specification:Each input file contain原创 2017-05-19 16:23:26 · 825 阅读 · 0 评论 -
11-散列1 电话聊天狂人 (25分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。输入格式:输入首先给出正整数NN(\le 10^5≤10 5 ),为通话记录条数。随后NN行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。输出格式:在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出原创 2017-05-19 18:18:10 · 953 阅读 · 0 评论 -
11-散列2 Hashing (25分)
The task of this problem is simple: insert a sequence of distinct positive integers into a hash table, and output the positions of the input numbers. The hash function is defined to be H(key) = key \%原创 2017-05-21 19:46:31 · 943 阅读 · 0 评论 -
11-散列3 QQ帐户的申请与登陆 (25分)
实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。输入格式:输入首先给出一个正整数NN(\le 10^5≤10 5 ),随后给出NN行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息原创 2017-05-21 20:51:42 · 709 阅读 · 0 评论