數據I演算法
1. 數據結構演算法問題
該操作ComareOrderList是比較有序表的大小。
個人見解,僅供參考
A,B都應該是有序表
if(A.elem[i]>B.elem[i]) j=1 如果A中的某個元素大於B中對應位序的元素,那麼j=1.
if(A.elem[i]<B.elem[i]) j=-1 如果A中的某個元素小於B中對應位序的元素,那麼j=-1.
j=1表示有序表A大,-1表示有序表A小,0表示A,B相等。
但是我覺得該演算法有問題,修改如下:
Status ComareOrderList(SqList &A,SqList &B)
{//比較兩個有序表A,B的大小,如果兩表長度相等,且對應位序的元素相等,則兩表相等函數返回0;若A表某個元素大於B表中對應位序的元素,則A表大返回1;否則A表小,返回-1.
int i,k,j;
if(A.length>B.length) j=1;
else if(A.length<B.length) j=-1;
else { k=A.length;
for(i=0;i<k;i++) {
if(A.elem[i]>B.elem[i])
{ j=1;break;}
if(A.elem[i]<B.elem[i])
{j=-1;break;}
}
if(i==k) j=0;
}
return j;
}
2. 數據結構中演算法的時間復雜度計算
1、s的增長序列為:1,2,3,4,……,所以循環loop次後s=1+2+3+……+loop,s=n時結束循環。
由:1+2+3+……+loop=n 得到: loop=O(sqrt(n));
2、循環loop次後, i=2^loop, 由i=n,得到: loop=log(n);
就是看循環執行了多少次,看執行多少步後i滿足循環退出的條件。
3. 數據結構演算法,,
A->next=NULL 單獨用是沒有意義的。
它的作用有幾個:
1,A的值,在代碼pa=A; qa=pa;的時候已經保存了。這時的A可以理解成為一個自由的變數。
2,可做為C的第一個結點,初始next的值當然是NULL。
3,結合代碼看來(qa->next=A->next; //將當前最小結點插入A表表頭)可以看出。
註:看情況,本演算法代碼還沒有全部貼出來!
4. 數據結構演算法編程
/**<
數據結構實驗編程,要求如下:
1)單鏈表結點類的定義。
2)單鏈表類的定義。
3)在單鏈表的第i個結點前插入一個結點。
4)在單鏈表的第i個結點前刪除一個結點。
5)在單鏈表中查找第i個結點。
6)更新單鏈表中第i個結點的值。
7)遍歷單鏈表。
希望給出源程序,讓我好好研究一下。前提必須要能運行出正確的結果。謝謝!我用的軟體是Devc++,
如果可以運行出正確結果,定採納!再次感謝!
*/
#include<iostream>
usingnamespacestd;
classNode{
public:
Node(){
id=0;
next=NULL;
}
Node(inti){
id=i;
next=NULL;
}
intid;
Node*next;
};
classChain{
private:
Node*head;
//Node*tail;
intnum;
public:
Chain(){
head=NULL;
//tail=NULL;
num=0;
}
~Chain(){
Node*t=head;
while(t)
{
head=t->next;
deletet;
t=head;
}
cout<<"release"<<endl;
}
voidsetHead(Node*head){
this->head=head;
}
Node*getHead(){
returnhead;
}
voidsetNum(intnum){
this->num=num;
}
intgetNum(){
returnnum;
}
boolinsertIns(Node*ins);
boolinsBefore(Node*ins,inti);
booldelBef(inti);
Node*findI(inti);
boolupdate(inti,intid);
voidChain::travel();
};
boolChain::insertIns(Node*ins){
if(!ins)
returnfalse;
if(NULL==head){
head=ins;
num++;
returntrue;
}
Node*cur=head;
while(NULL!=cur->next)
{
cur=cur->next;
}
cur->next=ins;
num++;
returntrue;
}
boolChain::insBefore(Node*ins,inti)
{
if(i==1){
ins->next=head;
head=ins;
num++;
returntrue;
}
if(i>this->num)
returnfalse;
intpre=i-1;
intcur=1;
Node*curPt=head;
while(curPt&&cur!=pre)
{
curPt=curPt->next;
cur++;
}
if(NULL!=curPt&&cur==pre)
{
cout<<"insBefore:curPt.id="<<curPt->id<<endl;
Node*t=curPt->next;
curPt->next=ins;
ins->next=t;
this->num++;
returntrue;
}
returnfalse;
}
boolChain::delBef(inti)
{
if(i<=1||i>num)
returnfalse;
Node*res=findI(i-2);
if(NULL==res)
{
res=findI(i-1);
if(res==head)
{
head=head->next;
deleteres;
num--;
returntrue;
}
else
returnfalse;//onlyone
}else{
Node*tmp=res->next->next;
Node*tar=res->next;
deletetar;
res->next=tmp;
num--;
returntrue;
}
//if(i<0||i>num)
//returnfalse;
//Node*tmp=NULL;
//if(1==i)
//{
//tmp=head->next;
//deletehead;
//head=tmp;
//num--;
//returntrue;
//}
//Node*p=findI(i-1);
//if(p){
//tmp=p->next->next;
//deletep->next;
//p->next=tmp;
//num--;
//}
//else{
//returnfalse;
//}
//returntrue;
}
Node*Chain::findI(inti)
{
if(i<0||i>num)
returnNULL;
intcur=1;
Node*p=head;
while(cur!=i){
p=p->next;
cur++;
}
returnp;
}
boolChain::update(inti,intid)
{
Node*res=findI(i);
boolflag=false;
if(res)
{
res->id=id;
flag=true;
}
returnflag;
}
voidChain::travel(){
Node*cur=head;
while(cur)
{
cout<<cur->id<<"";
cur=cur->next;
}
cout<<endl;
}
intmain()
{
Node*npt=NULL;
Chain*cpt=newChain;
for(inti=0;i<9;i++){
npt=newNode;
if(npt){
npt->id=i+1;
cpt->insertIns(npt);
}
}
if(NULL==cpt)
return-1;
cpt->travel();
cout<<"here ";
boolres=false;
if(npt)
{
npt=newNode(12);
res=cpt->insBefore(npt,7);
if(res)
cpt->travel();
else
cout<<"insBeforefailed! ";
}
cout<<"here2 ";
//
res=cpt->delBef(1);
cout<<"here2.2 ";
if(res)
{
cout<<"del1"<<endl;
cpt->travel();
}
cout<<"here2.5 ";
res=cpt->delBef(5);
cout<<"here3 ";
if(res)
{
puts("del5[[[[");
cpt->travel();
puts("del5]]]]");
}
///
npt=cpt->findI(5);
printf("findIid=%d ",npt->id);
cpt->travel();
///
cpt->update(5,99);
cpt->travel();
cout<<"------"<<endl;
return0;
}
//簡單測試了一下
5. 數據結構中用dijkstra演算法 表中的i是什麼意思
你好你大哥就似我,你用一個數組 dist 記錄最短路徑長,用另一個數組 pre 記錄直接前驅。關鍵語句如下:
if (dist[j] > dist[i] + edge[i, j])
{
dist[j] = dist[i] + edge[i, j];
pre[j] = i;
}
這樣就行了。
6. 數據結構演算法求助
確實是有點小問題,所以達不到要求了
其實這個演算法的思想是就是用第一個循環先拷貝第一段到s後面緊挨著,然後將後面的一段拷貝到再後面,只是循環的起點有誤,這樣改1個字元就可以了:
for(j=m+t-i;j<=s;j++) 改為:for(j=m+t-1;j<=s;j++)
7. 數據擬合演算法
解:設一共有n個方程,第i個方程形如aiX1+biX2=ci,其中ai,bi,ci是已知數
設di(x1,x2)=(ci-aix1-bix2)(ci-aix1-bix2)
設D= d1+d2+...dn
原問題就是求D的極小值,分別求D關於x1和x2的偏導數,得
Dx1=2a1(a1x1+b1x2-c1)+2a2(a2x1+b2x2-c2)+...2an(anx1+bnx2-cn)
Dx2=2b1(a1x1+b1x2-c1)+2b2(a2x1+b2x2-c2)+...2bn(anx1+bnx2-cn)
極小值處偏導數等於0,所以令Dx1=0,Dx2=0建立方程組,解得
x1=(F*B-G*E)/(A*B-E*E)
x2=(G*A-F*E)/(A*B-E*E)
其中F=a1c1+a2c2+...+ancn
G=b1c1+b2c2+...+bncn
E=a1b1+a2b2+...+anbn
A=a1a1+a2a2+...+anan
B=b1b1+b2b2+...+bnbn
具體數據這里就不算了,用excel把公式打進去就可以算,另外excel本身就帶擬合功能
8. 數據的演算法都有哪些……
A*搜尋演算法
俗稱A星演算法。這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的演算法。常用於游戲中的 NPC的移動計算,或線上游戲的 BOT的移動計算上。該演算法像 Dijkstra演算法一樣,可以找到一條最短路徑;也像BFS一樣,進行啟發式的搜索。
Beam Search
束搜索(beam search)方法是解決優化問題的一種啟發式方法,它是在分枝定界方法基礎上發展起來的,它使用啟發式方法估計k個最好的路徑,僅從這k個路徑出發向下搜索,即每一層只有滿意的結點會被保留,其它的結點則被永久拋棄,從而比分枝定界法能大大節省運行時間。束搜索於20 世紀70年代中期首先被應用於 人工智慧領域,1976 年Lowerre在其稱為 HARPY的語音識別系統中第一次使用了束搜索方法。他的目標是並行地搜索幾個潛在的最優決策路徑以減少回溯,並快速地獲得一個解。
二分取中查找演算法
一種在有序數組中查找某一特定元素的搜索演算法。搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。這種搜索演算法每一次比較都使搜索范圍縮小一半。
Branch and bound
分支定界演算法是一種在問題的解空間樹上搜索問題的解的方法。但與回溯演算法不同,分支定界演算法採用廣度優先或最小耗費優先的方法搜索解空間樹,並且,在分支定界演算法中,每一個活結點只有一次機會成為擴展結點。
數據壓縮
數據壓縮是通過減少計算機中所存儲數據或者通信傳播中數據的冗餘度,達到增大數據密度,最終使數據的存儲空間減少的技術。數據壓縮在文件存儲和分布式系統領域有著十分廣泛的應用。數據壓縮也代表著尺寸媒介容量的增大和網路帶寬的擴展。
Diffie–Hellman密鑰協商
Diffie–Hellman key exchange,簡稱「D–H」,是一種安全協議。它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道建立起一個密鑰。這個密鑰可以在後續的通訊中作為對稱密鑰來加密通訊內容。
Dijkstra』s 演算法
迪科斯徹演算法(Dijkstra)是由荷蘭計算機科學家艾茲格·迪科斯徹發明的。演算法解決的是有向圖中單個源點到其他頂點的最短路徑問題。舉例來說,如果圖中的頂點表示城市,而邊上的權重表示著城市間開車行經的距離,迪科斯徹演算法可以用來找到兩個城市之間的最短路徑。
動態規劃
動態規劃是一種在 數學和計算機科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。 動態規劃的思想是多種演算法的基礎,被廣泛應用於計算機科學和工程領域。比較著名的應用實例有:求解最短路徑問題,背包問題,項目管理,網路流優化等。這里也有一篇文章說得比較詳細。
歐幾里得演算法
在 數學中,輾轉相除法,又稱 歐幾里得演算法,是求 最大公約數的演算法。輾轉相除法首次出現於 歐幾里得的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至 東漢出現的《九章算術》。
快速傅里葉變換(FFT)
快速傅里葉變換(Fast Fourier Transform,FFT),是離散傅里葉變換的快速演算法,也可用於計算離散傅里葉變換的逆變換。快速傅里葉變換有廣泛的應用,如數字信號處理、計算大整數乘法、求解偏微分方程等等。
哈希函數
HashFunction是一種從任何一種數據中創建小的數字「指紋」的方法。該 函數將數據打亂混合,重新創建一個叫做散列值的指紋。散列值通常用來代表一個短的隨機字母和數字組成的字元串。好的散列 函數在輸入域中很少出現散列沖突。在散列表和數據處理中,不抑制沖突來區別數據,會使得資料庫記錄更難找到。
堆排序
Heapsort是指利用堆積樹(堆)這種 數據結構所設計的一種排序演算法。堆積樹是一個近似完全二叉樹的結構,並同時滿足堆積屬性:即子結點的鍵值或索引總是小於(或者大於)它的父結點。
歸並排序
Merge sort是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
RANSAC 演算法
RANSAC 是」RANdom SAmpleConsensus」的縮寫。該演算法是用於從一組觀測數據中估計 數學模型參數的迭代方法,由Fischler and Bolles在1981提出,它是一種非確定性演算法,因為它只能以一定的概率得到合理的結果,隨著迭代次數的增加,這種概率是增加的。該演算法的基本假設是觀測數據集中存在」inliers」(那些對模型參數估計起到支持作用的點)和」outliers」(不符合模型的點),並且這組觀測數據受到雜訊影響。RANSAC 假設給定一組」inliers」數據就能夠得到最優的符合這組點的模型。
RSA加密演演算法
這是一個公鑰加密演算法,也是世界上第一個適合用來做簽名的演算法。今天的RSA已經 專利失效,其被廣泛地用於 電子商務加密,大家都相信,只要密鑰足夠長,這個演算法就會是安全的。
並查集Union-find
並查集是一種樹型的 數據結構,用於處理一些不相交集合(Disjoint Sets)的合並及查詢問題。常常在使用中以森林來表示。
Viterbi algorithm
尋找最可能的隱藏狀態序列
等等這些,演算法很多。
9. 數據與結構演算法
不是叫做:數據與結構演算法,而是應該叫做:《數據結構與演算法》,其中:數據結構指的是:順序表、堆棧、鏈表、二叉樹、圖等;而演算法一般指的是:各種搜索演算法(順序搜索、二分搜素等)、以及各種排序演算法等。
至於說程序中到底是哪一個地方出現 bug,那可不是通過在紙上分析能夠分析出來的,而是必須要親自上機在機器上面調試出來的。
10. 數據結構與演算法
int fib(int n)
{
int a,b,sum,i;
a=b=1; i=3; sum=a+b;
if (n==1||n==2) return 1;
while (i<=n)
{
a=b;
b=sum; \遞歸展開\
sum=a+b;
i++;
}
return sum;
}