数据结构——例题1
eg1:求解 S = 1! + 2! + 3! + ... + n!
#include<stdio.h>
#include<stdlib.h>long sum(int n){long s = 0,t,i,j;for(i=1;i<=n;i++){t=1;for(j=1;j<=i;j++){t*=j;}s+=t;}return s;
}int main(){int n;printf("请输入一个整数:");scanf("%d",&n);printf("%d",sum(n));
}
eg2:以下说法不正确的是__B__
A.数据元素是数据的基本单位
B.数据项可由若干个数据元素构成
C.数据项是不可分割的最小标识单位
D.数据可由若干个数据元素构成
eg3:在数据结构中,与所使用的计算机无关的是数据的__C__结构
A.逻辑和存储
B.物理
C.逻辑
D.存储
解析:在数据结构的分类中,数据的逻辑结构是指数据元素之间的相互关系及其组织方式,这种关系和组织方式是独立子具体计算机实现的。换句话说,逻辑结构关注的是数据本身的抽象关系,而不是这些数据在计算机中如何存储和实现。
选项A:存储结构,是数据在计算机内存中的具体表示方式,与计算机有关。
选项B:物理结构,指的是数据在计算机硬件上的具体存储形式,与计算机有关。
选项C:逻辑结构,是指数据元素之间的逻辑关系,与具体计算机实现无关。
选项D:物理和存储结构,都涉及到具体的计算机实现,与计算机有关。
eg4:取算法的时间复杂度为O(n3次方),当n=5时执行时间为50s,当n=15时,执行时间为__D__
A.675
B.2025
C.3375
D.1350
解析:T(n)=O(n的3次方)=m*n^3,当n=5 时T(n)=50s,求得m=0.4。当n=15 时,T(n)=m*n^3=0.4*15^3=1350s 。
eg5:下面程序的时间复杂度为__C__
void fun(int n) {int i = 1;while(i<=n) i=i*2}
A.O(nlog2n)
B.O(n)
C.O(log2n)
D.O(n^2)
解析:①列出循环趟数t以及每轮i的变化值
t 0 1 2 3 4 5 i 1 2 4 8 16 32 ②找到i与t的关系:i=2^t
③确定停止条件:i<=n
④联立①②方程:2^t<=n --> t<=log2n
所以T=O(log2n)
eg6:下面程序的时间复杂度为__C__
int count=0;
for(k=1 ; k<=n ; k*=2)
for(j=1;j<=n;j++)
count++;
解析:①列出外层循环趟数t1,列出外层循环中k的变化值
t1 0 1 2 3 4 5 k 1 2 4 8 16 32 ②找到k与t1的关系:k=2^t1
③由外层循环for(k=1 ; k<=n ; k*=2)可得:2^t1<=n,即t1=log2n,说明外层循环有log2n次
④列出内层语句的执行次数t2
t1 0 1 2 3 4 5 k 1 2 4 8 16 32 t2 1 2 3 4 5 6 ⑤求内层语句的执行次数t2之和S
内层循环:对于外层循环的每一次迭代,内层循环都会完整的从j=1执行到j=n,即内层循环每次执行n次
总执行次数:由于外层循环执行log2n次,每次外层循环时内层循环执行n次,所以总的执行次数S=n*log2n
时间复杂度:根据大O表示法,该双层循环的时间复杂度为O(nlog2n)
eg7:以下函数中时间复杂度最小的是__D__
A.T1(n) = nlog2n + 5000n
B.T2(n) = n^log2n-6000n
C.T3(n) = n^2-8000n
D.T4(n) = 20000log2n
解析: