《数据结构与算法分析:C语言描述》习题2.7

算法1 C语言代码

int* CreateArr_1(int N)//算法1
{
	int i, j, temp, count;
	int* pA = (int*)malloc(sizeof(int) * N);
	pA[0]= RandInt(0, N - 1);

	for (i = 1; i < N; i++)
	{
		count = 0; //用来判断A[O]到A[i-1]中是否有和temp相同的元素,count=0表示有和temp相同的元素
		while (0 == count)//有和temp相同的元素就重新计算
		{
			temp = RandInt(0, N-1);
			for (j = 0; j < i; j++)
			{
				if (temp == pA[j])//检查出数组中有相同的元素,count=0
				{
					count = 0;
					break;
				}
				else
					count = 1;
			}
		}
		pA[i] = temp;
	}

	return pA;
	
}

算法分析

事件 A = { A [ i ] 与 A [ 0 ] , A [ 1 ] , . . . , A [ i − 1 ] 均 不 相 同 } A=\{A[i]与A[0],A[1],...,A[i-1]均不相同\} A={A[i]A[0],A[1],...,A[i1]}的概率 P ( A ) P(A) P(A)为:
P ( A ) = N − i N P(A)=\frac{N-i}{N} P(A)=NNi

试验 k k k次,前 k − 1 k-1 k1次事件A不发生,第 k k k次事件才发生的概率为: p ( 1 − p ) ( k − 1 ) p(1-p)^{(k-1)} p(1p)(k1)

计算事件 A A A 的数学期望 E ( A ) : E(A): E(A):
E ( A ) = ∑ k = 0 ∞ k p ( 1 − p ) ( k − 1 ) = p + 2 p ( 1 − p ) + ⋯ + ( n + 1 ) p ( 1 − p ) n + … E(A)=\sum_{k=0}^{\infty}kp(1-p)^{(k-1)}=p+2p(1-p)+\dots+(n+1)p(1-p)^{n}+\dots E(A)=k=0kp(1p)(k1)=p+2p(1p)++(n+1)p(1p)n+

( 1 − p ) E ( A ) = p ( 1 − p ) + ⋯ + n p ( 1 − p ) n + … (1-p)E(A)= p(1-p)+\dots+np(1-p)^{n}+\dots (1p)E(A)=p(1p)++np(1p)n+

错位相减后,可得:
p E ( A ) = p + ( 1 − p ) + ⋯ + p ( 1 − p ) n + ⋯ = p ∑ k = 0 ∞ ( 1 − p ) k pE(A)=p+(1-p)+\dots+p(1-p)^{n}+\dots=p\sum_{k=0}^{\infty}(1-p)^{k} pE(A)=p+(1p)++p(1p)n+=pk=0(1p)k

E ( A ) = ∑ k = 0 ∞ ( 1 − p ) k = 1 1 − ( 1 − p ) = 1 p E(A)=\sum_{k=0}^{\infty}(1-p)^{k}=\frac{1}{1-(1-p)}=\frac{1}{p} E(A)=k=0(1p)k=1(1p)1=p1
即平均执行 1 p \frac{1}{p} p1次事件才会发生。

在算法1当中,第一层 f o r for for循环执行 N − 1 N-1 N1次,第二层 w h i l e while while循环执行 1 p \frac{1}{p} p1次,第三层执行 i i i次,总运行时间为:
∑ i = 1 N − 1 N N − i ⋅ i = N ∑ i = 1 N − 1 i N − i = N ∑ j = 1 N − 1 N − j j < N 2 ∑ j = 1 N − 1 1 j = N 2 O ( l o g N ) = O ( N 2 l o g N ) \sum_{i=1}^{N-1}\frac{N}{N-i}\cdot i=N\sum_{i=1}^{N-1}\frac{i}{N-i}= N\sum_{j=1}^{N-1}\frac{N-j}{j}<N^{2}\sum_{j=1}^{N-1}\frac{1}{j}=N^{2}O(logN)=O(N^{2}logN) i=1N1NiNi=Ni=1N1Nii=Nj=1N1jNj<N2j=1N1j1=N2O(logN)=O(N2logN)

算法2 C语言代码

int* CreateArr_2(int N)
{
	//初始化
	int* pA = (int*)malloc(sizeof(int) * N);
	int* Used = (int*)malloc(sizeof(int) * N);
	pA[0] = RandInt(0, N - 1);
	Used[pA[0]] = 1; 

	int i, temp;
	int count;
	for (i = 1; i < N; i++)
	{
		count = 0;//用来判断A[O]到A[i-1]中是否有和temp相同的元素,count=0表示有和temp相同的元素
		while (count == 0)//有和temp相同的元素就重新计算
		{
			temp = RandInt(0, N - 1);
			if (1 == Used[temp]) //看看Used数组中该数字是否被使用
			{
				count = 0;
			}
			else
			{
				count = 1;
				Used[temp] = 1;
			}
		}
		pA[i] = temp;
	}
	return pA;

}

算法分析

和算法1类似,时间复杂度为: O ( N l o g N ) O(NlogN) O(NlogN)

算法3 C语言代码

