
数据结构与算法
文章平均质量分 63
peng_weida
多多交流!
展开
-
跨楼梯/台阶问题
问题描述:某楼梯共有N阶,一次可以跨一阶,也可以跨两阶,问总共有多少种走法~ 采用递归的方法来完成。 代码如下: #include #include int g_num = 0; void f(int step, int n); int main() { int n; printf("pls input n : "); scanf("%d", &n); f(1, n);原创 2012-06-14 21:38:35 · 1900 阅读 · 0 评论 -
单链表排序
写得很复杂,没有写在一个函数中,而是分了三个函数,也没去仔细检查,写在这方便查看,有错大家就指出哈 结构体定义为: typedef struct _list { int data; int key; struct _list *next; }LIST; 要求按字段data大小排序 思路: 1. 找到字段data最小的节点 2.将步骤1中找到的节点移至头节原创 2013-03-16 12:18:50 · 800 阅读 · 0 评论 -
快速排序、堆排序、希尔排序实现
#include #include #include void swap(int *a, int *b); void quick_sort(int array[], int low, int heigh); int partion(int array[], int low, int heigh); void init_heap(int array[], int id, int len)原创 2012-06-15 15:13:00 · 586 阅读 · 0 评论 -
排列组合
概念就不用具体介绍了,这个不太容易忘记。 说下公式: 从n个不同元素中取出m个元素的排列数A(n,m) = n(n-1)(n-2)....(n-m+1) = n! / (n-m)! 从n个不同元素中取出m个元素的组合数C(n,m) = A(n,m) / m!= n!/ ((n-m)!* m!) C(n,m) = C(n,n-m) C(n,k) + C(n,k+1) = C(n+1,原创 2012-07-17 17:20:26 · 766 阅读 · 0 评论 -
决胜出比赛第一名
问题描述: 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。.......原创 2012-07-03 16:53:16 · 1021 阅读 · 0 评论 -
求一个矩阵中最大的矩阵(元素和最大)(二维情况)
问题描述:如: 1 2 0 -3 -4 -2 -3 4 5 1 -1 -1 5 3 0 中最大的二维矩阵是: 4 5 1 5 3 0 其元素和为18。 参考编程之美2.15:子数组之和的最大值(二维) 算法:假设矩阵为N行M列,枚举这个矩阵上下边界,然后再利用一维情况下的方法确定左右边界,就可以将二维问题的解。时间复杂度:O(N*N*M)原创 2012-07-03 16:46:03 · 2173 阅读 · 0 评论 -
一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
本文代码参考网址:http://blog.youkuaiyun.com/v_july_v/article/details/6870251 问题描述:一个整数数组,长度为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 算法分析原创 2012-07-12 20:34:17 · 11748 阅读 · 8 评论 -
二叉树的遍历(递归和非递归)
包括前序、中序、后序的递归与非递归,以及层次遍历 前序非递归 (1) 当节点不为空时,访问完该节点数据后,该节点需要进栈保存,然后访问其左子树节点 (2) 当栈中节点出栈时,说明该节点及其左子树节点已经访问完成,出栈后进入其右子树进行访问 中序非递归 (1) 和前序非递归类似,不同的是访问节点数据的时机,在出栈时访问即可 后序非递归 (1) 需要一个标志来记录该节点数原创 2012-07-06 22:01:52 · 761 阅读 · 0 评论 -
求解无向连通图的关节点
参考数据结构(C语言版)第七章,算法7.10和7.11 求解思路 1.深度优先生成树的根是关节点的充要条件是它至少有两个子女 2.任何其它顶点u是关节点的充要条件是u至少有一个子女w,使得经过只由w,w的后代以及一条回边构成的路径不可能到达u的祖先,因为删除顶点u及其关联的边将使w及其后代与u的祖先断开联系。 假设顶点w的祖先包括w本身,为了表示一个顶点经过其后代以及一条回原创 2012-07-05 23:31:13 · 6439 阅读 · 0 评论 -
有向图的最长路径及是否存在环路结构
问题描述: 有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以连接。问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。 分析: 把每个字符串看成一个图的顶点,两个字符串可以连接就形成一条有向边。相当于判断一个有向图是否存在环以及求该有向图的最长路径。 可用图的深度优先遍历算法来求解,图用邻接表表示。 1. 求解有原创 2012-07-04 12:26:24 · 5365 阅读 · 4 评论 -
kmp算法实现
#include #include #include void get_next(const char* str, int next[]); int run_kmp(const char* src, const char* dest); int main() { char *src = "cadababc"; char *dest = "aac"; int loc = run_km原创 2012-06-15 15:23:37 · 520 阅读 · 0 评论 -
查找最小的K个元素
问题描述: 输入n个整数,输出其中最小的k个。 例如:输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 解决方案: 用数组来存储这n个数,遍历前k个树,对前k个数建立大顶堆,继续遍历数组剩余元素, 每遍历一个,都与堆顶元素相比较,若其值小于堆顶元素,则它们相互交换,并更新堆,使其仍然保持大顶堆特性。 代码实现: #include #i原创 2012-06-15 14:40:36 · 1051 阅读 · 0 评论 -
交换两序列a,b中的元素,使序列a的和与序列b的和之间的差值最小
参考网址:http://blog.youkuaiyun.com/v_JULY_v/article/details/6126444 第32题 问题描述: 有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小 代码实现: #include #include #include void swa原创 2012-06-15 15:08:27 · 1591 阅读 · 0 评论 -
栈的push、pop序列
参考网址:http://blog.youkuaiyun.com/v_JULY_v/article/details/6126444 问题描述: 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。 因原创 2012-06-15 14:57:01 · 490 阅读 · 0 评论 -
BM算法实现
main文件: #include "BM.h" //BF算法(朴素模式匹配算法):时间复杂度O(strlen(src)*strlen(dest)), 空间复杂度O(1) //KMP:时间复杂度O(strlen(src)+strlen(dest)), 空间复杂度O(strlen(dest)) //BM :时间复杂度最好O(strlen(src)/strlen(dest)), 最坏O(strl原创 2012-06-15 15:18:30 · 1232 阅读 · 0 评论 -
字符串编辑距离
这篇文章是在新浪博客上写的,现搬过来,算是第一篇吧~ 题目如下,最后给出实现代码,该代码仍在测试中,仅供学习交流! 编写一个程序计算两个字符串的编辑距离。编辑距离的定义和计算方法如下: Given two strings A and B, edit A to B with the minimum number of edit operations: a) .Replace a原创 2012-06-14 11:20:07 · 4069 阅读 · 0 评论