国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

幾種算法

2019-11-17 05:35:49
字體:
供稿:網(wǎng)友

  【題目】已知一棵二叉樹按順序方式存儲(chǔ)在數(shù)組 A[1..n]中。設(shè)計(jì)算法求出下標(biāo)分別為 i 和 j 的兩個(gè)結(jié)點(diǎn)的最近的公共祖先結(jié)點(diǎn)的值。

【來源】武漢大學(xué)2000年第五(1)題(8’)

【解答】
#inlcude <stdio.h>
parent(int A[],int i,int j)
{int k,m;
m=k=0;
if(i==1j==1A[i]==0A[j]==0i==j) // A[i]==0或A[j]==0表示不存在該結(jié)點(diǎn)
{while(i!=1&&j!=1){
if(i<j){j=j/2;m=1;} // 結(jié)點(diǎn) j 的最近祖先結(jié)點(diǎn)是 ┗ j/2 ┛
else if(j<i){i=i/2;k=1;}
else if(j==i){i=j;break;} // i=j 表示找到共同祖先
}
if(j==1i==1)i=1; // i 或 j 有一個(gè)到了根結(jié)點(diǎn)
else if(m==0k==0)i=i/2; // m、k 中有一個(gè)為 0 ,說明在查找過程中 i 或 j 有一個(gè)沒移動(dòng)
printf("The nearest common parent is A[%d]./n",i);
}


【分析】本題思路是使 i 和 j 交替追趕,直到相等。

------------------------------------------------------------------------
【題目】試寫一個(gè)判別給定二叉樹是否為二叉排序樹的算法。

【來源】長沙鐵道學(xué)院98年第五(1)題(12’)

【解答】
typedef strUCt node{
char data;
struct node *left,*right;
}*T;

issorttree(T)
{
initqueue(Q); // 初始化隊(duì)列
inqueue(Q,T); // 樹根結(jié)點(diǎn)進(jìn)隊(duì)列
while(!empty(Q)){
outqueue(Q,T);
if(T->data>T->left->data&&T->data<T->right->data){
if(T->left)inqueue(Q,T->left);
if(T->right)inqueue(Q,T->right);
}
else if(T->leftT->right)return 1; // 不符合二叉排序樹的特征,則終止并返回‘ 1 ’
}
return 0; // 是二叉排序樹,則返回 ‘0’
}

【分析】注重隊(duì)列的運(yùn)用,其他如圖的廣度搜索(教材《清華 C 版》)。

------------------------------------------------------------------------------
【題目】設(shè)一單向鏈表的頭指針為head,鏈表的記錄中包含著整數(shù)類型的key域,試設(shè)計(jì)算法,
將此鏈表的記錄按照key遞增的次序進(jìn)行就地排序.(不答應(yīng)使用數(shù)組做輔助存儲(chǔ))

【來源】中科院計(jì)算機(jī)技術(shù)研究所1999年第五(1)題 (10’)
華中理工大學(xué)2000年第八(2)題 (13’)

【解答】
typedef struct CircleList{ // 定義循環(huán)鏈表
int key;
struct CircleList *next;
}*listnode;

ListSort(listnode head)
{
int k,min,i,j;
listnode p,q,t;
p=head->next;
while(p->next!=head->next){p=p->next;k+=1;} // 統(tǒng)計(jì)鏈表中元素個(gè)數(shù),保存在 K 中
p=head;j=1;
for(i=1;i<k;i++){
while(j<=i){p=p->next;j++;} // 找應(yīng)填入當(dāng)前最小元素的位置,該位置保存在 q 中
min=p->key;q=p; // 將當(dāng)前位置元素的值設(shè)為初始最小值
while(p->next!=head->next){
if(min>p->key){min=p->key;t=p;} // 找當(dāng)前最小元素,并保存在 t 所指位置中
p=p->next;
}
t->key=q->key;q->key=min;j=1; // 交換 q 位置元素和最小元素的值
}
}

【分析】本題不需要修改鏈表中的各個(gè)指針。

--------------------------------------------------------------------------
前幾天根據(jù)快速排序 Quick Sort算法的基本思想,編寫了如下分治策略的算法,供大家討論: 
思路: 
設(shè)輸入的序列L[p..r],確定支點(diǎn)元素l[p]和l[r],并使l[p].key<=l[r].key 
分解(Divide):將序列L[p..r]劃分成三個(gè)子序列L[p..k-1]、L[k+1..m-1]和L[m+1..r],使L[p..q]中關(guān)系為L[p..k-1]、l[k]、L[k+1..m-1]、l[m]、L[m+1..r]任一區(qū)間元素的值不大于其后區(qū)間元素的值。 
遞歸求解(Conquer):通過遞歸調(diào)用快速排序算法分別對L[p..k-1]、L[k+1..m-1]和L[m+1..r]進(jìn)行排序。 
算法的實(shí)現(xiàn)(用C語言實(shí)現(xiàn)) 
QSort(Sqlist &L,int low,int high){ 
c=high-low; /*循環(huán)次數(shù)*/ 
if(c<10)直接調(diào)用插入排序法; /*小數(shù)時(shí)直接調(diào)用插入排序法*/ 
if(L.r[low].key>L.r[high].key)L.r[low]<->L.r[high]; /*確保區(qū)間內(nèi)第一個(gè)元素的值不大于區(qū)間內(nèi)最后一個(gè)元素的值*/ 
ilow=low; /*小于區(qū)間內(nèi)第一個(gè)元素的值數(shù)組邊界下標(biāo)*/ 
ihigh=high; /*大于區(qū)間內(nèi)最后一個(gè)元素的值數(shù)組邊界下標(biāo)*/ 
for(i=low+1;i<c;i++){ 
if(L.r[i].key<L.r[low].key)L.r[i]<->L.r[++ilow]; /*小于區(qū)間內(nèi)第一個(gè)元素的值放置ilow區(qū)間內(nèi)*/ 
else 
if(L.r[i].key>L.r[high].key){ 
L.r[i]<->L.r[--ihigh]; /*大于區(qū)間內(nèi)最后一個(gè)元素的值放置ihigh區(qū)間內(nèi)*/ 
i--; /*下一個(gè)比較位置不變*/ 
c--; /*循環(huán)次數(shù)減一*/ 


L.r[ilow]<->L.r[low]; /*將小于區(qū)間內(nèi)第一個(gè)元素的邊界下標(biāo)元素與第一個(gè)元素互換*/ 
L.r[ihigh]<->L.r[high]; /*將大于區(qū)間內(nèi)最后一個(gè)元素的邊界下標(biāo)元素與最后一個(gè)元素互換*/ 
QSort(L,low,ilow-1); 
QSort(L,ilow+1,ihigh-1); 
QSort(L,ihigh+1,high); 

void QuickSort(Sqlist &L) 

QSort(L,1,L.length); 

優(yōu)點(diǎn): 
1、每次快速排序?qū)⒋_定二個(gè)元素位置 
2、每次快速排序?qū)澐秩齻€(gè)區(qū)間,優(yōu)化后續(xù)平均時(shí)間和空間復(fù)雜度 
缺點(diǎn): 
1、存在較多的元素交換(每次需要三步),不及改進(jìn)快速排序法利用空穴賦值方便

--------------------------------------------------------------------------------------

四階Runge-Kutta法 

一階常微分方程: 
u'=f(t,u) a<t<b
u(t(0))=u(0) 


Runge-Kutta非線性高階單步法,p階R-K法的整體階段誤差為O(h^p)

R-K四階算法:
u(i+1)=u(i)+h*(k1+3*k2+3*k3+k4)/8
k1=f(t(i),u(i))
k2=f(t(i+h/3),u(i+h*k1/3))
k3=f(t(i+h/3),u(i+h*k2/3))
k4=f(t(i+h),u(i+h*k3)) 

四階程序如下:
class RK{
private:
double k1,k2,k3,k4;
double h,b,u,a;
public:
void seth(double l=0){h=l;} //設(shè)步長
void setf(double xa=0,double xb=0,double y=0) //設(shè)初值和范圍(xa,xb)
{
b=xb;
a=xa;
u=y;
}
double f(double t,double u) //函數(shù)值,修改它以適應(yīng)各自需要
{
//函數(shù)設(shè)定
double f=u-2*t/u; 
return f;
}
void dork() //R-K 主函數(shù)
{
for(int count=0;count<(b-a)/h;count++)
{
k1=f(a+count*h,u);
k2=f(a+count*h+h/3,u+h*k1/3);
k3=f(a+count*h+2*h/3,u-h*k1/3+h*k2);
k4=f(a+count*h+h,u+h*k1-h*k2+h*k3);
u=u+h*(k1+3*k2+3*k3+k4)/8;
count<<u<<endl;
}

}
}; 

void main()
{
RK my;
my.seth(0.1);
my.setf(0,1,1);
my.dork();
}

--------------------------------------------------------------------------------------
快速排序 

算法的基本思想:

快速排序的基本思想是基于分治策略的。對于輸入的子序列ap..ar,假如規(guī)模足夠小則直接進(jìn)行排序,否則分三步處理:

分解(Divide):將輸入的序列ap..ar劃分成兩個(gè)非空子序列ap..aq和aq+1..ar,使ap..aq中任一元素的值不大于aq+1..ar中任一元素的值。 
遞歸求解(Conquer):通過遞歸調(diào)用快速排序算法分別對ap..aq和aq+1..ar進(jìn)行排序。 
合并(Merge):由于對分解出的兩個(gè)子序列的排序是就地進(jìn)行的,所以在ap..aq和aq+1..ar都排好序后不需要執(zhí)行任何計(jì)算ap..ar就已排好序。 
這個(gè)解決流程是符合分治法的基本步驟的。因此,快速排序法是分治法的經(jīng)典應(yīng)用實(shí)例之一。

算法Quick_Sort的實(shí)現(xiàn):

Pascal實(shí)現(xiàn):
Procedure Quick_Sort(p,r:TPosition;var L:TList); {快速排序}

var

q:TPosition;

begin

if L[p..r]足夠小 then Sort(p,r,L) {若L[p..r]足夠小則直接對L[p..r]排序}

else

begin

q:=Partition(p,r,L); {將L[p..r]分解為L[p..q]和L[q+1..r]兩部分}

Quick_Sort(p,q,L); {遞歸排序L[p..q]}

Quick_Sort(q+1,r,L); {遞歸排序L[q+1..r]}

end;

end;

--------------------------------------------------------------------------------------
【題目】設(shè)中序線索二叉樹的結(jié)點(diǎn)結(jié)構(gòu)為:leftltagdatartagright. 現(xiàn)已知中序線索
二叉樹的根結(jié)點(diǎn)地址root。設(shè)計(jì)一程序,打印出該線索二叉樹的中序遍歷結(jié)果.不得
再使用O(n)級的輔存空間。

【來源】上海交通大學(xué)96年第十題(15') 

【解答】intravers(root:bitree)
finished:=false;t:=root;
while not finished do

while t↑.ltag=0 do t:=t↑.lch // 左孩子不空
write(t↑.data); // 訪問左孩子
if t↑.rtag=1 then 
【t:=t↑.rch;{后繼結(jié)點(diǎn)}
write(t↑.data);{訪問當(dāng)前根結(jié)點(diǎn)}
t:=t↑.rch{訪問當(dāng)前根結(jié)點(diǎn)的右孩子}

else 
t:=t↑.rch; // 右孩子不空


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南康市| 贺兰县| 晋城| 平和县| 武冈市| 观塘区| 台江县| 大邑县| 昔阳县| 河东区| 嘉黎县| 仁化县| 行唐县| 保康县| 陈巴尔虎旗| 宿州市| 蒲城县| 尼勒克县| 宁国市| 海南省| 商南县| 贡嘎县| 理塘县| 富宁县| 镇雄县| 遂宁市| 博白县| 仁布县| 延寿县| 盐源县| 顺平县| 望城县| 新营市| 邹平县| 恩平市| 孝感市| 友谊县| 贡觉县| 沭阳县| 宝鸡市| 林甸县|