数据结构与算法
文章平均质量分 92
拳四郎
拳四郎
展开
-
数据结构——线性表
#include#define MaxSize 50typedef char ElemType;struct List{ ElemType list[MaxSize]; int size;}setnull(struct List *p)//置空{ p->size=0;}int length(struct List *p)//求长度{ return (p->size);}ElemType get原创 2010-04-20 00:51:00 · 1616 阅读 · 0 评论 -
算法导论-快速排序
一、算法描述快速排序是基于分治法的排序算法的一种。三个步骤:分解:数组A[p..r]被划分成两个子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每个元素都小于A[q],而且,小于等于A[q+1..r].下标q也在这个划分过程中进行计算。解决:通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]排序。合并:递归到最后已经全部有序,不原创 2012-10-11 21:18:53 · 1927 阅读 · 0 评论 -
动态规划-装配线调度
问题描述:一个找出通过工厂装配线的最快方式的制造问题。共有两条装配线,每一条装配线上有n个装配站,编号为j = 0, 1, … , n – 1。装配线i(i = 0或1),在装配站S[i][j]上所需的装配时间记为a[i][j]。一个汽车底盘进入工厂,然后进入装配线i的进入时间为e[i],在通过一条线的第j个装配站后,这个底盘来到任一条线的第(j + 1)个装配站。如果留在相同的装配线上,原创 2012-11-10 10:33:14 · 2081 阅读 · 0 评论 -
算法导论-数据结构的扩张
首先给出数据结构的扩张的四个步骤:1)选择基础的数据结构;2)确定要在基础数据结构中添加哪些信息;3)验证可以用基础数据结构上的基本修改操作来维护这些新添加的信息;4)设计新的操作。算法导论书上给出的是红黑树的一种扩张-动态顺序统计。将容量为n的随机样本的各个测定值 (x1,x2,……,xn),从小到大顺序的排列,xi所在的顺序位置就是它的顺序统计量。动态顺原创 2012-11-25 20:26:28 · 2133 阅读 · 0 评论 -
动态规划-最长公共子序列
问题描述某个序列的子序列是从最初序列通过去除某些元素但不破坏余下元素的相对位置而形成的新序列。给定两个序列X和Y,如果Z既是X的一个子序列又是Y的一个子序列,则称Z是X,Y的公共子序列。给定两个序列X={x1,x2...,xm}和Y={y1,y2...yn},找出Z={z0,z1,…,zk}为它们的最长公共子序列.最优子结构设X={x1,x2...,xm}和Y={y1,y2原创 2012-11-11 14:40:05 · 1938 阅读 · 0 评论 -
动态规划-最优二叉搜索树
问题描述给定一个由n个互异的关键字组成的序列K={k1,k2,...,kn},且关键字有序,对于每一个关键字ki,一次搜索为ki的概率是pi。某些搜索的值可能不在K内,因此还有n+1个虚拟键d0,d1,...,dn代表不再K内的值。d0代表所有小于k1的值,dn代表所有大于kn的值,对于i=1,2,...,n-1,di代表所有位于ki和ki+1之间的值。对每个虚拟键di,一次搜索对应于di的概原创 2012-11-11 19:10:51 · 3282 阅读 · 0 评论 -
动态规划-矩阵链乘
问题描述给定n个矩阵构成的一个链给定{A1,A2,…,An},其中i=1,2,...,n.矩阵Ai的维数为pi-1*pi,如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 最优子结构对乘积A1A2...An的任意加括号方法都会将序列在某个地方分成两部分,也就是最后一次乘法计算的地方,我们将这个位置记为k,也就是说首先计算A1...Ak和Ak+1...原创 2012-11-11 10:27:23 · 2209 阅读 · 0 评论 -
动态规划-最长上升子序列(LIS)
这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。利用LCS算法实现思路:设原序列为A[],将A[]进行排序后生成排好序的序列B[],利用LCS 算法查找A[],B[]的最长公共子序列即可找出LIC。时间复杂度:分原创 2012-11-27 16:48:08 · 3024 阅读 · 0 评论 -
算法导论-贪心策略
贪心的基本步骤:1)决定问题的最优子结构;2)设计出一个递归解;3)证明在递归的任一阶段,最优选择之一总是贪心选择。那么,做贪心选择总是安全的;4)证明通过做贪心选择,只有一个子问题;5)设计出一个实现贪心策略的递归算法;6)将递归算法转换成迭代算法。更一般的,可以用下面的方式来描述:1)将优化问题转化成先做出选择,再解决剩下的一个子问题;2)证明原问题原创 2012-12-03 19:32:39 · 1913 阅读 · 0 评论 -
算法导论-二叉排序树
一、定义与性质定义 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树.性质 (1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。 (2) 二叉排序树中,各结点关键字是惟一的。 注意:实际应用中,不能保证被查找的数据原创 2012-10-12 16:54:56 · 3146 阅读 · 0 评论 -
数据结构-栈(先进后出表)
//数据结构-栈(先进后出表)#include#define MaxSize 100typedef char ElemType;typedef struct{ ElemType stack[MaxSize]; int top;}stacktype;//初始化栈void initstack(stacktype *s){ s->top=-1;}原创 2010-05-09 00:24:00 · 2319 阅读 · 0 评论 -
算法导论-红黑树C++实现
红黑树的定义:一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树:1)每个节点或是红的,或是黑的。2)根节点是黑的。3)每个叶节点(NIL)是黑节点。4)如果一个节点是红的,则它的两个儿子都是黑的。5)对每个节点,从该节点到其子孙节点的所有路径上包含相同节点数目的黑节点。C++代码实现:BRTreeNode.h#ifndef BRTREENODE_原创 2012-11-10 09:50:03 · 3779 阅读 · 2 评论 -
贪心算法-活动选择
问题描述问题来自算法导论16.1。几个相互竞争的活动进行调度,他们要求以独占的方式使用某一公共资源。调度的目标是找出一个最大的相互兼容活动集合。思想:总是选择剩余活动中具有最早结束时间的活动。/*****************************************************************************Copyright: 2012原创 2012-12-03 22:21:03 · 2057 阅读 · 0 评论 -
考研复习(8)-图的基本操作
一。图的储存结构1.临接矩阵表示易确认两任意顶点是否有边,要确定有多少条则要遍历全图适合稠密图#include #include #define MAXVEX 100#define inf 2000000000typedef char vertexType;struct vertex{ int num; vertexType data;};typ原创 2011-09-04 08:59:07 · 1604 阅读 · 0 评论 -
acm基础2_排序1
<br />//差入排序<br />#include <stdio.h><br />#include <stdlib.h><br />#define MAXITEM 100<br />typedef char ElemType[5];//?<br />typedef struct node<br />{<br /> int key;<br /> ElemType data;<br />}elemnode[MAXITEM];<br />void insertSort(elemnode r,in原创 2011-04-22 22:50:00 · 1249 阅读 · 0 评论 -
详解KDTree
简介kd树(k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。一个KDTree的例子上图的树就是一棵KDTree,形似二叉搜索树,其实KDTree就是二叉搜索树的变种。这里的K = 3.首先来看下树的组织原则。将每一个元组按0排序(第一项序号为0,第二项序号为1,第三项序号为2),在树的第n层,第 n%3 项被用粗原创 2014-11-26 16:51:42 · 82956 阅读 · 22 评论 -
算法导论-AVL树的C++实现
代码主要来自网上流传的一份南京大学陈氏三姐妹的大作业。花了一些时间测试和修改,代码基本OK了,结构也比较清晰。我两把刷子,裸写的话没一个礼拜真下不来。#include #include #include #define EQ(a,b) ((a)==(b))#define LT(a,b) ((a)<(b))#define LQ(a,b) ((a)>(b))#define LH原创 2012-10-23 21:44:46 · 3477 阅读 · 2 评论 -
算法导论-透彻了解平衡二叉树(AVL树)
一.平衡二叉树 简介形态匀称的二叉排序树称为平衡二叉树 (Balanced binary tree) ,其每个结点的左子树和右子树的高度最多差1,严格定义是:一棵空树是平衡二叉树;若 T 是一棵非空二叉树,其左、右子树为 TL 和 TR ,令 hl 和 hr 分别为左、右子树的深度。当且仅当1)TL 、 TR 都是平衡二叉树; 2)| hl - hr |≤ 1;当然,二叉排原创 2012-10-22 23:31:28 · 5659 阅读 · 0 评论 -
c中关于指针的声明和定义的一些问题
首先说明一下,声明和定义是两个不同的概念,一个比较大的区别就是声明不分配空间,而定义分配。 现在来讨论一下关于定义指针是否为其分配内存的问题。能够确定的是定义数组的时候是分配给它空间的。首先看下面的程序;#includemain(){ int *i; *i=1; printf("%d/n",*i);} 程序直接崩掉了,看来定义一个指针是不为其分配空间的。那再看一个程序#includemain(原创 2010-05-09 00:22:00 · 2208 阅读 · 0 评论 -
栈的链式储存(不存在上溢)
//栈的链式储存(不存在上溢)#include#includetypedef char ElemType;struct linknode{ ElemType data; struct linknode *next;};//init a stackvoid initstack(struct linknode **s){ *s=NULL;}//pushvoid push(struct linknode原创 2010-05-09 00:25:00 · 1772 阅读 · 0 评论 -
acm基础3_排序2
<br />#include <stdio.h><br />#include <stdlib.h><br />#define MAXITEM 100<br />typedef char ElemType[5];//?<br />//希尔排序<br />typedef struct node<br />{<br /> int key;<br /> ElemType data;<br />}elemnode[MAXITEM];<br />void shellsort(elemnode r,int原创 2011-04-22 22:52:00 · 1419 阅读 · 0 评论 -
考研复习(9)-图的应用
1.最小生成树-普林姆算法复杂度O(n^2),适合稠密图#include #include #include using namespace std;const int maxn=101;void prim(int n,int dist[max原创 2011-09-04 09:00:46 · 1909 阅读 · 0 评论 -
考研复习(1)-线性表
还有5个月考研,代码还是得敲。环境:Ubuntu10.10 ide:code::blocks线性表的基本操作,还有合并,比较算法#include #include #define LIST_INIT_SIZE 100#define LIST_INCREAS原创 2011-08-10 23:18:54 · 1440 阅读 · 1 评论 -
考研复习(2)链表操作
1.链表最好采用带头节点的逻辑结构,在删除等操作上比较方便,头节点便是0号节点;2.在主函数之后定义的函数须在主函数之前申明;3.要改变链表结构,续传递指向头节点指针的指针;4.不能直接搬数据结构上的伪代码(严玮文版),还是要自己思考,最好能够画图;5.调试时出现原创 2011-08-21 00:44:30 · 2558 阅读 · 3 评论 -
考研复习(3)链表操作续
几个感觉不错的简单算法void merge1(LinkList *La,LinkList *Lb,LinkList *Lc);//将俩有序链表合并成有序链表void merge2(LinkList *La,LinkList *Lb,LinkList *Lc);//将两个非原创 2011-08-23 00:21:26 · 1698 阅读 · 0 评论 -
考研复习(5)-队列操作
//队列,队首删除,队尾插入, 先进先出#include#define MaxSize 100typedef char ElemType;typedef struct{ElemType queue[MaxSize];int front,rear;}原创 2011-08-29 17:00:49 · 1353 阅读 · 0 评论 -
考研复习(6)-回文判断&三元组
下面的两个算法,一个是回文判断,用到了堆栈和队列,一个三元组的矩阵压缩存储。时间关系,就没有慢慢调了。int backWen(){ queue a; initqueue(&a); stack s; initSta原创 2011-08-29 17:01:26 · 1437 阅读 · 0 评论 -
考研复习(4)-栈操作
终于把栈搞定了,还是自己太懒。主要的算法是1)数的的进制转换2)括号匹配3)行编辑迷宫那个还是先放一下吧。。。。#include#include#define MAXSIZE 100#define STACK_INCREASE 10typedef ch原创 2011-08-29 12:29:30 · 1530 阅读 · 0 评论 -
考研复习(7)树的基本操作
这次是树的基本操作,包括生成树,求树深度,求叶子节点个数。。。附上二叉树的几个重要性质及证明(考研必考)。1.在二叉树的第i层至多有2^(i-1)个结点;2.深度为k的二叉树至多有2^(k)-1 个结点;3.对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1;(n=n0+n1+n2=n1+2n2+1);4.具有n哥节点的完全二叉树深度为【log2原创 2011-08-31 12:02:09 · 1697 阅读 · 0 评论 -
算法导论-分治、最大子序列问题
一.基本概念分治法的基本步骤:1.分解问题(Divide):把原问题分解为若干个与原问题性质相类似的子问题;2.求解字问题(Conquer):不断分解子问题并求解;3.合并子问题的解(Combine).分治法的运用条件:1.原问题可以分解为若干与原问题的解;2.子问题可以分解并可以求解;3.子问题的解可以合并为原问题的解;4.分解后的子问题应互相独立,即原创 2012-10-11 20:32:47 · 6045 阅读 · 4 评论 -
算法导论-循环不变式、插入排序、归并排序
循环不变式算法导论第二章中的原文是:We state these properties of A[1 ‥ j -1] formally as a loop invariant。其中举的例子是插入排序,每次循环从数组A中取出第j个元素插入有序区A[1 .. j-1],然后递增j。这样A[1 .. j-1]的有序性始终得到保持,这就是所谓的“循环不变”了。这个概念主要用来检验算法的正确原创 2012-10-10 09:13:23 · 3126 阅读 · 0 评论 -
算法导论-动态规划(dynamic programming)
动态规划:通过组合子问题的解来解决整个问题。动态规划的四个步骤:1)描述最优解的结构;2)递归定义最优解的值;3)按自低向上的方式计算最优解的值(首先找到子问题的最优解,解决子问题,最后找到问题的一个最优解);4)由计算出的结果构造一个最优解。动态规划的两个要素:1、最优子结构如果问题的一个最优解中包含了子问题的最优解,则该问题具有最优子结构,当一个问题具有原创 2012-10-30 09:51:04 · 2236 阅读 · 0 评论 -
算法导论-希尔排序、桶排序
一、希尔排序基本思想 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成(n除以d1)个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2c语言实现:void shellSort(elementType *r,int n){ int j,i,gap; elementType tmp;原创 2012-10-28 19:28:15 · 2817 阅读 · 0 评论 -
单链表中一个插入操作的分析
首先看链表的结构:p- >节点->节点....(单向),结点包括两部分,值value和指向下一节点的指针link,p为根节点,只有指针域,其类型为指向节点的指针,如要对其进行修改,调用函数时就要将其地址传给函数当实参,及函数的形参类型应为指向指针的指针。 当在进行一些链表的操作时,如节点的插入,把一个节点插入到链表的起始位置必须作为一种特殊情况进行处理,因为我们要修改的是指向指针的指针,对于其原创 2010-05-05 00:30:00 · 2368 阅读 · 0 评论