int* CreateArr_3(int N)
{
	int* pA = (int*)malloc(sizeof(int) * N);
	int i;
	for (i = 0; i < N; i++)
	{
		pA[i] = i + 1;
	}

	for (i = 0; i < N; i++)
	{
		Swap(&pA[i], &pA[RandInt(0, i)]);
	}

	return pA;
}

算法分析

时间复杂度为: O ( N ) O(N) O(N)

C语言综合代码

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>

int RandInt(int i, int j); //生成 i+1 到 j+1 之间的一个随机数
int* CreateArr_1(int N); //输入数组的长度,数组为0~(N-1)的一个置换
int* CreateArr_2(int N);
int* CreateArr_3(int N);
void Swap(int* a, int* b);//交换a b两个元素的数值

int main(void)
{
	srand(time(NULL));

	int N = 8;
	//采用算法1生成数组
	int* pArr_1 = CreateArr_1(N);
	int i ;
	for (i = 0; i < N; i++)
		printf("%d ", pArr_1[i]);

	printf("\n");

	//采用算法2生成数组
	int* pArr_2 = CreateArr_2(N);
	for (i = 0; i < N; i++)
		printf("%d ", pArr_2[i]);
	
	printf("\n");

	//采用算法3生成数组
	int* pArr_3 = CreateArr_3(N);
	for (i = 0; i < N; i++)
		printf("%d ", pArr_3[i]);
	return 0;
}

int RandInt(int i, int j)
{
	if (i > j)
	{
		printf("随机数范围输入错误!\n");
		exit(-1);
	}

	if (i == j)
		return i;

	return rand() % (j - i + 1) + (i+1) ; //求余后的值在0~(j-i)之间
}

int* CreateArr_1(int N)//算法1
{
	int i, j, temp, count;
	int* pA = (int*)malloc(sizeof(int) * N);
	pA[0] = RandInt(0, N-1);

	for (i = 1; i < N; i++)
	{
		count = 0; //用来判断A[O]到A[i-1]中是否有和temp相同的元素,count=0表示有和temp相同的元素
		while (0 == count)//有和temp相同的元素就重新计算
		{
			temp = RandInt(0, N-1);
			for (j = 0; j < i; j++)
			{
				if (temp == pA[j])//检查出数组中有相同的元素,count=0
				{
					count = 0;
					break;
				}
				else
					count = 1;
			}
		}
		pA[i] = temp;
	}

	return pA;
	
}

int* CreateArr_2(int N)
{
	//初始化
	int* pA = (int*)malloc(sizeof(int) * N);
	int* Used = (int*)malloc(sizeof(int) * N);
	pA[0] = RandInt(0, N - 1);
	Used[pA[0]] = 1; 

	int i, temp;
	int count;
	for (i = 1; i < N; i++)
	{
		count = 0;//用来判断A[O]到A[i-1]中是否有和temp相同的元素,count=0表示有和temp相同的元素
		while (count == 0)//有和temp相同的元素就重新计算
		{
			temp = RandInt(0, N - 1);
			if (1 == Used[temp]) //看看Used数组中该数字是否被使用
			{
				count = 0;
			}
			else
			{
				count = 1;
				Used[temp] = 1;
			}
		}
		pA[i] = temp;
	}
	return pA;

}

int* CreateArr_3(int N)
{
	int* pA = (int*)malloc(sizeof(int) * N);
	int i;
	for (i = 0; i < N; i++)
	{
		pA[i] = i + 1;
	}

	for (i = 0; i < N; i++)
	{
		Swap(&pA[i], &pA[RandInt(0, i)]);
	}

	return pA;
}

void Swap(int* a, int* b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
数据结构与算法分析C语言描述清晰版》是由美国著名计算机科学家Mark Allen Weiss所著,是一本介绍数据结构算法的经典教材之一。该书内容丰富、深入浅出,既有基础知识的讲解,也有高级算法的探讨,适合计算机科学及其他相关专业的学生、计算机编程爱好者、程序员等人群。 本书主要内容包括线性结构、递归、树、排序和搜索算法、散列表、图等多个章节。其中,线性结构是数据结构的基础,包括线性表、栈、队列等数据结构的实现和操作。递归是一种特殊的函数调用方式,在算法设计中应用广泛,本书详细讲解了递归的原理和应用。树是一种重要的非线性数据结构,本书介绍了二叉树、堆、AVL树等多种树形结构的实现和应用。排序和搜索算法是解决各种实际问题的重要工具,本书详细讲解了冒泡排序、插入排序、归并排序、快速排序等多种排序算法及二分查找、哈希表查找等多种搜索算法。散列表是一种实现高效查找的数据结构,本书深入浅出地讲解了散列表的实现原理和应用。图是一种复杂的数据结构,在算法设计中具有很高的应用价值,本书介绍了图的表示方法、遍历方法和最短路径算法等多个方面的内容。 总的来说,《数据结构与算法分析C语言描述清晰版》是一本综合性的计算机科学教材,既适合初学者入门学习,也适合中高级程序员深入研究。本书内容翔实,全面而深入,不仅介绍了数据结构算法的基本知识,还讲解了实践中的应用技巧和注意事项,对于从事计算机科学相关领域的人员来说,具有很高的实用价值和参考意义。如果你想在数据结构算法方面有更深入的了解,那么这本书绝对是你不可错过的参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值