
数据结构与算法
文章平均质量分 60
xc889078
这个作者很懒,什么都没留下…
展开
-
数据结构--循环队列
转载地址:http://www.cnblogs.com/yjsoft/archive/2008/10/06/1304759.html实现队列的方法很多,比如动态数组、链表,今天主要介绍循环队列首先说用静态数组实现简单队列。很显然,当队列满后,即便全部元素都出队,队列还是满的状态。这种情况就叫做“假溢出”,即数组中明明有可用空间,但却无法使用。这是由定长数组的特性决定的。但我转载 2013-04-16 20:05:55 · 589 阅读 · 0 评论 -
求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法
参考:http://blog.youkuaiyun.com/cxllyg/article/details/7610265 题目:求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法。分析:1. 最简单也是最直接的算法是,删除一个点然后判断连通性,如果删除此点,图不再连通,则此点是割点,反之不是割点(图的连通性一般通过深搜来判定,是否能一次搜索完 全部顶点);原创 2013-08-29 19:35:31 · 2894 阅读 · 0 评论 -
有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误
有n 个长为m+1 的字符串, 如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接, 问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。思路:利用弗洛伊德算法可求最长路径。#include #include using namespace std;#define INFINITY -100000 //求最长路径时原创 2013-08-29 11:23:57 · 1336 阅读 · 0 评论 -
最短路径—弗洛伊德算法
#include #include using namespace std;typedef struct graph{ string vertex[10]; int arc[10][10]; int num_vertex; int num_edge;}graph;int get_location(graph g, string s){ int原创 2013-08-27 22:38:09 · 727 阅读 · 0 评论 -
n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系, 存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强的一支。
n 支队伍比赛,分别编号为0,1,2......n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强的一支,所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是4 对3, 5 对8。然胜者晋级,败者淘汰,同一轮淘汰原创 2013-08-27 19:31:57 · 1448 阅读 · 0 评论 -
在人人好友里,A和B是好友,B和C是好友,如果A 和C不是好友,那么C是A的二度好友,在一个有10万人的数据库里,如何在时间0(n)里,找到某个人的十度好友
在人人好友里,A和B是好友,B和C是好友,如果A 和C不是好友,那么C是A的二度好友,在一个有10万人的数据库里,如何在时间0(n)里,找到某个人的十度好友。最短路径问题,每个人一个顶点,是好友距离为1否则为无穷大,输出最小距离为10的顶点就好原创 2013-08-04 21:31:13 · 2241 阅读 · 0 评论 -
求数组元素的乘积
题目:一个长度为n的数组a[0],a[1],...,a[n-1]。现在更新数组的名个元素,即a[0]变为a[1]到a[n-1]的积,a[1]变为a[0]和a[2]到a[n-1]的积,...,a[n-1]为a[0]到a[n-2]的积。程序要求: 要求具有线性复杂度;不能使用除法运算符。思路:对a[i]的值将其分为两部分a[0]*a[1]*a[2]...*a[i-1]和a[i+1]*a[i原创 2013-08-04 20:03:55 · 3846 阅读 · 0 评论 -
已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10()
1.rand7执行两次,出来的数为a1=rand7()-1,a2=rand7()-1. 2.如果a1*7+a2=40,重复第一步。#include #include #include int rand7(){ return rand()%7+1;//产生随机数1~7}int rand10(){ int a1,a2,a3; do { a1 = rand7()-原创 2013-08-03 19:47:21 · 1109 阅读 · 0 评论 -
系统有很多任务,任务之间有依赖,比如B依赖于A,则A执行完后B才能执行
转载地址:http://blog.youkuaiyun.com/fivedoumi/article/details/8013063 系统有很多任务,任务之间有依赖,比如B依赖于A,则A执行完后B才能执行(1)不考虑系统并行性,设计一个函数(Task *Ptask,int Task_num)不考虑并行度,最快的方法完成所有任务。(2)考虑并行度,怎么设计 typedef s转载 2013-08-04 18:42:50 · 3782 阅读 · 0 评论 -
1分2分5分的硬币,组成1角,共有多少种组合
第一种情况:只计算组合总数,不需要列出各种组合设1分个数为x,2分个数为y,5分的硬币个数为z,则1*x+2*y+5*z=10;5*z=10-x-2*y;即:当z=0时,x可以取得值为10、8、6、4、2、0 (6种)当z=5时,x可以取得值为5、3、1 (3种)当z=10时,x可以取得值为0 (1种)总的组合数为6+3+1=10种因此,按照规律,本题目组合总数原创 2013-08-04 18:20:59 · 2415 阅读 · 1 评论 -
将多个集合合并成没有交集的集合
给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。(1)请描述你解决这个问题的思路;(2)请给出主要的处理流程,算法,以及算法的复杂度(3)请描述可转载 2013-08-04 10:31:59 · 976 阅读 · 0 评论 -
输入n,输出对应的所有长度为n的二进制串
#include #include #include using namespace std;void print(int n){ int max = (int)pow((double)2,(double)n); unsigned int mask = 0x00000001; int i,j; stack stack1; for(i=0;i<max;i++) { for原创 2013-07-04 11:34:31 · 2030 阅读 · 0 评论 -
最短路径—迪杰斯特拉算法
#include #include using namespace std;typedef struct Graph{ string vertex[10]; int arc[10][10]; int num_vertex; int num_edge;}Graph;int get_location(Graph g, string s){ int原创 2013-07-03 11:38:41 · 756 阅读 · 0 评论 -
最小生成树—普里姆算法
普利姆算法实际上就是用一个数组存储最小生成树中的顶点,然后不断寻找这么一条边:边的一端是存在数组中的顶点,即最小生成树中的顶点,另一条边是最小生成树外的顶点,在满足这个条件下找到路径权值最小的边,并将边中原先并不在最小生成树中的顶点加入到最小生成树中,最终数组中的顶点即最小生成树的顶点数量等于图的顶点数量。算法时间复杂度:0(n^2),适用于稠密图#include #include u原创 2013-07-02 10:46:42 · 782 阅读 · 0 评论 -
最小生成树—克鲁斯卡尔算法
#include #include using namespace std;typedef struct Edge//边集数组{ int begin;//边起始下标 int end;//边终止下标 int weight;//边权重}Edge;typedef struct Graph{ string vertex[10]; Edge edge[原创 2013-07-03 09:35:37 · 612 阅读 · 0 评论 -
一串首尾相连的珠子(m 个),有N 种颜色(N<=10), 设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短
一串首尾相连的珠子(m 个),有N 种颜色(N#include #include #define N 256int allin(char *b, int *c){ for(unsigned int i=0; i < strlen(b); i++) { if(c[b[i]] == 0) return 0; } return 1;}void find_short原创 2013-08-29 21:23:14 · 1958 阅读 · 0 评论 -
一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值
一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值 比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2,4}{6} m=3 所以m 的最大值为3。#include bool function_core(int *a, int n, int m, int groupsum, int *group, i原创 2013-08-31 17:06:49 · 1577 阅读 · 0 评论 -
Catalan数计算及应用
转载地址:http://blog.youkuaiyun.com/wuzhekai1985/article/details/6764858 问题描述:卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。输入一个整数n,计算h(n)。其递归式如下:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2,h(0) = h(1) = 1)转载 2013-08-31 22:43:33 · 700 阅读 · 0 评论 -
求两个有序数组的中位数
转载地址:http://blog.youkuaiyun.com/success041000/article/details/6685741如果有两个有序的数组,都是已经排好序的。那么求它们的中位数应该怎样求呢。如果采用对这两个数组进行排序的方法,最快的时间复杂度也要o(nlogn)的时间。但是,如果采用中位数和顺序统学的方法来寻找,则可以在o(n)的时间内解决这个问题。 我们先寻找每个数组转载 2013-04-30 14:41:30 · 789 阅读 · 0 评论 -
找单链表环的入口点
转载地址:http://blog.youkuaiyun.com/wuzhekai1985/article/details/6725263 问题1:如何判断单链表中是否存在环(即下图中从结点E到结点R组成的环)? 设一快一慢两个指针(Node *fast, *low)同时从链表起点开始遍历,其中快指针每次移动长度为2,慢指针则为1。则若无环,开始遍历之后fast不可能与low重合,转载 2013-07-25 17:17:15 · 699 阅读 · 0 评论 -
实现变量的加法、减法、乘法
转载地址:http://blog.youkuaiyun.com/hackbuteer1/article/details/8016173一种计算机,其有如下原子功能:1、赋值 a=b2、+1操作,++a; a+1;3、循环,但是只支持按次数的循环 for(变量名){/*循环里面对变量的修改不影响循环次数*/}4、只能处理0和正整数5、函数调用 fun(参数列表)转载 2013-05-14 11:29:47 · 1503 阅读 · 0 评论 -
快速排序(非递归算法)
转载地址:http://blog.youkuaiyun.com/martin_liang/article/details/8192691// 快速排序_非递归.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include using namespace std;int myArr转载 2013-05-03 16:36:02 · 586 阅读 · 0 评论 -
用两个队列实现一个栈
转载地址:http://hi.baidu.com/ozwarld/item/64b5e00c48d9b2cb90571887题目:说明如何用两个队列来实现一个栈,并分析有关栈操作的运行时间。解法:1.有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。2.现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,转载 2013-04-27 15:22:53 · 595 阅读 · 0 评论 -
计算循环队列元素个数
转载地址:http://blog.youkuaiyun.com/zz198808/article/details/7948428队列头指针为front,队列尾指针为rear,队列容量为M,则元素个数为|rear-front+M|%M,注意,这个%是求余运算。整理如下:队空:front==rear队满: (rear+1) mod maxsize ==front队中元素个数n=(rear-front+转载 2013-04-16 20:06:47 · 4726 阅读 · 0 评论 -
贪心算法—删数问题
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a 和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。算法的原理应该是说从最高位开始,一次向低位搜索,一旦遇到前一位(高位)的数大于当前位,则删去前一位,直到删除k个数,如果到达末尾还没有删除k个,则说明现在这个数已经是从小到大排序了,则从最低位开始删除要求的位数。#i原创 2013-06-28 17:24:14 · 8677 阅读 · 3 评论 -
石子合并
在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。#include #define N 100#define INF 65536 #define min(a,b) a<b?a:b#define max(a,b) a>b?a:原创 2013-09-05 11:36:55 · 769 阅读 · 0 评论 -
求随机数构成的数组中找到长度大于=3的最长的等差数列
参考:http://blog.youkuaiyun.com/zhanxinhang/article/details/6667868题:求随机数构成的数组中找到长度大于=3的最长的等差数列输出等差数列由小到大: 如果没有符合条件的就输出[0,0]格式:输入[1,3,0,5,-1,6]输出[-1,1,3,5]原创 2013-09-09 11:32:29 · 1061 阅读 · 0 评论 -
已知一个字符串,比如asderwsde,寻找其中的一个子字符串比如sde 的个数,如果没有返回0,有的话返回子字符串的个数。
已知一个字符串,比如asderwsde,寻找其中的一个子字符串比如sde 的个数,如果没有返回0,有的话返回子字符串的个数。KMP算法即可解决。#include #include int next[15];void makenext(char *b, int n){ int i = 0; next[i] = -1; int j = -1; while(i<n) {原创 2013-09-08 13:37:51 · 1383 阅读 · 1 评论 -
对称字符串的最大长度 — 曼彻斯特算法
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。以下分析参考:http://blog.youkuaiyun.com/hackbuteer1/article/details/6686263回文串定义:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。回文原创 2013-09-01 21:56:42 · 4208 阅读 · 0 评论 -
跳台阶问题 — 某阶台阶坏掉
有n阶台阶,一个人一次只能跳一下或者跳两下,其中某一阶台阶坏掉,不能跳到这个坏台阶,问一共有多少种跳法。#include int function(int n, int k){ if(k > n) return 0; if(n==1) return 1; if(n==2) return 2; int f1 = 1; int f2 = 2; int f; for(原创 2013-08-31 16:23:05 · 1974 阅读 · 0 评论 -
已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量.
已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18原创 2013-08-31 22:41:35 · 4494 阅读 · 2 评论 -
图的基本操作:图的创造(基于邻接表)、深度搜索(DFS)、广度搜索(DFS)
#include #include #include using namespace std;typedef struct Edgenode//边表结点{ int adjvex;//存储该节点对应的下标 struct Edgenode *next;//指向下一个边表结点}Edgenode;typedef struct Vertexnode//顶点表结点原创 2013-07-01 17:12:38 · 690 阅读 · 0 评论 -
判断有向图是否存在回路—拓扑排序
#include #include #include using namespace std;typedef struct Edgenode{ int adjvex; struct Edgenode *next;}Edgenode;typedef struct Vertexnode{ string data; Edgenode *firstedge;}Vertexno原创 2013-07-02 08:59:00 · 4777 阅读 · 0 评论 -
一个数组中除了两个数字之外,其余数字都出现了两次,找出这两个数字
#include int find_number1(int b){ int index = 0; while(index < 32) { if((b&1<<index) == (1<<index)) break; else index++; } return index;}int is_number1(int a, int index){ return原创 2013-06-04 21:15:34 · 624 阅读 · 0 评论 -
给定数组a[n]构造数组b[n]
给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度;除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、堆空间和全局静态变量等) #include void function(int a[], int b[], int n)原创 2013-06-04 15:35:57 · 826 阅读 · 0 评论 -
一个数组中除了三个数字之外,其余数字都出现了两次,找出这三个数字
分析:假设只出现一次的三个数字是a,b,c1. 首先遍历数组,xor代表所有值的异或和,最终,xor = a^b^c;2. 证明xor与a,b,c值得都不一样。如果xor与a值一样,那么xor = a^b^c = a, 也就是b^c=0,也就是b等于c,这与题目矛盾,所以xor与a,b,c的值都不一样,也就是xor^a,xor^b,xor^c都不为0;3. 函数find_1bit(原创 2013-06-05 10:24:54 · 1043 阅读 · 2 评论 -
找出被修改过的数字
n个空间(其中n例如:n=6,a=2,原始的串为5,3,7,6,2,4。现在被别人修改为-1,3,7,6,2,4。现在希望找到5。 解析:由于修改的数不是最小的,所以遍历第二个空间到最后一个空间可以得到a的值。a到a+n-1这n个数的和是total=na+(n-1)n/2。将第二个至最后一个空间的数累加获得sub_total。那么被修改的数就是total-sub_tot转载 2013-05-15 20:58:50 · 796 阅读 · 0 评论 -
寻找连续的元素相加之和为最大的序列
给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。如:1、-2、3、5、-4、6 连续序列3、5、-4、6的和最大。如元素全为负数,则最大的和为0,即一个也没有选。#include int begin=0,end=0;int find_max_sum(int a[], int n){ if(a == NULL || n <= 0)原创 2013-05-15 09:24:27 · 1429 阅读 · 0 评论 -
有一个单向循环链表队列,从头开始报数,当报到m或者m的倍数的元素出列,根据出列的先后顺序重新组成单向循环链表。
有一个单向循环链表队列,从头开始报数,当报到m或者m的倍数的元素出列,根据出列的先后顺序重新组成单向循环链表。#include #include struct node{ int value; node *next;};void createlist(node **head, int n){ if(head==NULL || n <= 0)原创 2013-05-10 21:35:58 · 989 阅读 · 0 评论 -
统计论坛在线人数
求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。解析:一天有60*60*24 = 86400秒创建一个大小为86400的整型数组num_change[86400],用于记录每一秒中人数的变化。遍历一遍日志文件,把登录时间对应的数组值加1,退出时间对应原创 2013-05-15 20:21:50 · 1011 阅读 · 0 评论