数据结构绪论

来源:互联网 发布:mysql宕机 编辑:程序博客网 时间:2024/06/06 07:30

预览:数据结构与算法的问题

什么是计算?评判DSA优劣的参照(直尺)?度量DSA性能的尺度(刻度)?

DSA性能度量的方法?DSA的设计和优化?

X1:理论模型和实际性能的区别

X2:DSA的极限(下界)

1、大O记号:常系数可以忽略,低次项也可以忽略;

几种记号的区别

2、循环、级数:可以用算数的方法描述,也可以用图形的方法描述

for(inti=0;i<n;i++)

for(intj=0;j<n;j++)                                                     

Operation(I,j);

算数级数:O(n2)

 

for(inti=0;i<n;i++)

for(intj=i;j<n;j++)

Operation(I,j);

算数级数:O(n2)

 

3、迭代与递归

(1)迭代:sum(int A[],n),直接迭代的方法

(2)递归:检查每个递归实例

如:sum(int A[],n)

{

return

n<1?0:sum(A[],n-1)+A[n-1];

}

分析每个递归实例,计算时间复杂度的时候,可以直接忽略掉sum,单个递归是O(1),所以最后得到的时间复杂度为O(1)*(n+1)=O(n);

T(n)=T(n-1)+O(1)…T(0)=O(1)

T(n)-n=T(n-1)-(n-1)=…=T(1)-1=T(0)

(3)二分递归:

sum(intA[],int low,int high)

{

if(low==high)return A[low];

intmid=(low+high)/2;

return sum(A,low,mid)+sum(A,mid+1,high);

}

 

4、分而治之

几何级数,与底层递归实例相同,为n,所以时间复杂度为O(n);

MAX2,从数组A[low,hi)中选择两个较大的数,要求比较操作次数最少

(1)首先找到最大的值,然后分为两段,分别比较

void Max2(A[],int low,int high,int&x1,int &x2)

{

//找出其中最大的值,n-1

for(int x1=low,int i=low+1;i<high;i++)

if(A[i]>A[x1])  x1=i;

//二分法,找出low到x1之间的最大值,x1-low-1

for(int x2=low,int i=low+1;i<x1;i++)

if(A[i]>A[x2])  x2=i;

//将找到的x2和后半部分进行比较,high-x1-1

for(int i=x1+1;i<high;i++)

if(A[i]>A[x2])  x2=i;

}

总的复杂度始终是2n-3;

 

(2)将两个指针分别指向x1,x2,然后每个值分别去和这两个值进行比较,它的

void Max2(A[],int low,int high,int &x1,int &x2)

{

If(A[x1=low]<A[x2]=low+1)swap(x1,x2);

for(inti=low+2,i<high;i++)

{

if(A[i]>A[x2])

if(A[x1]<A[x2=i])

Swap(x1,x2);

}

}

最好情况:1+(n-2)*1=n-1(相比第一次情况,第二次有了明显的进步)

最坏情况:1+(n-2)*2=2n-3

(3)二分递归

将其二分之后在进行递归之后比较


void Max2(A[],int low,int high,int &x1,int &x2)

{

If(low+1=high);//return

If(low+2=high);//return

Intmin=(low+high)/2;

Intx1L,x2L,x1R,x2R;

Max2(A,low,min,x1L,x2L);

Max2(A,min,high,x1R,x2R);

If(A[x1L]>A[x2L])

{   x1=x1L;

  x2=(A[x2L]>A[x1R])?x2L:x1R;}

else

{x1=x2L;

X2=(A[x2R]>A[x1L])?x2R:x1L;}

}

所以总的复杂度是:T(n)=2*T(n/2)+2<5n/3-2

 

 

5.动态规划:找出最长的公共的子序列LCS

对于序列A[0,n],B[0,m]无非只有三种情况:

(1)若n=-1或者m=-1,则取空序列;

(2)减而治之:若A序列和B序列最后一个字母相同,则取A[0,n),B[0,n)的LCS+1;

(3)分而治之:若A序列和B序列最后一个字母不相同,则取A[0,n),B[0,n]或者是A[0,n],B[0,n)的LCS

 

0 0