数据结构实验报告-实验二-power(x,n)求幂问题、教材2.19求主元问题的求解

实验二 power(x,n)求幂问题、教材2.19求主元问题的求解

 

一、实验描述

1.用基于2和3的方式分别写出算法来求power(x,n)。分析两种算法的复杂程度,设计实验来验证想法。

2.基于教材2.19题,设计并实现用分治求数组的主元的算法。如果不用分治,通过比较和计数,求复杂程度。

 

二、实验设计

1.power(x,n)求幂问题:

若按常规方法计算x的n次方,需要进行n-1次乘法运算,效率低下。现在考虑将power(x,2)的结果保留到中间变量中(以2为底的方法),则power(x,4)=power(x,2)*power(x,2),只需两次乘法运算。再将power(x,4)的结果保留,则power(x,8)=power(x,4)*power(x,4) ……按此思路,用尾递归的方法解题,在int power(x,n)函数中,若n为奇数,则返回power(x,n/2)*x,若n为偶数,则返回power(x,n/2),这样每经过一次递归调用,问题规模减半,预计算法时间复杂度为O(log2n)。以3为底的方法同理,按n%3为0,1,2分类,每次递归调用问题规模缩小至1/3,预计算法时间复杂度为O(log3n)。

 

2.教材2.19求主元问题:

大小为N的数组A,其主要元素是一个出现次数超过N/2的元素(从而这样的元素最多有一个)。例如,数组3,3,4,2,4,4,2,4,4有一个主要元素4,而数组3,3,4,2,4,4,2,4没有主要元素。如果没有主要元素,那么你的程序应该指出来。下面是求解该问题的一个算法的概要:

首先,找出主要元素的一个候选元(这是难点)。这个候选元是唯一有可能是主要元素的元素。第二步确定是否该候选元实际上就是主要元素,这正好是对数组的顺序搜索。为找出数组A的一个候选元,构造第二个数组B。比较A[1]和A[2],如果它们相等,则取其中之一加到数组B中;否则什么也不做。以该方式继续下去直到读完这个数组。然后,递归地寻找B中的候选元;它也是A的候选元。

非分治算法:设置两重循环,将数组内的每一个元素与所有元素比较,若相同,则count++,若count>n/2,则该元素为主元,返回该元素。若循环结束还未满足条件,则返回0,表示没有找到主元。预计算法时间复杂度为O(n2).

分治算法:采用递归,构造第二个数组B。比较A1和A2,若他们相等,则取其一加入B中,否则什么也不做。以该方式继续下去直到读完整个数组。然后对B数组重复上述操作。预计算法时间复杂度为O(n)。

 

三、实验实现过程

(1)power(x,n)求幂问题:利用递归分别用以2为底和以3为底的方法,计算3的n次幂,输入7组大小分别为10、50、100、500、1000、5000、10000的n;

(2)教材2.19求主元问题:设计三种测试用例判断程序对错;

(3)定义两个时间类型变量start和end,分别用于记录一个函数执行前后的时间,将两个时间相减,便可以得到该函数的运行时间;

(4)对于power(x,n)求幂和与教材2.19求主元问题,记录程序执行1000000次所需的时间。

 

1.power(x,n)求幂问题:

(1)定义方法int power(int x,int n) //利用递归方法求解;

(2)将求值函数体循环1000000次,在函数执行前,定义time_t类型的变量start=clock(); 函数执行后,加上代码:end=clock();打印(int)(end-start) 记录函数结束时间;

(3)重复5 次实验,得到平均数据;

(4)记录相应7组实验结果并绘制相应Excel图表。

 

2.教材2.19求主元问题:

(1)分治法

(2)非分治法

 

四、实验结果

1. power(x,n)求幂问题图表:

1.以2为底:

n(2为底)

10

50

100

500

1000

3000

5000

7000

9000

10000

time

14.694

22.278

23.858

33.022

35.55

40.186

42.344

44.714

47.24

48.822

数据结构实验报告-实验二-power(x,n)求幂问题、教材2.19求主元问题的求解

2.以3为底:

n(3为底)

10

50

100

500

1000

3000

5000

7000

9000

10000

time

10.35

21.39

23.668

30.156

33.948

38.156

44.988

46.404

47.78

49.196

数据结构实验报告-实验二-power(x,n)求幂问题、教材2.19求主元问题的求解

 

3.教材2.19求主元问题:

测试用例:

int A[9]={3,3,4,2,4,4,2,4,4,};输出:主元:4。

intA[8]={3,3,4,2,4,4,4,4};输出:主元:4。

int A[8]={3,3,4,2,4,4,2,4};输出:主元:0(即无主元)。

 

五、实验结论

算法时间复杂度分析:

power(x,n)求幂问题得出的n-t曲线近似为对数曲线,以2为底、以3为底的时间复杂度分别为O(log2N)与O(log3N),与预期相符。

教材2.19求主元问题所使用的三种测试用例均得出正确结果,非分治算法时间复杂度为O(N2),分治算法时间复杂度为O(N)。