数据结构与算法
axiqia
这个作者很懒,什么都没留下…
展开
-
k-d tree算法原理
k-d tree算法原理 k-d树( k-维树的缩写)是在k维欧几里德空间组织点的数据结构。k-d树可以使用在多种应用场合,如多维键值搜索(例:范围搜寻及最邻近搜索)。k-d树是空间二分树(Binary space partitioning )的一种特殊情况。—— 维基百科从二叉查找树(Binary Search Tree)开始二叉查找树(Binary Search Tree...原创 2018-04-07 20:53:06 · 2510 阅读 · 3 评论 -
计算矩阵连乘积
描述:在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。计算C=AB总共需要p×q×r次乘法。现在的问题是,给定n个矩阵{A1,A2,…,An}。其中Ai与Ai+1是可乘的,i=1,2,…,n-1。要求计算出这n个矩阵的连乘积A1A2…An最少需要多少次乘法。输原创 2016-04-15 12:58:44 · 2514 阅读 · 0 评论 -
防卫导弹(最长下降子序列)
描述:一种新型的防卫导弹可截击多个攻击导弹。它可以向前飞行,也可以用很快的速度向下飞行,可以毫无损伤地截击进攻导弹,但不可以向后或向上飞行。但有一个缺点,尽管它发射时可以达到任意高度,但它只能截击比它上次截击导弹时所处高度低或者高度相同的导弹。现对这种新型防卫导弹进行测试,在每一次测试中,发射一系列的测试导弹(这些导弹发射的间隔时间固定,飞行速度相同),该防卫导弹所能获得的信息包括各进攻导原创 2016-04-14 20:31:06 · 942 阅读 · 0 评论 -
田忌赛马(tian ji racing)
描述田忌与齐王赛马,双方各有n匹马参赛(nTian Ji and the king play horse racing, both sides have n horse (n is no more the 100), every game a bet of 1 gold, now known king and Tian Ji each horse's speed, and the king原创 2016-04-15 16:52:20 · 818 阅读 · 0 评论 -
最长公共子序列
描述一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=,则另一序列Z=是X的子序列是指存在一个严格递增的下标序列 ,使得对于所有j=1,2,…,k有:Xij = Zj如果一个序列S即是A的子序列又是B的子序列,则称S是A、B的公共子序列。求A、B所有公共子序列中最长的序列的长度。 输入输入共两行,每行一个由字母和数字组成的字符原创 2016-04-14 19:28:42 · 589 阅读 · 0 评论 -
0-1背包(回溯法)
描述: 有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。输入: 多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n输出: 对于每个测例在单独的一行内输出Yes或No。输入样例: 7 8 28 77 9 28 8原创 2016-04-01 17:00:07 · 1450 阅读 · 1 评论 -
六数码
描述:现有一两行三列的表格如下:A B CD E F把1、2、3、4、5、6六个数字分别填入A、B、C、D、E、F格子中,每个格子一个数字且各不相同。每种不同的填法称为一种布局。如下:1 3 52 4 6布局12 5 64 3 1布局2定义α变换如下:把A格中的数字放入B格,把B格中的数字放入E格,把E格中的数字放入D格,把D格中原创 2016-04-25 23:13:23 · 857 阅读 · 0 评论 -
独轮车
描述:独轮车的轮子上有红、黄、蓝、白、绿(依顺时针序)5种颜色,在一个如下图所示的20*20的迷宫内每走一个格子,轮子上的颜色变化一次。独轮车只能向前推或在原地转向。每走一格或原地转向90度均消耗一个单位时间。现给定一个起点(S)和一个终点(T),求独轮车以轮子上的指定颜色到达终点所需的最短时间。输入:本题包含一个测例。测例中分别用一个大写字母表示方向和轮子的颜色,其对原创 2016-04-25 13:15:12 · 1515 阅读 · 0 评论 -
踩气球ZOJ1003
描述: 六一儿童节,小朋友们做踩气球游戏,气球的编号是1~100,两位小朋友各踩了一些气球,要求他们报出自己所踩气球的编号的乘积。现在需要你编一个程序来判断他们的胜负,判断的规则是这样的:如果两人都说了真话,数字大的人赢;如果两人都说了假话,数字大的人赢;如果报小数字的人说的是真话而报大数字的人说谎,则报小数字的人赢(注意:只要所报的小数字是有可能的,即认为此人说了真话)。输入:原创 2016-04-08 14:50:22 · 2446 阅读 · 0 评论 -
农场灌溉问题ZOJ2412
描述:一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。输入:给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图输出:编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。输入样例:2 2DKHF3 3ADCFJKIHE-1 -1输出样例:2原创 2016-04-07 20:54:07 · 2249 阅读 · 0 评论 -
二叉排序树
描述已知二叉排序树中结点数据域为整数,根据键盘输入不同个数的数据构造二叉排序树,设计递归算法输出树中所有大于或等于给定值x的结点,并以函数的参数返回输出的结点个数并打印。假设以二叉链表为存储结构,其结点结构为:lchild data rchild 输入先输入数据的个数n,然后连续的n行每行一个正整数表示结点的值,最后输入正整数x。 输出先序输出树中原创 2016-03-25 22:51:20 · 1256 阅读 · 0 评论 -
开放定址法处理冲突
描述选取哈希函数H(k)=(3k) MOD 11。用开放定址法处理冲突,其中di=i((7k) MOD 10+1)(i=1,2,3...)。在0~10的散列地址空间中给出的关键字序列构造哈希表,并统计出查找这些关键字的实际比较次数,输出平均查找长度。 输入关键字序列(关键字总数小于11) 输出平均查找长度(保留小数点后三位) 输入样例22 41 53 46原创 2016-03-25 22:47:24 · 4872 阅读 · 0 评论 -
最短路径的Dijkstra算法(邻接表)
描述 以邻接表作为存储结构实现,求解从给定源点到给定结束点的最短路径。 输入从1开始表示第一个节点。第一行输入:顶点数n(2第二行输入有向边:起始点s1,结束点 s2,边权值 w第三行输入:源点start,终点end 输出若存在路径,输出路径长度;若不存在,输出-1。 输入样例6 81 6 1001 5 301 3原创 2016-03-25 22:38:17 · 22770 阅读 · 1 评论 -
深度优先搜索/广度优先搜索顶点之间的路径(邻接表)
描述 给出一个有向图(节点个数 输入从1开始表示第一个节点。第一行输入: 有向图的边数n,测例的个数m。之后n行输入:用来描述边,如2 4表示存在一条由顶点2到4的边。之后是m行输入:用来给出要测的路径,如2 5表示是否存在由顶点2到顶点5的路径。 输出对于每个测试例子输出一个结果并占一行。输出 Y表示源点和终点之间没有路径输出 N表示源点原创 2016-03-25 22:34:41 · 4721 阅读 · 0 评论 -
用迪杰斯特拉算法求赋权图中的最短路径
描述用迪杰斯特拉算法求一点到其余所有结点的最短路径。 输入先输入一个小于100的正整数n,然后的n行输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),最后输入两个0到n-1的整数表示两个点, 输出用迪杰斯特拉算法求第一个点到其余所有结点的最短路径。并输出这两个点之间的最短路径(按顺序输出最短路径上的每一个点,每个数据占一行)。 输入样例40原创 2016-03-25 22:32:36 · 4681 阅读 · 0 评论 -
求赋权图中一个结点到所有结点的最短路径的长度
描述给一个赋权图(无向图),求0号结点到其余所有结点的最短路径的长度。 输入先输入一个正整数n,然后输入赋权图的邻接矩阵(10000表示无穷大) 输出按结点编号的顺序输出0号结点所有结点的最短路径的长度。 输入样例60 1 4 10000 10000 100001 0 2 7 5 100004 2 0 10000 1 1000010000 7原创 2016-03-25 22:31:06 · 4566 阅读 · 0 评论 -
输出以二叉树表示的算术表达式
描述编写一个程序,输出以二叉树表示的算术表达式,若表达式中有括号,则应在输出时加上 输入按先序输入一行字符,其中#表示取消建立子树节点 输出输出以二叉树表示的算术表达式 输入样例*+a(###b#)##c## 输出样例(a+b)*c#include #include #include #include using namesp原创 2016-03-25 22:29:01 · 4394 阅读 · 2 评论 -
找倍数
描述:对于每个输入的数字(如:2),则要求 给出一个由1,0构成的十进制整数,且该整数为输入数字的某个倍数,且是满足该条件的最小数(如2对应的10)。输入:数字n,n等于0时停止。输出:n的一个满足条件的最小倍数。输入样例:20输出样例:10#include #include using namespace s原创 2016-04-29 00:50:57 · 887 阅读 · 0 评论 -
polygon-Graveyard(poj3154)
描述:在一个周长为10000的圆上等距分布着n个点,即这n个点是一个正n边形的顶点。现在要另加m个点到圆上,新加的m个点可以任意选择位置(可以与原有的点重合)。然后将这n+m个点中的一些点延圆周移动,最终使n+m个点均匀分布,即在一个正n+m边形的顶点上。输出最小总移动距离。输入:输入两个整数 n, m。 (2≤n≤1000, 1≤m≤1000). 输出:输出最原创 2016-04-29 08:56:53 · 904 阅读 · 0 评论 -
推箱子
描述:绝大多数人都玩过推箱子的游戏,控制一个人将箱子推动到目标位置即获得胜利。现请你编写一个程序,判断将箱子推到目标位置至少需要多少步。输入:推箱子的平面区域为固定大小(10*10),使用10行10列输入推箱子的初始局面。其中,0代表空格,1代表墙,2代表箱子,3代表目标位置,4代表人。注:游戏中只有一个箱子,一个目标位置,一个人。输出:输出将箱子推到目原创 2016-04-29 14:54:20 · 2418 阅读 · 0 评论 -
静态链表
静态链表 用数组描述的链表,即称为静态链表。在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标cur。基本结构//---------线性表的静态单链表存储结构--------#define MAXSIZE 100typedef struct{ ElemType data; int cur;}SLinkList[MA原创 2016-01-17 16:13:42 · 4910 阅读 · 3 评论 -
最长不下降子序列的O(n^2)算法和O(nlogn)算法
问题描述:设有一个正整数序列a[n]a[n]: a1,a2,...,ana_1, a_2, ..., a_n ,对于下标i1i2...ihi_1 ,若有ai1,ai2,...,aiha_{i_1}, a_{i_2}, ..., a_{i_h}, 则称序列a[n]a[n]含有一个长度为h的不下降子序列。例如,下列数13 7 9 16 38 24 27 38 44 49原创 2017-08-20 15:39:16 · 5766 阅读 · 0 评论 -
异常检测RX算法
出处:Regularization for spectral matched filter and RX anomaly detectorfunction [result] = RxDetector(X)% Inputs% X - 2D data matrix (p x N)% Outputs% result - Detector output (1 x N)% sigma原创 2017-04-03 15:35:24 · 9087 阅读 · 4 评论 -
异常检测LRR算法
出处:Robust Subspace Segmentation by Low-Rank Representationfunction [Z,E] = lrra(X,A,lambda)% This routine solves the following nuclear-norm optimization problem,% which is more general than "lrr.m"%原创 2017-04-03 15:46:58 · 3894 阅读 · 2 评论 -
矩阵范数优化
优化算法:矩阵的2范数:矩阵的核范数和1范数原创 2017-04-01 19:49:18 · 1687 阅读 · 0 评论 -
康托展开 全排列
对于n个数的全排列,共有n!中排列方式,如何求某一个序列在整个排列中的次序(从小到大)?以9的全排列举例:842697513是1-9全排列的第几个?(高中数学排列组合问题,只需要做到不重不漏)首先看第一位为8,那么第一位为1-7的全排列都比它小,共有7*8!个。在第一位为8的情况下,其次看第二位为4,那么第二位为1-3的全排列都比它小,共有1*3*7!个。在第一位为8,第二位为4的原创 2016-05-08 16:55:46 · 4900 阅读 · 3 评论 -
跳马
描述: 有一只电子老鼠被困在如下图所示的迷宫中。这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部分是路。电子老鼠可以在路上向上、下、左、右行走,每一步走一个格子。现给定一个起点S和一个终点T,求出电子老鼠最少要几步从起点走到终点。输入: 本题包含一个测例。在测例的第一行有四个由空格分隔的整数,分别表示起点的坐标S(x.y)和终点的坐标T(x,y)。从第二行原创 2016-04-22 15:34:32 · 1072 阅读 · 0 评论 -
电子老鼠闯迷宫
#include #include using namespace std;int sx, sy, fx, fy;char maze[13][13];int visited[13][13];int dir[4][2]= {{0,1}, {1,0}, {0,-1}, {-1,0}};struct Node{ int x; int y; N原创 2016-04-22 15:15:32 · 2146 阅读 · 1 评论 -
数独
#include using namespace std;char a[9][9];bool legal(int x, int y, char v){ for(int i = 0; i < 9; i++) { if(i != x && a[i][y] == v) //同一列 return false; if(原创 2016-05-16 00:08:47 · 1712 阅读 · 0 评论 -
M着色
描述四色问题的内容是:“任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色”。用数学语言表示,即“将平面任意地细分为不相重迭的区域,每一个区域总可以用1,2,3,4这四个数字之一来标记,而不会使相邻的两个区域得到相同的数字。”本程序对给定的区域图找出所有可能的不超过四种颜色的着色方案。简单起见,10个区域。且只要求输出着色方案数即可。 输入一个10*10的矩阵A原创 2016-05-17 23:53:34 · 848 阅读 · 0 评论 -
加1乘2平方
描述给定两个正整数m、n,问只能做加1、乘2和平方这三种变化,从m变化到n最少需要几次 输入输入两个10000以内的正整数m和n 输出输出从m变化到n的最少次数 输入样例1 16 输出样例3#include #include using namespace std;int m, n;原创 2016-05-17 23:30:59 · 2598 阅读 · 3 评论 -
花生米(三)
描述五一长假第三天,Tom和Jerry在仓库散步的时候又发现了一堆花生米(仓库,又见仓库……)。这次Tom制定分花生米规则如下: ???????1、Tom和Jerry轮流从堆中取出k粒花生米吃掉; 2、第一次取花生米的人只能取一粒,以后取花生米的数量不能超过前一个人取花生米数量的两倍; 3、为显示规则的公平性,Jerry可以选择先取或者后取。 Jerry当然还是希望最后一粒花生原创 2016-04-20 16:44:24 · 1109 阅读 · 0 评论 -
花生米(二)
描述五一长假第二天,Tom和Jerry在仓库散步的时候又发现了一堆花生米(这个仓库还真奇怪)。这次Tom制定分花生米规则如下: 1、Tom和Jerry轮流从堆中取出k粒花生米吃掉,k可以是1,5,10中的任意一个数字; 2、为显示规则的公平性,Jerry可以选择先取或者后取。 Jerry当然还是希望最后一粒花生米被Tom吃掉。请计算,Jerry为了达到目原创 2016-04-20 15:49:50 · 1538 阅读 · 0 评论 -
旅游预算
描述一个旅行社需要估算乘汽车从某城市到另一城市的最小费用,沿路有若干加油站,每个加油站收费不一定相同。旅游预算有如下规则: 若油箱的油过半,不停车加油,除非油箱中的油不可支持到下一站;每次加油时都加满;在一个加油站加油时,司机要花费2元买东西吃;司机不必为其他意外情况而准备额外的油;汽车开出时在起点加满油箱;计算精确到分(1元=100分)。编写程序估计实际行驶在某路线所需的最小费用。原创 2016-04-19 11:01:55 · 2414 阅读 · 0 评论 -
八数码(康托展开)
#include #include #define LEN 362888 //状态共9!=362880种using namespace std;int dir[4][2] = {{1,0}, {-1,0}, {0,1}, {0,-1}};int visited[LEN]; //状态标记,步骤记录int dis[LEN];int原创 2016-05-13 15:18:05 · 2507 阅读 · 0 评论 -
逆康托展开+全排列
康托展开原公式:把一个整数X展开成如下形式:X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[2]*1!+a[1]*0!其中a[i]为当前未出现的元素中是排在第几个(从0开始),并且0 知道康托展开展开以后,我们可以很容易的得到一种新的求1-n全排列的方法,只需要求出1-n全排列中的第一个,第二个原创 2016-05-11 00:30:45 · 1261 阅读 · 0 评论 -
石子合并
描述在一个圆形操场的四周摆放着n堆石子(n4 4 5 9 score: 08 5 9 score: 813 9 score: 8 + 13 = 2122 score: 8 + 13 + 22 = 43 输入可能有多组测试数据。 当输入n=0时结束! 第一行为石子堆数n(1 输出合并的最小得分,每个结果一行。 输入样例4 4 4 5 9 0原创 2016-04-18 12:14:39 · 776 阅读 · 0 评论 -
建立二叉树的二叉链表
描述已知二叉树的中序序列和前序序列存放在两个一维数组中,尝试建立二叉树的二叉链表。检查是否建立成功的方法是输出该二叉树的后序序列。 输入分别输入二叉树的中序序列和前序序列 输出输出二叉树的后序序列 输入样例ABCDEGFCBEGDFA 输出样例CGEFDBA#include #include原创 2016-03-25 22:26:53 · 8135 阅读 · 0 评论 -
用括号法递归建立二叉树
描述如果用大写字母标识二叉树节点,则一棵二叉树可以用以下字母序列建立,#表示空节点。试写一个递归算法,有这种形式的字符序列,建立相应的二叉树的二叉链表存储结构,并按层次遍历输出。如一棵二叉树可表示为:A(B(#,D),C(E(#,F),#)) 输入按题中要求,用括号法输入二叉树序列,#表示空节点 输出按层次遍历建立好的二叉树并输出 输入样例A(B(#,D),原创 2016-03-25 22:24:10 · 5066 阅读 · 0 评论 -
计算二叉树中叶子节点的数目
描述先序建立一棵二叉树,采用二叉链表结构存储,并计算该二叉树中叶子节点的数目。 输入输入一串先序遍历字符串,根据此字符串建立一棵二叉树(以指针方式存储)。如输入某二叉树的先序序列为ABC##DE#G##F###(其中#表示空格字符,空格字符代表空树)。 输出输出叶子节点的个数(输出结果后换行)。 输入样例ABC##DE#G##F### 输出样原创 2016-03-25 22:18:11 · 4056 阅读 · 0 评论