数据结构复习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
时间复杂度(1)
语句的频度:某语句重复执行的次数。
时间复杂度:算法中所有语句的频度之和记作T(n),是算法所求解问题规模n 的函数。当问题规模趋向无穷大时, T(n)的数量级称为时间复杂度,记作:T(n)=O(f(n))。
一个算法的时间复杂度可以具体分为最好、最坏和平均三种情况,其中平均最具有实际意义。但在计算时一般使用最坏情况下的时间复杂度。 时间复杂度(3)
当n 较大时,若时间复杂度为指数或阶乘数量级,则相应算法无效。如1秒能作1亿次简单操作,n 为32时 ,需运行 8.34*1017世纪。 当n 大于一定值后,各种不同数量级对应的值存在如下关系: O(log2n)< O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n ) < O(n! ) 时间复杂度例题
求下面程序段的时间复杂度
(1) temp=x;频度为1 x=y; 频度为1 y=temp; 频度为1 即 t(n)=3,是一个与问题规模n 无关的常数,所以算法的时间复杂度为常数阶,即T(n)=O(1)
(2)sum=0; 1 for(i=0; i 所以该程序段的语句频度为: 1+n+n*n+n*n=2n2+n+1 即时间复杂度T(n)=O(n2) 注意:当有若干个循环语句时,算法的时间复杂度是由内嵌套层数最多的循环语句中最内层语句的频度决定的。 3)i=0;1 while (i 3)最好时间复杂性,最坏时间复杂性,平均时间复杂性对有些算法,问题规模相同,如果输入集不同,其效率不同 Tmin:最好情况不能代表算法的性能 Tmax :最坏情况可以知道算法至少能达到的性能 Tavg :较好地反映了算法的性能. 自测题 1 1、算法的计算量的大小称为计算的( )。 A. 效率 B. 复杂性 C. 现实性 D. 难度 2、一个算法应该是( )。 A .程序 B .问题求解步骤的描述 C .要满足五个基本特性 D .A 和C. 3、下面说法错误的是( ) 1)算法原地工作的含义是指不需要任何额外的辅助空间 2)在相同的规模n 下,复杂度O(n)的算法在时间上总是优于复杂度O(2n)的算法 3所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界 4)同一个算法,实现语言的级别越高,执行效率就越低 A .(1) B.(1),(2) C.(1),(4) D.(3) 4、在数据结构中,从逻辑上可以将之分为( )。 A. 动态结构和静态结构B. 紧凑结构和非紧凑结构 C. 内部结构和外部结构 D. 线性结构和非线性结构 5、计算算法的时间复杂度是属于一种( )。 A. 事前统计的方法B. 事前分析估算的方法 C. 事后统计的方法 D. 事后分析估算的方法 6、 可以用( )定义一个完整的数据结构: A. 数据元素 B 数据对象 C.数据关系 D.抽象数据类型 7、 算法分析的目的是_______。 A. 找出数据结构的合理性 B. 研究算法中的输入和输出的关系 C. 分析算法的效率以求改进 D. 分析算法的易懂性和文档性 8、 设计一个“好”的算法应考虑达到的目标有______。 A. 是可行的 B. 是健壮的 C. 无二义性 D. 可读性好 9、 求下列程序段的时间复杂度 (1) i=1; while (i<=n) i=i*2; (2) a=0; b=1; for (i=2; i<=n; i++ ) { s=a+b; b=a; a=s; } (3)for(I=1;I<=n;I++) for(j=1;j<=I;j++) for(k=1;k<=j;k++) x=I+j+k; 线性表自测题 1、线性表是具有n 个( )的有限序列(n>0)。 A 表元素 B 字符C 数据元素 D 数据项E 信息项 作业(实验1) 用C 语言编程实现:以顺序表作为存储结构,对线性表进行插入和删除运算。要求:输出原线性表的各元素值,以及插入和删除一个元素后的线性表的元素值。 #include { int elem[20]; int len; }SqList; void prt(SqList L)//输出函数 { for(int i=1;i<=L.len;i++) printf(“%d %d\n ”,I,L.elem[i]); } int Insert_Sq(SqList &L,int i,int x)//插入函数 { int j; if(i<1||i>L.len+1) return 0; if(L.len==20) return -1; for(j=L.len;j>=i;--j) L.elem[j+1]=L.elem[j]; L.elem[i]=x; ++L.len; return 1; } int Delete_Sq(SqList &L,int i)//删除函数 { int j; if(i<1||i>L.len) return 0; if(L.len==0) return -1; for(j=i;j<=L.len-1;j++) L.elem[j]=L.elem[j+1]; --L.len; return 1; } void initsql(SqList &L)//线性表的初始化 { L.len=0; } void main() { SqList L; int i,x; initsql(L); for(i=1;i<=10;i++) { scanf(“%d”,&x); Insert_Sq(L,i,x); } prt(L); Insert_Sq(L,5,90);//将90插入到第5个元素的位置 prt(L); Delete_Sq(L,1);//删除第1个元素 prt(L); } 例:将两个有序链表并为一个有序链表 算法描述:设头指针La和Lb的单链表分别为线性表LA和LB的存储结构,现要归并La和Lb得到单链表Lc. 需设立3个指针pa,pb和pc,其中pa和pb分别指向La表和Lb表中当前待比较插入的结点,而pc指向Lc表中当前最后一个结点.若pa->data<=pb->data,则将pa所指结点链接到pc所指结点之后,否则将pb所指结点链接到pc所指结点之后,直到La或Lb链表为空,则将另一个链表的剩余段链接在pc所指结点之后即可。 1、若线性表最常用的操作是存取第I个元素及其前驱和后继元素的值,为节省时间应采用的存储方式( )。 A.单链表 B.双向链表 C.单循环链表 D.顺序表 算法举例: 取单链表倒数第k个元素 已知一个带有表头结点的单链表,结点结构为(data,link),假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数),若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0,要求: ⑴描述算法的基本设计思想⑵描述算法的详细实现步骤; ⑶根据设计思想和实现步骤,采用程序设计语言描述算法(使用C或C++或JAVA语言实现),关键之处请给出简要注释。 int SearchInvK(LinkedList la , int k) //在单链表la上查找倒数第k个结点{p=la->link; //p指向当前待处理元素 pre=la->link; //若成功,pre指向倒数第k个元素 i=0 ; while(p && i if(p==null && i printf(“%d”, pre->data); return 1; }//end 单链表的基本运算 1.头插法建立单链表(课本30页算法 2.11) 2.尾插法建立单链表 3.查找(课本29页算法2.8) 4.插入(课本29页算法2.9) 5.删除(课本30页算法2.10) 2、若线性表最常用的操作是存取第I个元素及其前驱和后继元 素的值,为节省时间应采用的存储方式( )。 A.单链表 B.双向链表 C.单循环链表 D.顺序表 3、某线性表中最常用的操作是在最后一个元素之后插入一个元 素和删除第一个元素,则采用()存储方式最节省运算时间。 A. 单链表 B. 仅有头指针的单循环链表 C. 双链表 D. 仅有尾指针的单循环链表 4、设一个链表最常用的操作是在末尾插入结点和删除尾结点,则 选用( )最节省时间。 A. 带头结点的双循环链表 B. 单循环链表 C. 带尾指针的单循环链表 D. 单链表 5、下述哪一条是顺序存储结构的优点?() A插入运算方便 B可方便地用于各种逻辑结构的存储表示 C.存储密度大 D.删除运算方便 6、下面关于线性表的叙述中,错误的是哪一个?() A.线性表采用顺序存储,必须占用一片连续的存储单元 B.线性表采用顺序存储,便于进行插入和删除操作 C.线性表采用链接存储,不必占用一片连续的存储单元 D.线性表采用链接存储,便于插入和删除操作。 7、若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。 A顺序表 B双链表 C带头结点的双循环链表 D单循环链表 8、链表不具有的特点是() A.插入、删除不需要移动元素 B.可随机访问任一元素 C不必事先估计存储空间 D所需空间与线性长度成正比 9、对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为()。 A. O(n) O(n) B. O(n) O(1) C. O(1) O(n) D. O(1) O(1) 10、单链表中,增加一个头结点的目的是为了( )。 A.使单链表至少有一个结点 B.标识表结点中首结点的位置 C.方便运算的实现 D.说明单链表是线性表的链式存储 L p p L