查找演算法總結
① 數組的冒泡排序和分塊查找法
#include<iostream.h>
const int N=12,M=3;
void numbers (int a[]) //輸入數組元素
{
cout<<"請輸入"<<N<<"個元素"<<endl;
for(int i=0;i<N;i++)
cin>>a;
}
void sort(int a[],int n) //冒泡法排序
{
int t;
for(int i=0;i<n-1;i++)
for(int j=0;j<n-1-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
void search(int a[]) //分塊查找法
{
int x,j,i;
cout<<"請輸入要查找的元素"<<endl;
cin>>x;
int b[N][2];
for(j=0,i=3;j<3,i<12;j++,i+=4)
b[j][0]=a;
for(j=0,i=0;j<3,i<12;j++,i+=4)
b[j][1]=i;
for(j=0;j<3;j++)
{
if(x<=b[j][0])
break;
}
if(x>a[N-1])
{
cout<<x<<" "<<"不在您要查找的數組中"<<endl;
return;
}
{
int top=b[j][1],bottom=b[j][1]+N/M-1,middle=(top+bottom)/2; //折半查找法
while(top<=bottom)
{
if(x==a[middle])
break;
else if(x>a[middle])
top=middle+1;
else
bottom=middle-1;
middle=(top+bottom)/2;
}
if(x==a[middle])
{
cout<<x<<" "<<"在您要查找的數組中"<<endl;
}
else
{
cout<<x<<" "<<"不在您要查找的數組中"<<endl;
}
}
}
定義:折半查找技術,也就是二分查找。它的前提是線性表中的記錄必須是關鍵碼有序(通常從大到小有序),線性表必須採用順序存儲。
折半查找的基本思想:取中間記錄作為比較對象,若給定值與中間記錄的關鍵字,則在中間記錄的關鍵字相等,則查找成功;若給定值小於中間記錄的作伴去繼續查找;若給定值大於中間記錄的關鍵字,則在中間記錄的右半區繼續查找。不斷重復上述過程,直到查找成功,或所有查找區域無記錄,查找失敗為止。
實現代碼:
<?php //遞歸方式 function bin_recur_search($arr,$val){ global $time; if(count($arr) >= 1){ $mid = intval(count($arr) / 2); $time++; if($arr[$mid] == $val){ return '值為:'.$arr[$mid].'<br>查找次數:'.$time.'<br>'; }elseif($arr[$mid] > $val){ $arr = array_splice($arr,0,$mid); return bin_recur_search($arr, $val); }else{ $arr = array_slice($arr,$mid + 1); return bin_recur_search($arr, $val); } } return '未找到'.$val; } //非遞歸方式 function bin_search($arr,$val){ if(count($arr) >= 1){ $low = 0; $high = count($arr); $time = 0; while($low <= $high){ $time++; $mid = intval(($low + $high)/2); if($val == $arr[$mid]){ return '索引:'.$mid.'<br>值為:'.$arr[$mid].'<br>查找次數:'.$time; }elseif($val > $arr[$mid]){ $low = $mid + 1; }else{ $high = $mid - 1; } } } return '未找到'.$val; } $arr = array(1,3,5,7,7,9,25,68,98,145,673,8542); echo bin_recur_search($arr, 673); echo bin_search($arr, 673); ?>
運行結果:
值為:673 查找次數:4 索引:10 值為:673 查找次數:4
更多關於PHP相關內容感興趣的讀者可查看本站專題:《PHP數據結構與演算法教程》、《php程序設計演算法總結》、《php字元串(string)用法總結》、《PHP數組(Array)操作技巧大全》、《PHP常用遍歷演算法與技巧總結》及《PHP數學運算技巧總結》
③ 演算法學習心得體會
從基本的數據結構和排序查找開始
然後是貪心,動態規劃等
具體的會涉及到樹圖字元串等有不同的演算法
我覺得演算法這東西是太難了,搞不來。。。
④ 大俠們動態規劃,搜索演算法什麼的在以後的工作中重要不
重要。有人總結:「動貪(動態規劃、貪心),裸做(模擬),暴搜,交表」乃是OI必備
⑤ 怎麼查看百度搜索引擎的演算法
目前已知的網路搜索引擎的演算法
到目前為止,根據各方面數據整理的網路搜索引擎演算法有兩百項左右,今天總結公開其中的130項,希望對大夥兒在操作SEO過程中有所幫助!
1、網站伺服器的穩定性
2、網站伺服器的安全性
網站伺服器的安全是十分重要的,尤其對金融、旅遊、移民等高利潤行業站點。
3、同IP下的網站越少越好
4、同IP下的網站無大量被K
5、同IP下的網站無大量被降權
6、轉移伺服器會影響網站排名
網站搬家、網站轉移伺服器會網站排名的,這里推薦採用網站流量點擊保護可以很大程度避免排名的下滑。
7、域名包含關鍵詞(拼音、英文)
就比如某地區SEO排名,推薦域名中包含有seo等關鍵詞。
8、域名年齡越老越有排名優勢
9、域名主題的轉換直接影響排名
10、備案對網站排名穩定性的重要
11、最好採用DIV+CSS布局
12、表格布局避免過多嵌套
13、網頁編碼對網站的影響
14、整站生成靜態HTML
靜態化肯定是特別利於優化的,但是很多站長的空間沒有那麼大,這里推薦可以採用偽靜態的優化手法。
15、動態URL的優化劣勢
16、目錄的層次不要太深
17、目錄名稱的優化
18、網頁URL不要太長
19、網站內容的原創性
20、避免大量內容重復
21、避免大量採集內容填充
22、避免大量頁面內容相似度太高
23、網站內容不要出現違法字眼
24、內容越豐富越有利於排名
25、內容被收錄的數量越多越好
26、頁面大小(建議小於100K)
頁面內容在滿足用戶需求的同時,盡量體積小些,比如網路的首頁大小才4K。
27、頁面避免出現太多圖片
28、網站sitemap時時更新與提交
29、新頁面產生的速率
30、網站Meta的優化設計
31、Deion的優化設計
32、Keywords的優化設計
33、避免太多無關的關鍵詞
34、網頁PR值對排名的影響
35、核心關鍵詞的選取
對網站核心關鍵詞一定要定位準確,太原網站推廣和太原網站建設雖然是很相近,但是優化的時候一定要有個針對性。比如:某某裝修公司,既包含某某裝修公司,又能給用戶最為順暢方便記憶的標題。
36、擴展關鍵詞的選取
37、長尾關鍵詞的選擇
38、關鍵詞在網站TITLE上的使用
最好的關鍵詞在title顯示是一句通順的語句,既適合搜索引擎的匹配抓取,又適合用戶的瀏覽點擊。
39、保持網頁Title的唯一性
40、標題設計不要過長
這里主要是針對快照索引位元組,對手機站的標題就需要更少點,畢竟現在移動端站優化也是主流方向,對移動站標題的設計就需要更少位元組。
41、標題不要堆砌關鍵詞
42、標題的分詞描寫規則
43、標題描寫結合長尾關鍵詞
44、每個標題最好突出1-2個關鍵詞
45、關鍵詞在Meta Deion中的使用
可參考趙一鳴隨筆博客的deion寫法
46、關鍵詞在Meta Keywords中的使用
47、關鍵詞在H1、H2、H3標簽中的使用
48、一個頁面盡量只使用一個H1
很多人都在好奇為什麼有的網站一直排名那麼好,其實大家可以仔細點開每一個內頁,每一個內頁的標題都是在 H1中包裹的。
49、關鍵詞在頁面URL中的使用
50、在url中使用"-"連接關鍵詞
51、關鍵詞與頁面內容的相關性
52、關鍵詞的加粗優化
53、關鍵詞的斜體優化
54、關鍵詞的下劃線優化
55、關鍵詞的跑馬燈優化
56、關鍵詞字體大小
57、圖片的關鍵詞優化 alt標簽
58、關鍵詞是否突出
59、關鍵詞的密度7%左右
其實網站關鍵詞密度這個事在網站優化過程中並沒有那麼重要,我優化站的時候是不會特意控制關鍵詞密度的,除非碰到一些競爭超級大的行業(比如貸款、旅遊等行業站點)。
60、關鍵詞的集中+分散布局
61、關鍵詞的均勻分散布局
62、網站內部鏈接結構(星狀、樹狀)
63、網站內部鏈接結構(扁平)
64、內部鏈接的數量
65、內部鏈接相關性質量
當兩個網站不分伯仲時,這個時候對網站內鏈的控制就顯得尤為重要了,網站內鏈相關性有多大,太原雅輝裝修網每個裝修效果圖欄目下面的相關推薦都是最相關的。客廳的就推薦客廳,廚房的就推薦廚房。
65、內部鏈接的錨文字
網站內鏈設置得當的話,不僅僅能提升網站主關鍵詞整體的排名,還能提升網站長尾關鍵詞的排名。
66、內部鏈接周圍的文字
67、內部鏈接錨點避免單一
68、內部鏈接的多樣化
69、內部鏈接相關文章交叉
70、內部鏈接創建和更新時間
71、內部鏈接的加粗優化
72、內部鏈接的斜體優化
73、內部鏈接的下劃線優化
74、內部鏈接頁面的PR值
75、內部鏈接產生的速率
76、內部鏈接主題、頁面內容與關鍵詞的相關性
77、內部鏈接存在的時間
78、確保站內鏈接有效
79、網站外部鏈接的穩定性
80、網站外部鏈接的創建和更新時間
都知道,網站外部鏈接是有生命周期的,友情鏈接時間越長越好,對為網站SEO優化主動發的論壇等鏈接時間越近越好。
81、網站外部鏈接網站的PR值
82、網站外部鏈接的主題、頁面內容與關鍵詞的相關性
83、網站外部鏈接產生的速率
雖然很多站長聲稱外鏈是沒有效果了,但是經過我的實驗,主動發的外鏈還是有效果的。
84、網站外部鏈接存在的時長
85、網站外部鏈接指向的頁面有具體內容
這里的外部鏈接通常指一些別人轉發我們網站內容的鏈接,要確保轉發到的平台是和我們網站內容相關的,這樣才能保證高質量外鏈。
86、網站外部鏈接的價值高於互惠鏈接
87、外部連接(反向連接與友情連接)的數量
88、網站外部鏈接的錨文字
89、網站外部鏈接錨點的多樣化
90、網站外部鏈接頁面本身的鏈接權重、質量
91、網站外部鏈接頁面在相關主題的網站中的鏈接權重
92、網站外部鏈接的周圍文字
外部鏈接周圍文字,這也是為什麼我們最後找一些同行站的其中原因之一。
93、網站外部鏈接最好來自不同IP
94、網站外部鏈接的加粗優化
95、網站外部鏈接網站域名的特殊性
96、網站外部鏈接的斜體優化
97、網站外部鏈接的下劃線優化
98、確保站外鏈接有效
有個別不道德的站長,採用nofollow鏈接手法騙取新手站長的首頁鏈接,這里大家一定要慎重。
99、導入鏈接增加速度 (導入鏈接的增加是有周期性的,每天增加可以循環上升)
100、導入鏈接文字不能經常改變
101、導入鏈接的流行程度
102、導入鏈接頁面中關鍵詞密度
103、導入鏈接頁面標題
116、避免頻繁修改網站標題、描述
避免頻繁修改網站的title ,如果修改太頻繁的話,容易使網站進入沙盒期。
117、避免太快修改鏈接
118、避免太快修改頁面
119、避免過多的java
120、避免使用Flash
121、避免使用框架
122、避免使用一個像素的鏈接
123、避免使用隱藏鏈接
124、避免使用看不見的文字
125、避免存在不良的友情網站鏈接
126、避免細節點使用惡劣低級的語言
127、避免導航結構避免使用圖片
128、推薦文章鏈接被大網站引用
129、推薦文章被大量轉載
130、推薦:搜索引擎快照更新快
⑥ 求助,pascal編程搜索演算法的優化,呼叫大牛!!!
這道題的主要演算法是搜索,但當然還有解方程等其他方法,這里主要介紹搜索的方法。
深度搜索每個字母的值
顯然O(n!)的復雜度會超時,那就必然要剪枝
下面來說一下優化
對於一個測試數據
5
ABCED
BDACE
EBBAA
一:剪枝:
如最後一列的D,E,A
如果D,E,A的值都已經搜出來一種方案了,那麼A =(D+E) mod n 即D+E除以n的余數是A,因為D+E有可能〉n並且進位,所以要mod n,詳細一點即,對於搜索出來的D,E,A如果上一位進位則 A=(D+E+1)mod n,不進位則A=(D+E)mod n,不知道是否進位則(A=(D+E+1)mod n)or( A=(D+E)mod n),如果滿足這些條件則繼續,否則退出。
如果只知道D,E則(D+E)mod n(如進位則是(D+E+1)mod n)這個數沒被賦值到其他的字母上去就可以繼續搜,同樣只知道E,A和D,A也可以這樣剪枝。
E,A:[A-E mod n] (進位則是 (A-E-1) mod n)沒被賦給除D外的其它字母
D,A:[A-D mod n] (進位則是 (A-D-1) mod n)沒被賦給除E外的其它字母
二:優化:
還有一個優化就是從搜索順序的優化:搜索順序的改變也成為大大提高程序效率的關鍵:從右往左,按照字母出現順序搜索,有很大程度上提高了先剪掉廢枝的情況。
三:注意:
進位情況要特別注意:
(1)
如果D,E,A都知道,那麼(D+E)DIV n<>0則進位否則不進(上一位進位則(D+E+1)DIV n<>0 )
(2)
如果知道D,E那麼(D+E)DIV n<>0則進位否則不進(上一位進位則(D+E+1)DIV n<>0 ) 特殊情況:如果上一位不確定是否進位那麼又要分情況討論:○1如果進位,不進位兩種情況中只有一種情況合法(即所確定的數符合剪枝條件),那麼就按這種情況確定是不是進位。○2如果兩種情況都合法則,如果兩種情況的進位是否都相同,那麼可以確定這一位是否進位,不同的話則進位狀態賦值為待定。
(3)
知道A,E那麼 A<E則進位否則不進(上一位進位則(A-1)<E ) 特殊情況:同(2)。
(4)
知道A,D那麼 D<E則進位否則不進(上一位進位則(A-1)<D ) 特殊情況:同(2)。
(5)
只知道D,E,A中一個的值,則進位狀態待定。
附:
總結:
搜索解決這道題是最容易想到的,但普通的搜索顯然會超時,所以剪枝非常重要。
剪枝的原則
1、正確性
枝條不是愛剪就能剪的。如果隨便剪枝,把帶有最優解的那一分支也剪掉了的話,剪枝也就失去了意義。所以,剪枝的前提是一定要保證不丟失正確的結果。 2、准確性 在保證了正確性的基礎上,我們應該根據具體問題具體分析,採用合適的判斷手段,使不包含最優解的枝條盡可能多的被剪去,以達到程序「最優化」的目的。可以說,剪枝的准確性,是衡量一個優化演算法好壞的標准。 3、高效性 設計優化程序的根本目的,是要減少搜索的次數,使程序運行的時間減少。但為了使搜索次數盡可能的減少,我們又必須花工夫設計出一個准確性較高的優化演算法,而當演算法的准確性升高,其判斷的次數必定增多,從而又導致耗時的增多,這便引出了矛盾。 因此,如何在優化與效率之間尋找一個平衡點,使得程序的時間復雜度盡可能降低,同樣是非常重要的。倘若一個剪枝的判斷效果非常好,但是它卻需要耗費大量的時間來判斷、比較,結果整個程序運行起來也跟沒有優化過的沒什麼區別,這樣就太得不償失了。 綜上所述,我們可以把剪枝優化的主要原則歸結為六個字:正確、准確、高效。
還有搜索題除了要掌握一般的技巧,也要對每道題的內涵進行挖掘,找到其特性。對症下葯才可有用。
⑦ 百度地圖的路徑搜索演算法
這個還是要問程序猿,現在比較流行A*演算法,至於網路是否開發出了新的演算法不得而知,畢竟沒有完全相同的程序。
給你看一篇文獻:
地圖中最短路徑的搜索演算法研究
學生:李小坤 導師:董巒
摘要:目前為止, 國內外大量專家學者對「最短路徑問題」進行了深入的研究。本文通過理論分析, 結合實際應用,從各個方面較系統的比較廣度優先搜索演算法(BFS)、深度優先搜索演算法(DFS)、A* 演算法的優缺點。
關鍵詞:最短路徑演算法;廣度優先演算法;深度優先演算法;A*演算法;
The shortest path of map's search algorithm
Abstract:So far, a large number of domestic and foreign experts and scholars on the" shortest path problem" in-depth study. In this paper, through theoretical analysis and practical application, comprise with the breadth-first search algorithm ( BFS ), depth-first search algorithm ( DFS ) and the A * algorithms from any aspects of systematic.
Key words: shortest path algorithm; breadth-first algorithm; algorithm; A * algorithm;
前言:
最短路徑問題是地理信息系統(GIS)網路分析的重要內容之一,而且在圖論中也有著重要的意義。實際生活中許多問題都與「最短路徑問題」有關, 比如: 網路路由選擇, 集成電路設計、布線問題、電子導航、交通旅遊等。本文應用深度優先演算法,廣度優先演算法和A*演算法,對一具體問題進行討論和分析,比較三種算的的優缺點。
在地圖中最短路徑的搜索演算法研究中,每種演算法的優劣的比較原則主要遵循以下三點:[1]
(1)演算法的完全性:提出一個問題,該問題存在答案,該演算法能夠保證找到相應的答案。演算法的完全性強是演算法性能優秀的指標之一。
(2)演算法的時間復雜性: 提出一個問題,該演算法需要多長時間可以找到相應的答案。演算法速度的快慢是演算法優劣的重要體現。
(3)演算法的空間復雜性:演算法在執行搜索問題答案的同時,需要多少存儲空間。演算法佔用資源越少,演算法的性能越好。
地圖中最短路徑的搜索演算法:
1、廣度優先演算法
廣度優先演算法(Breadth-First-Search),又稱作寬度優先搜索,或橫向優先搜索,是最簡便的圖的搜索演算法之一,這一演算法也是很多重要的圖的演算法的原型,Dijkstra單源最短路徑演算法和Prim最小生成樹演算法都採用了和寬度優先搜索類似的思想。廣度優先演算法其別名又叫BFS,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位址,徹底地搜索整張圖,直到找到結果為止。BFS並不使用經驗法則演算法。
廣度優先搜索演算法偽代碼如下:[2-3]
BFS(v)//廣度優先搜索G,從頂點v開始執行
//所有已搜索的頂點i都標記為Visited(i)=1.
//Visited的初始分量值全為0
Visited(v)=1;
Q=[];//將Q初始化為只含有一個元素v的隊列
while Q not null do
u=DelHead(Q);
for 鄰接於u的所有頂點w do
if Visited(w)=0 then
AddQ(w,Q); //將w放於隊列Q之尾
Visited(w)=1;
endif
endfor
endwhile
end BFS
這里調用了兩個函數:AddQ(w,Q)是將w放於隊列Q之尾;DelHead(Q)是從隊列Q取第一個頂點,並將其從Q中刪除。重復DelHead(Q)過程,直到隊列Q空為止。
完全性:廣度優先搜索演算法具有完全性。這意指無論圖形的種類如何,只要目標存在,則BFS一定會找到。然而,若目標不存在,且圖為無限大,則BFS將不收斂(不會結束)。
時間復雜度:最差情形下,BFS必須尋找所有到可能節點的所有路徑,因此其時間復雜度為,其中|V|是節點的數目,而 |E| 是圖中邊的數目。
空間復雜度:因為所有節點都必須被儲存,因此BFS的空間復雜度為,其中|V|是節點的數目,而|E|是圖中邊的數目。另一種說法稱BFS的空間復雜度為O(B),其中B是最大分支系數,而M是樹的最長路徑長度。由於對空間的大量需求,因此BFS並不適合解非常大的問題。[4-5]
2、深度優先演算法
深度優先搜索演算法(Depth First Search)英文縮寫為DFS,屬於一種回溯演算法,正如演算法名稱那樣,深度優先搜索所遵循的搜索策略是盡可能「深」地搜索圖。[6]其過程簡要來說是沿著頂點的鄰點一直搜索下去,直到當前被搜索的頂點不再有未被訪問的鄰點為止,此時,從當前輩搜索的頂點原路返回到在它之前被搜索的訪問的頂點,並以此頂點作為當前被搜索頂點。繼續這樣的過程,直至不能執行為止。
深度優先搜索演算法的偽代碼如下:[7]
DFS(v) //訪問由v到達的所有頂點
Visited(v)=1;
for鄰接於v的每個頂點w do
if Visited(w)=0 then
DFS(w);
endif
endfor
end DFS
作為搜索演算法的一種,DFS對於尋找一個解的NP(包括NPC)問題作用很大。但是,搜索演算法畢竟是時間復雜度是O(n!)的階乘級演算法,它的效率比較低,在數據規模變大時,這種演算法就顯得力不從心了。[8]關於深度優先搜索的效率問題,有多種解決方法。最具有通用性的是剪枝,也就是去除沒有用的搜索分支。有可行性剪枝和最優性剪枝兩種。
BFS:對於解決最短或最少問題特別有效,而且尋找深度小,但缺點是內存耗費量大(需要開大量的數組單元用來存儲狀態)。
DFS:對於解決遍歷和求所有問題有效,對於問題搜索深度小的時候處理速度迅速,然而在深度很大的情況下效率不高。
3、A*演算法
1968年的一篇論文,「P. E. Hart, N. J. Nilsson, and B. Raphael. A formal basis for the heuristic determination of minimum cost paths in graphs. IEEE Trans. Syst. Sci. and Cybernetics, SSC-4(2):100-107, 1968」。[9]從此,一種精巧、高效的演算法——A*演算法問世了,並在相關領域得到了廣泛的應用。A* 演算法其實是在寬度優先搜索的基礎上引入了一個估價函數,每次並不是把所有可擴展的結點展開,而是利用估價函數對所有未展開的結點進行估價, 從而找出最應該被展開的結點,將其展開,直到找到目標節點為止。
A*演算法主要搜索過程偽代碼如下:[10]
創建兩個表,OPEN表保存所有已生成而未考察的節點,CLOSED表中記錄已訪問過的節點。
算起點的估價值;
將起點放入OPEN表;
while(OPEN!=NULL) //從OPEN表中取估價值f最小的節點n;
if(n節點==目標節點) break;
endif
for(當前節點n 的每個子節點X)
算X的估價值;
if(X in OPEN)
if(X的估價值小於OPEN表的估價值)
把n設置為X的父親;
更新OPEN表中的估價值; //取最小路徑的估價值;
endif
endif
if(X inCLOSE)
if( X的估價值小於CLOSE表的估價值)
把n設置為X的父親;
更新CLOSE表中的估價值;
把X節點放入OPEN //取最小路徑的估價值
endif
endif
if(X not inboth)
把n設置為X的父親;
求X的估價值;
並將X插入OPEN表中; //還沒有排序
endif
end for
將n節點插入CLOSE表中;
按照估價值將OPEN表中的節點排序; //實際上是比較OPEN表內節點f的大小,從最小路徑的節點向下進行。
end while(OPEN!=NULL)
保存路徑,即 從終點開始,每個節點沿著父節點移動直至起點,這就是你的路徑;
A *演算法分析:
DFS和BFS在展開子結點時均屬於盲目型搜索,也就是說,它不會選擇哪個結點在下一次搜索中更優而去跳轉到該結點進行下一步的搜索。在運氣不好的情形中,均需要試探完整個解集空間, 顯然,只能適用於問題規模不大的搜索問題中。而A*演算法與DFS和BFS這類盲目型搜索最大的不同,就在於當前搜索結點往下選擇下一步結點時,可以通過一個啟發函數來進行選擇,選擇代價最少的結點作為下一步搜索結點而跳轉其上。[11]A *演算法就是利用對問題的了解和對問題求解過程的了解, 尋求某種有利於問題求解的啟發信息, 從而利用這些啟發信息去搜索最優路徑.它不用遍歷整個地圖, 而是每一步搜索都根據啟發函數朝著某個方向搜索.當地圖很大很復雜時, 它的計算復雜度大大優於D ijks tr a演算法, 是一種搜索速度非常快、效率非常高的演算法.但是, 相應的A*演算法也有它的缺點.啟發性信息是人為加入的, 有很大的主觀性, 直接取決於操作者的經驗, 對於不同的情形要用不同的啟發信息和啟發函數, 且他們的選取難度比較大,很大程度上找不到最優路徑。
總結:
本文描述了最短路徑演算法的一些步驟,總結了每個演算法的一些優缺點,以及演算法之間的一些關系。對於BFS還是DFS,它們雖然好用,但由於時間和空間的局限性,以至於它們只能解決規模不大的問題,而最短或最少問題應該選用BFS,遍歷和求所有問題時候則應該選用DFS。至於A*演算法,它是一種啟發式搜索演算法,也是一種最好優先的演算法,它適合於小規模、大規模以及超大規模的問題,但啟發式搜索演算法具有很大的主觀性,它的優劣取決於編程者的經驗,以及選用的啟發式函數,所以用A*演算法編寫一個優秀的程序,難度相應是比較大的。每種演算法都有自己的優缺點,對於不同的問題選擇合理的演算法,才是最好的方法。
參考文獻:
[1]陳聖群,滕忠堅,洪親,陳清華.四種最短路徑演算法實例分析[J].電腦知識與技術(學術交流),2007(16):1030-1032
[2]劉樹林,尹玉妹.圖的最短路徑演算法及其在網路中的應用[J].軟體導刊,2011(07):51-53
[3]劉文海,徐榮聰.幾種最短路徑的演算法及比較[J].福建電腦,2008(02):9-12
[4]鄧春燕.兩種最短路徑演算法的比較[J].電腦知識與技術,2008(12):511-513
[5]王蘇男,宋偉,姜文生.最短路徑演算法的比較[J].系統工程與電子技術,1994(05):43-49
[6]徐鳳生,李天志.所有最短路徑的求解演算法[J].計算機工程與科學,2006(12):83-84
[7]李臣波,劉潤濤.一種基於Dijkstra的最短路徑演算法[J].哈爾濱理工大學學報,2008(03):35-37
[8]徐鳳生.求最短路徑的新演算法[J].計算機工程與科學,2006(02).
[9] YanchunShen . An improved Graph-based Depth-First algorithm and Dijkstra algorithm program of police patrol [J] . 2010 International Conference on Electrical Engineering and Automatic Control , 2010(3) : 73-77
[10]部亞松.VC++實現基於Dijkstra演算法的最短路徑[J].科技信息(科學教研),2008(18):36-37
[11] 楊長保,王開義,馬生忠.一種最短路徑分析優化演算法的實現[J]. 吉林大學學報(信息科學版),2002(02):70-74
⑧ 百度和Google的搜索演算法,技術有何差異
我們直接分析博百優在網路和谷歌首頁排名情況,就可以知道,網路與谷歌的排名演算法有較大的出入,不過隨著時間的推移,這種差異會越來越小,畢竟搜索引擎排名的核心思想都是差不多的,都是給用戶提供最實用的信息。
一、分析谷歌與網路的細節異同
1、從這次比賽看來,谷歌對新站有特別照顧機會,前期會獲得不錯的排名,不過,慢慢的又會降下來,網路雖然對新站也有特別照顧機會,不過和老網站比起來,這些機會幾乎看不到了。
2、網路的老站權重繼承
很明顯,這次比賽,大部分人都是通過修改標題形式參賽,所以在短時間內都在網路獲得不錯的排名,這都利益於老站權重的繼承,看誰原站的權重高,在前期就排的最前面,谷歌似乎這種情況不太明顯,改了標題後,就會從新對你考察,考察你的相關內容是否豐富,是否相關性很強,在決定你的排名情況,而不考慮以前權重有多高。
3、雖然網路和谷歌對外鏈的數量和質量影響網站權重的重要因素,但谷歌更注重外鏈的質量上,如果你的站外鏈質量非常多,一般都能獲得不錯的排名。
4、對原創文章的分析上,谷歌分析水平比網路更高,對原創質量要求更高,偽原創分辯能力更強。這一點不得不承認谷歌技術的先進。
5、谷歌對主域名排名更具有優先權,博百優官方網子論壇,雖然外鏈和內容上都遠遠超過其它參賽站點,但在谷歌前幾頁都找不到博百優官方網子論壇,期重要原因是谷歌對主域名具有更高的權重。
二、分析以下幾個重要因素的異同
1、原創方面
網路和谷歌對原創都非常看重,內容為王,這是永久的真理,不過谷歌對原創文章質量分析能力更強。
2、外鏈方面
無論是網路和谷歌,外鏈絕對是影響排名的重要因素,質量比數量更重要,但谷歌更看重高質量的外鏈,對排名的作用會更大一些。
3、內容相關性方面
無論哪個搜索引擎,內容與主題越相關,排名肯定更有優勢,,但放在一起對比,發現,谷歌對內容高度相關的站點,更具有排名優先權。而網路可能還會去考察其它因素。
4、快照方面
這一點二者都一樣,快照越新,相應權重會越高一些,但要在其它重要因素的前提下才能發揮作用。這個分析並不是很權威,有些可能和大家所想的有出入,不過沒關系,這個分析是初版,以後會總結和分析出更完美版,請關注!
⑨ C語言編寫數據結構查找演算法
實驗五 查找的實現
一、 實驗目的
1.通過實驗掌握查找的基本概念;
2.掌握順序查找演算法與實現;
3.掌握折半查找演算法與實現。
二、 實驗要求
1. 認真閱讀和掌握本實驗的參考程序。
2. 保存程序的運行結果,並結合程序進行分析。
三、 實驗內容
1、建立一個線性表,對表中數據元素存放的先後次序沒有任何要求。輸入待查數據元素的關鍵字進行查找。為了簡化演算法,數據元素只含一個整型關鍵字欄位,數據元素的其餘數據部分忽略不考慮。建議採用前哨的作用,以提高查找效率。
2、查找表的存儲結構為有序表,輸入待查數據元素的關鍵字利用折半查找方法進行查找。此程序中要求對整型量關鍵字數據的輸入按從小到大排序輸入。
一、順序查找
順序查找代碼:
#include"stdio.h"
#include"stdlib.h"
typedef struct node{
intkey;
}keynode;
typedef struct Node{
keynoder[50];
intlength;
}list,*sqlist;
int Createsqlist(sqlist s)
{
inti;
printf("請輸入您要輸入的數據的個數:\n");
scanf("%d",&(s->length));
printf("請輸入您想輸入的%d個數據;\n\n",s->length);
for(i=0;i<s->length;i++)
scanf("%d",&(s->r[i].key));
printf("\n");
printf("您所輸入的數據為:\n\n");
for(i=0;i<s->length;i++)
printf("%-5d",s->r[i].key);
printf("\n\n");
return1;
}
int searchsqlist(sqlist s,int k)
{
inti=0;
s->r[s->length].key=k;
while(s->r[i].key!=k)
{
i++;
}
if(i==s->length)
{
printf("該表中沒有您要查找的數據!\n");
return-1;
}
else
returni+1;
}
sqlist Initlist(void)
{
sqlistp;
p=(sqlist)malloc(sizeof(list));
if(p)
returnp;
else
returnNULL;
}
main()
{
intkeyplace,keynum;//
sqlistT;//
T=Initlist();
Createsqlist(T);
printf("請輸入您想要查找的數據的關鍵字:\n\n");
scanf("%d",&keynum);
printf("\n");
keyplace=searchsqlist(T,keynum);
printf("您要查找的數據的位置為:\n\n%d\n\n",keyplace);
return2;
}
順序查找的運行結果:
二、折半查找
折半查找代碼:
#include"stdio.h"
#include"stdlib.h"
typedef struct node{
intkey;
}keynode;
typedef struct Node{
keynoder[50];
intlength;
}list,*sqlist;
int Createsqlist(sqlist s)
{
inti;
printf("請輸入您要輸入的數據的個數:\n");
scanf("%d",&(s->length));
printf("請由大到小輸入%d個您想輸入的個數據;\n\n",s->length);
for(i=0;i<s->length;i++)
scanf("%d",&(s->r[i].key));
printf("\n");
printf("您所輸入的數據為:\n\n");
for(i=0;i<s->length;i++)
printf("%-5d",s->r[i].key);
printf("\n\n");
return1;
}
int searchsqlist(sqlist s,int k)
{
intlow,mid,high;
low=0;
high=s->length-1;
while(low<=high)
{
mid=(low+high)/2;
if(s->r[mid].key==k)
returnmid+1;
elseif(s->r[mid].key>k)
high=mid-1;
else
low=mid+1;
}
printf("該表中沒有您要查找的數據!\n");
return-1;
}
sqlist Initlist(void)
{
sqlistp;
p=(sqlist)malloc(sizeof(list));
if(p)
returnp;
else
returnNULL;
}
main()
{
intkeyplace,keynum;//
sqlistT;//
T=Initlist();
Createsqlist(T);
printf("請輸入您想要查找的數據的關鍵字:\n\n");
scanf("%d",&keynum);
printf("\n");
keyplace=searchsqlist(T,keynum);
printf("您要查找的數據的位置為:\n\n%d\n\n",keyplace);
return2;
}
折半查找運行結果:
三、實驗總結:
該實驗使用了兩種查找數據的方法(順序查找和折半查找),這兩種方法的不同之處在於查找方式和過程不同,線性表的創建完全相同,程序較短,結果也一目瞭然。