算法設(shè)計與分析課后總結(jié)-創(chuàng)新互聯(lián)

算法設(shè)計與分析課后總結(jié)
  • 算法設(shè)計與分析
    • 第1章 算法設(shè)計基礎(chǔ)
      • 課后習題
    • 第二章算法分析基礎(chǔ)
      • 課后習題
        • 1、考慮下面算法,回答下列問題,算法完成什么功能?算法的基本語句時什么?基本語句執(zhí)行了多少次?
        • 2、分析以下程序段中基本語句的執(zhí)行次數(shù),要求列出計算公式
        • 3、使用遞歸擴展技術(shù)求解下列公式
    • 第三章 蠻力法
      • 課后習題
        • 1、設(shè)計算法,在數(shù)組r[n]中刪除所有元素值為x的元素,要求時間復雜性為$O(n)$,空間復雜性為$O(1)$
        • 2、設(shè)計算法,將數(shù)組r[n]中刪除重復元素,要求移動次數(shù)較少并使剩余元素的相對次序保持不變
        • 3、設(shè)表$A=\{a_1,a_2,...,a_n\}$,將A拆成B和C兩個表,使A中值>=0的元素存入表B,值小于<0的元素存入表C,不外設(shè)空間,利用A的空間
    • 第四章 分治法
      • 課后習題
        • 1、對于待排序列(5,3,1,9)分別畫出歸并和快排的遞歸運行軌跡
        • 2、設(shè)計分治算法求數(shù)組大元素,并分析時間性能
        • 3、在有序序列$(r_1,r_2,...,r_n)$中存在需序號$i(1<=i<=n)$使得$r_i=n$,設(shè)計一個分治算法找到這個元素
        • 4、在一個序列中出現(xiàn)次數(shù)最多的元素稱為眾數(shù),尋找眾數(shù)
    • 第五章 減治法
      • 課后習題
        • 1、折半查找的遞歸算法,并分析時間性能
        • 2、120硬幣問題
    • 第六章 動態(tài)規(guī)劃
      • 課后習題
        • 1、為什么動態(tài)規(guī)劃法需要填表?如何設(shè)計表的結(jié)構(gòu)?
        • 2、動態(tài)規(guī)劃求0->12最短路徑
    • 第7章 貪心法
      • 課后習題
        • 1.貪心法求背包問題,有7個物品,重量分別為(2,3,5,7,1,4,1),對應(yīng)價值為(10,5,15,7,6,18,3)背包容量W=15,寫出求解過程
        • 2、 最短鏈接求TSP
        • 3、n個顧客等待問題,使得顧客總等待時間最少
        • 4、17/18、11/12埃及分數(shù)問題
    • 第八章 回溯法
      • 課后習題
        • 1、回溯法求解三著色問題
        • 2、回溯法求解作業(yè)問題
        • 3、迷宮問題

創(chuàng)新互聯(lián)主營文昌網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,App定制開發(fā),文昌h5微信小程序定制開發(fā)搭建,文昌網(wǎng)站營銷推廣歡迎文昌等地區(qū)企業(yè)咨詢算法設(shè)計與分析

主要包括課后習題、算法的總結(jié)

第1章 算法設(shè)計基礎(chǔ) 課后習題

1、設(shè)計算法求數(shù)組的相差最小的兩個元素
思路:快排+順序遍歷
快排函數(shù):

int part(int* r, int low, int hight)  
{int i = low, j = hight, pivot = r[low]; 
	while (i< j)
	{while (ipivot) j--;
		if (i< j)	swap(r[i++], r[j]);  
		while (i< j && r[i]<= pivot) 	i++;
		if (i< j)	swap(r[i], r[j--]);  
	}
	return i;  
}
void Quicksort(int* r, int low, int hight)
{int mid;
	if (low< hight)
	{mid = part(r, low, hight);  // 返回基準元素位置
		Quicksort(r, low, mid - 1); // 左區(qū)間遞歸快速排序
		Quicksort(r, mid+1, hight); // 右區(qū)間遞歸快速排序
	}
}

相差最小值的函數(shù):

