算法应用实例:最大子列和问题
算法1
int MaxSubseqSuml ( int A[], int N )
{ int ThisSum, Maxsum = 0 ;
int i,j,k;
for( i = 0; i< N;i++){/*i是子列左端位置*/
for ( j = i;j<N;j++){/*j是子列右端位置*/
ThisSum= 0; /* 从A[i]到A[j]的子列和*/
for (k= i;k<=j;k++)
ThisSum += A[k];
if ( ThisSum › MaxSum) /* 如果刚得到的这个子列和更大 */
MaxSum=ThisSum;/* 更新结果*/
}/*j循环结束*/
}/*i循环结束*/
return MaxSum;
}
该算法T(N)=O(N^3) //三个for循环
算法2
int MaxSubseqSum2 ( int A[], int N )
{ int ThisSum,MaxSum = 0;
int i,j;
for( i = 0; i <N; i++ ) {/*i是子列左端位置*/
ThisSum = 0; /*从A[i]到A[j]的子列和*/
for( j = i; j< N; j++ ) {/*j是子列右端位置*/
ThisSum +=A[j];
/*对于相同的i的循环中,不同的j,只要在j-1次循环的基础上累加1项即可*/
if( ThisSum >MaxSum )/*如果刚得到的这个子列和更大*/
Maxsum= ThisSum; /*则更新*/
}/*j循环结束*/
}/*i循环结束*/
return MaxSum ;
}
该算法T(N)= O(N^2) //两个for循环
算法三
int MaxSubseqsum4 ( int A[], int N )
{ int ThisSum,MaxSun ;
int i;
ThisSum = MaxSum= 0;
for( i = 0; i <N; i++ ){
ThisSum+=A[i];/*向右累加*/
if( ThisSum > MaxSum )
MaxSum = ThisSum; /*发现更大和则更新当前结果*/
else if( ThisSum < 0 )/*如果当前子列和为负*/
ThisSum = 0; /*则不可能使后面的部分和增大,抛弃之*/
}
return Maxsun ;
T(N)=O(N) //一个for循环加if elseif 常数
线性结构
线性表及其实现
引入
关于多项式的表示:n 项数,ai系数,i指数
1.顺序存储
当遇到指数很庞大而项数少则会出现很多项系数为0也要占存储空间 e.g x+5x^200
2.顺序存储非零项
把一个多项式看成是一个( ai,i )二元组的集合。
3.链表结构存非零项
链表每个节点存(系数coef 指数expon 指针域)
什么是线性表(List)
同类型数据元素构成有序序列的线性结构
长度:元素个数
没元素叫空表
起始表头 结束表尾
线性表基本操作:
1、List MakeEmpty():初始化一个空线性表L;
2、ElementType FindKth( int K, List L):根据位序K,返回相应元素﹔
3、int Find( ElementType X, List L):在线性表L中查找X的第一次出现位置
4、void lnsert( ElementType X, int i,List L):在位序i前插入一个新元素X;
5、void Delete( int i, List L):删除指定位序i的元素;
6、int Length( List L ):返回线性表L的长度n。
线性表顺序存储
根据前面引入,利用数组连续存储空间顺序放线性表元素
typedef struct LNode *List;
struct LNode{
ElementType Data[MAXSIZE];
int Last;
};
struct LNode L;
List PtrL;
访问下标为i的元素:L.Data[i]或PtrL->Data[i]
线性表的长度:L.Last+1或PtrL->Last+1 //从0开始算