int Min(int *r,int n)
{Quicksort(r,0,n-1);
	int min=MAX;
	for(int i=1;iif((a[i]-a[i-1])

2、設(shè)計算法找出數(shù)組a[n]中即不是大,也不是最小的元素
思想:找出3個不相同的數(shù),在三個數(shù)中找到中間值即可

int mid(int a,int b,int c)//找三個數(shù)的中間值
{if(a>b){if(b>c)return b;
	else if(a>c)return c;
	else return a;
}
else{if(a>c)return a;
	else if(b>c)return c;
	else return b;
}
}

int mid_find(int *r,int n)//找出三個不同的數(shù)
{int a=r[0];
	int i=1;
	while(i

3、n至少為多大時,n個1組成的整數(shù)能被2013整除
這個題我寫著有那么億丟丟缺點,long long 范圍里的數(shù)都不能被2013整除
大整數(shù)的話,寫著又很麻煩。如果有好的想法,歡迎探討

int main()
{long long n=11111;
	while(n%2013){n*=10;
		n+=1;
	}
	cout<
第二章算法分析基礎(chǔ) 課后習題 1、考慮下面算法,回答下列問題,算法完成什么功能?算法的基本語句時什么?基本語句執(zhí)行了多少次?

(1)

int Stery(int n)
{int S=0;
	for(int i=1;i<=n;i++)
		S+=i*i;
	return S;
}

完成功能:計算 ∑ i = 1 n i 2 \sum_{i=1}^n i^2 ∑i=1n?i2
基本語句:S+=i*i;
算法復雜度: O ( n ) O(n) O(n)
(2)

int Q(int n)
{if(n==1)
		return 1;
	else
		return Q(n-1)+2*n-1;
}

完成功能: ∑ i = 1 n ( 2 n ? 1 ) = n 2 \sum_{i=1}^n(2n-1)=n^2 ∑i=1n?(2n?1)=n2
基礎(chǔ)語句:2*n-1
時間復雜度: O ( n ) O(n) O(n)

2、分析以下程序段中基本語句的執(zhí)行次數(shù),要求列出計算公式

(1)

for(i=1;i<=n;i++)
	if(2*i<=n)
		for(j=2*i;j<=n;j++)
			y+=i*j;

基礎(chǔ)語句:y+=i*j
執(zhí)行次數(shù): ∑ i = 1 n / 2 ( n ? 2 i ) = n ( n ? 2 ) 4 \sum_{i=1}^{n/2}(n-2i)=\frac{n(n-2)}{4} ∑i=1n/2?(n?2i)=4n(n?2)?
時間復雜度: O ( n 2 ) O(n^2) O(n2)
(2)

m=0;
for(i=1;i<=n;i++)
	for(j=1;j<=2*i;j++)
		m+=1;

基礎(chǔ)語句:m+=1
執(zhí)行次數(shù): ∑ i = 1 n 2 i = n ( n + 1 ) \sum_{i=1}^n2i=n(n+1) ∑i=1n?2i=n(n+1)
時間復雜度: O ( n 2 ) O(n^2) O(n2)

3、使用遞歸擴展技術(shù)求解下列公式

(1) T ( n ) = { 4 n = 1 3 T ( n ? 1 ) n > 1 T(n) = \begin{cases} 4 &n=1 \\ 3T(n-1) & n>1 \\ \end{cases} T(n)={43T(n?1)?n=1n>1?
解: T ( n ) = 3 T ( n ? 1 ) = . . . = 3 n ? 1 T ( 1 ) = 4 × 3 n ? 1 T(n)=3T(n-1)=...=3^{n-1}T(1)=4×3^{n-1} T(n)=3T(n?1)=...=3n?1T(1)=4×3n?1
(2) T ( n ) = { 1 n = 1 2 T ( n / 3 ) + n n > 1 T(n)= \begin{cases} 1 &n=1\\ 2T(n/3)+n &n>1\\ \end{cases} T(n)={12T(n/3)+n?n=1n>1?
解:令 n = 3 k n=3^k n=3k
T ( n ) = 2 T ( n / 3 ) + n = 2 ( 2 T ( n / 3 2 ) + n / 3 ) + n = . . . = 2 k ∑ i = 0 k ( 3 k / 2 i ) T(n)=2T(n/3)+n=2(2T(n/3^2)+n/3)+n=...=2^k\sum_{i=0}^k(3^k/2^i) T(n)=2T(n/3)+n=2(2T(n/32)+n/3)+n=...=2k∑i=0k?(3k/2i)

第三章 蠻力法 課后習題 1、設(shè)計算法,在數(shù)組r[n]中刪除所有元素值為x的元素,要求時間復雜性為 O ( n ) O(n) O(n),空間復雜性為 O ( 1 ) O(1) O(1)
void dlt(int r*,int n,int x)
{int j=0;
	for(int i=0;iif(r[i]!=x)
		{	r[j]=r[i];
			j++;
		]
	}
}
2、設(shè)計算法,將數(shù)組r[n]中刪除重復元素,要求移動次數(shù)較少并使剩余元素的相對次序保持不變

算法思想:雙重循環(huán)找重復值,將重復元素設(shè)置為固定值flag,再用上一題的代碼刪除即可

void dlt2(int r*,int n)
{flag=-1;
	for(int i=0;iif(i==flag)continue;
		for(int j=i+1;j++)
		{	if(a[i]==a[j])
				a[j]=flag;
		}
	}
	dlt(r,flag);
}
3、設(shè)表 A = { a 1 , a 2 , . . . , a n } A=\{a_1,a_2,...,a_n\} A={a1?,a2?,...,an?},將A拆成B和C兩個表,使A中值>=0的元素存入表B,值小于<0的元素存入表C,不外設(shè)空間,利用A的空間

算法思想:將A分為左邊和右邊,左邊的數(shù)大于0,右邊的數(shù)小于0即可

int divorce(int A*,int n)
{int i=0,j=n-1;
	while(iwhile(A[i]>=0&&i
第四章 分治法 課后習題 1、對于待排序列(5,3,1,9)分別畫出歸并和快排的遞歸運行軌跡

歸并:
劃分階段:
(5,3,1,9)
(5,3),(1,9)
(5),(3),(1),(9)
歸并階段:
(3,5),(1,9)
(1,3,5,9)
快排:
(5,3,1,9)
5為基準點,將1與5交換
(1,3)5(9)
(1,3,5,9)

2、設(shè)計分治算法求數(shù)組大元素,并分析時間性能
int Max(int *A,int low,int hight)
{if(low>hight)
		return -1;
	else if(low==hight)return A[low];
	int mid=(low+hight)/2;
	return max(Max(A,low,mid),Max(A,mid+1,hight));
}

算法復雜度: O ( n ) O(n) O(n)

3、在有序序列 ( r 1 , r 2 , . . . , r n ) (r_1,r_2,...,r_n) (r1?,r2?,...,rn?)中存在需序號 i ( 1 < = i < = n ) i(1<=i<=n) i(1<=i<=n)使得 r i = n r_i=n ri?=n,設(shè)計一個分治算法找到這個元素
int find(int *A,int low,int height)
{if(low>hight)
		return -1;
	if(low==height)
	{if(A[low]==low) return low;
		else return -1;
	}
	int mid=(low+hight)/2;
	if(A[mid]=mid)
	{return mid;
	}
	else if(A[mid]>mid)
		return find(A,low,mid-1);
	else
	   return find(A,mid+1,height);
}
4、在一個序列中出現(xiàn)次數(shù)最多的元素稱為眾數(shù),尋找眾數(shù)

算法思想:先快排,再遍歷一遍技術(shù),算法復雜度為 O ( n l o g n + n ) = O ( n l o g n ) O(nlogn+n)=O(nlogn) O(nlogn+n)=O(nlogn)
快排函數(shù):

int part(int* r, int low, int hight)  
{int i = low, j = hight, pivot = r[low]; 
	while (i< j)
	{while (ipivot) j--;
		if (i< j)	swap(r[i++], r[j]);  
		while (i< j && r[i]<= pivot) 	i++;
		if (i< j)	swap(r[i], r[j--]);  
	}
	return i;  
}
void Quicksort(int* r, int low, int hight)
{int mid;
	if (low< hight)
	{mid = part(r, low, hight);  // 返回基準元素位置
		Quicksort(r, low, mid - 1); // 左區(qū)間遞歸快速排序
		Quicksort(r, mid+1, hight); // 右區(qū)間遞歸快速排序
	}
}

查找眾數(shù)函數(shù)

int mode(int A*,int n)
{Quicksort(A,0,n-1);
	int Max=0;
	for(int i=0;iint t=a[i];
		int num=0;
		while(i
第五章 減治法 課后習題 1、折半查找的遞歸算法,并分析時間性能
int divfind(int *A,int low,int hight,int x)
{if(low>height)
		return false;
	mid=(low+height)/2;
	if(A[mid]==x)
		return mid;
	else if(A[mid]>x)
		return divfind(A,low,mid-1);
	else
		return divfind(A,mid+1,height);
}

時間復雜度 O ( l o g 2 n ) O(log_2n) O(log2?n)

2、120硬幣問題

我沒看懂那個算法,有看懂的大佬麻煩講一下,比心~
以下為硬幣算法的鏈接:小球稱重

第六章 動態(tài)規(guī)劃 課后習題 1、為什么動態(tài)規(guī)劃法需要填表?如何設(shè)計表的結(jié)構(gòu)?

動態(tài)規(guī)劃本身是空間換時間,存在表格里,可以減少相同的計算,大大縮短計算時間
表的結(jié)構(gòu):
一般狀態(tài)量為表的行
決策量為表的列

2、動態(tài)規(guī)劃求0->12最短路徑

Alt
Alt

第7章 貪心法 課后習題 1.貪心法求背包問題,有7個物品,重量分別為(2,3,5,7,1,4,1),對應(yīng)價值為(10,5,15,7,6,18,3)背包容量W=15,寫出求解過程

解題思路:貪心的本質(zhì)為優(yōu)先選擇單位價值最重的
根據(jù)單位價值進行排序得:

物品編號重量價值單位價值
5166
12105
64184.5
35153
7133
2351.7
4771

先裝5號物品背包已裝容量為1,價值為6
再裝1號物品背包已裝容量為3,價值為16
裝6號物品背包已裝容量7,價值為34
裝3號物品背包已裝容量12,價值為49
裝7號物品背包已裝容量13,價值為52
裝2號物品背包已裝容量16>15,結(jié)束
最優(yōu)解為{1,0,1,0,1,1,1}

2、 最短鏈接求TSP
#include#include#includeusing namespace std;


//查找最小邊函數(shù)  Search 
pairSearch(int **A,int N,int *flag,int **AF) {//查找最小邊

 int min=10e5,a=0,b=0;
 for(int i=0; ifor(int j=0; jif(!AF[i][j]&&flag[i]<2&&flag[j]<2&& A[i][j]//如果這條邊沒有走過,兩邊的城市沒有同時有兩個被走過的邊 
    a=i; 
    b=j;
    min=A[i][j];//依次比較 
   }
  }
 }
 flag[a]++;
 flag[b]++;
 AF[a][b]=1;
 return pair(a,b);
}



//TSP2
int TSP2(int **A,int N,int *flag,int **AF) {int tsp=0,i,j,k;
 for(k=0; k//選擇N次最短邊 
  paira=Search(A,N,flag,AF);
  tsp+=A[a.first][a.second];//每次加入最增的最短邊 
 }
 return tsp;
}




int main() 
 { 	//N初始化
	 int N=5; 
 	
	 	
 	//A初始化(城市之間的距離)
 	int **A=(int **)malloc(N*sizeof(int));
	cout<<"輸入5個城市之間的距離(0表示城市間不通):"<A[i]=(int*)malloc(N*sizeof(int));
		for(int j=0;j	cin>>A[i][j];
		}
	}		 
	
		
	//AF初始化,記錄邊是否走過 
	int **AF=(int **)malloc(N*sizeof(int));//記是否邊走過,初始值設(shè)為0,走過設(shè)為1
	for(int i=0;iAF[i]=(int*)malloc(N*sizeof(int));
		for(int j=0;j	AF[i][j]=0;
		}
	}
 	  
 	  
 	//flag初始化,記錄城市是否走過 
	int *flag=(int *)malloc(N*sizeof(int));//標記是否城市走過,初始值設(shè)為0,走進去又走出來成為2 
    for(int i=0;iflag[i]=0;
	}
	   
	  	  
    cout<<"最短路徑長度:";
	cout<
3、n個顧客等待問題,使得顧客總等待時間最少

算法思想:快排一下,時間最少的排前面。

4、17/18、11/12埃及分數(shù)問題

埃及分數(shù)流程:
E=B/A+1;
輸出1/E;
A=AE-B;
B
=E;
消除A,B大公約數(shù);
直到A=1,輸出1/B;

第八章 回溯法 課后習題 1、回溯法求解三著色問題 2、回溯法求解作業(yè)問題 3、迷宮問題

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

名稱欄目:算法設(shè)計與分析課后總結(jié)-創(chuàng)新互聯(lián)
URL分享:http://muchs.cn/article22/cddsjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、建站公司動態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計、靜態(tài)網(wǎng)站、手機網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)