當前位置:首頁 » 操作系統 » 依賴的演算法

依賴的演算法

發布時間: 2022-11-04 14:23:47

⑴ 關於時間依賴的最短路徑演算法

Dijkstra 最短路徑演算法的一種高效率實現*

隨著計算機的普及以及地理信息科學的發展,GIS因其強大的功能得到日益廣泛和深入的應用。網路分析作為GIS最主要的功能之一,在電子導航、交通旅遊、城市規劃以及電力、通訊等各種管網、管線的布局設計中發揮了重要的作用,而網路分析中最基本最關鍵的問題是最短路徑問題。最短路徑不僅僅指一般地理意義上的距離最短,還可以引申到其他的度量,如時間、費用、線路容量等。相應地,最短路徑問題就成為最快路徑問題、最低費用問題等。由於最短路徑問題在實際中常用於汽車導航系統以及各種應急系統等(如110報警、119火警以及醫療救護系統),這些系統一般要求計算出到出事地點的最佳路線的時間應該在1 s~3 s內,在行車過程中還需要實時計算出車輛前方的行駛路線,這就決定了最短路徑問題的實現應該是高效率的。其實,無論是距離最短、時間最快還是費用最低,它們的核心演算法都是最短路徑演算法。經典的最短路徑演算法——Dijkstra演算法是目前多數系統解決最短路徑問題採用的理論基礎,只是不同系統對Dijkstra演算法採用了不同的實現方法。
據統計,目前提出的此類最短路徑的演算法大約有17種。F.Benjamin Zhan等人對其中的15種進行了測試,結果顯示有3種效果比較好,它們分別是:TQQ(graph growth with two queues)、DKA (the Dijkstra's algorithm implemented with approximate buckets) 以及 DKD (the Dijkstra�s algorithm implemented with double buckets ),這些演算法的具體內容可以參見文獻〔1〕。其中TQQ演算法的基礎是圖增長理論,較適合於計算單源點到其他所有點間的最短距離;後兩種演算法則是基於Dijkstra的演算法,更適合於計算兩點間的最短路徑問題〔1〕。總體來說,這些演算法採用的數據結構及其實現方法由於受到當時計算機硬體發展水平的限制,將空間存儲問題放到了一個很重要的位置,以犧牲適當的時間效率來換取空間節省。目前,空間存儲問題已不是要考慮的主要問題,因此有必要對已有的演算法重新進行考慮並進行改進,可以用空間換時間來提高最短路徑演算法的效率。
1 經典Dijkstra演算法的主要思想
Dijkstra演算法的基本思路是:假設每個點都有一對標號 (dj, pj),其中dj是從起源點s到點j的最短路徑的長度 (從頂點到其本身的最短路徑是零路(沒有弧的路),其長度等於零);pj則是從s到j的最短路徑中j點的前一點。求解從起源點s到點j的最短路徑演算法的基本過程如下:
1) 初始化。起源點設置為:① ds=0, ps為空;② 所有其他點: di=∞, pi= ;③ 標記起源點s,記k=s,其他所有點設為未標記的。
2) 檢驗從所有已標記的點k到其直接連接的未標記的點j的距離,並設置:
dj=min〔dj, dk+lkj〕
式中,lkj是從點k到j的直接連接距離。
3) 選取下一個點。從所有未標記的結點中,選取dj 中最小的一個i:
di=min〔dj, 所有未標記的點j〕
點i就被選為最短路徑中的一點,並設為已標記的。
4) 找到點i的前一點。從已標記的點中找到直接連接到點i的點j*,作為前一點,設置:
i=j*
5) 標記點i。如果所有點已標記,則演算法完全推出,否則,記k=i,轉到2) 再繼續。
2 已有的Dijkstra演算法的實現
從上面可以看出,在按標記法實現Dijkstra演算法的過程中,核心步驟就是從未標記的點中選擇一個權值最小的弧段,即上面所述演算法的2)~5)步。這是一個循環比較的過程,如果不採用任何技巧,未標記點將以無序的形式存放在一個鏈表或數組中。那麼要選擇一個權值最小的弧段就必須把所有的點都掃描一遍,在大數據量的情況下,這無疑是一個制約計算速度的瓶頸。要解決這個問題,最有效的做法就是將這些要掃描的點按其所在邊的權值進行順序排列,這樣每循環一次即可取到符合條件的點,可大大提高演算法的執行效率。另外,GIS中的數據 (如道路、管網、線路等)要進行最短路徑的計算,就必須首先將其按結點和邊的關系抽象為圖的結構,這在GIS中稱為構建網路的拓撲關系 (由於這里的計算與面無關,所以拓撲關系中只記錄了線與結點的關系而無線與面的關系,是不完備的拓撲關系)。如果用一個矩陣來表示這個網路,不但所需空間巨大,而且效率會很低。下面主要就如何用一個簡潔高效的結構表示網的拓撲關系以及快速搜索技術的實現進行討論。
網路在數學和計算機領域中被抽象為圖,所以其基礎是圖的存儲表示。一般而言,無向圖可以用鄰接矩陣和鄰接多重表來表示,而有向圖則可以用鄰接表和十字鏈表〔4〕 表示,其優缺點的比較見表 1。
表 1 幾種圖的存儲結構的比較
Tab. 1 The Comparsion of Several Graph for Storing Structures
名 稱 實現方法 優 點 缺 點 時間復雜度
鄰接矩陣 二維數組 1. 易判斷兩點間的關系 佔用空間大 O(n2+m*n)
2. 容易求得頂點的度
鄰接表 鏈表 1. 節省空間 1. 不易判斷兩點間的關系 O(n+m)或O(n*m)
2. 易得到頂點的出度 2. 不易得到頂點的入度
十字鏈表 鏈表 1. 空間要求較小 結構較復雜 同鄰接表
2.易求得頂點的出度和入度
鄰接多重表 鏈表 1. 節省空間 結構較復雜 同鄰接表
2. 易判斷兩點間的關系

目前,對於演算法中快速搜索技術的實現,主要有桶結構法、隊列法以及堆棧實現法。TQQ、DKA 以及 DKD 在這方面是比較典型的代表。TQQ雖然是基於圖增長理論的,但是快速搜索技術同樣是其演算法實現的關鍵,它用兩個FIFO的隊列實現了一個雙端隊列結構來支持搜索過程〔1〕。
DKA和DKD是採用如圖 1 所示的桶結構來支持這個運算,其演算法的命名也來源於此。在DKA演算法中,第i個桶內裝有權值落在 〔b*i, (i+1)*b) 范圍內的可供掃描的點,其中b是視網路中邊的權值分布情況而定的一個常數。每一個桶用隊列來維護,這樣每個點有可能被多次掃描,但最多次數不會超過b次。最壞情況下,DKA的時間復雜度將會是O(m*b+n(b+C/b)),其中,C為圖中邊的最大權值。DKD將點按權值的范圍大小分裝在兩個級別的桶內,高級別的桶保存權值較大的點,相應的權值較小的點都放在低級別的桶內,每次掃描都只針對低級別桶中的點。當然隨著點的插入和刪除,兩個桶內的點是需要動態調整的。在DKA演算法中,給每個桶一定的范圍以及DKD中使用雙桶,在一定程度上都是以空間換時間的做法,需要改進。

圖 1 一個桶結構的示例
Fig. 1 An Example of the Bucket Data Structure
3 本文提出的Dijkstra演算法實現
3.1 網路拓撲關系的建立
上面介紹的各種圖的存儲結構考慮了圖在理論上的各種特徵,如有向、無向、帶權、出度、入度等。而GIS中的網路一般為各種道路、管網、管線等,這些網路在具有圖理論中的基本特徵的同時,更具有自己在實際中的一些特點。首先,在GIS中大多數網路都是有向帶權圖,如道路有單雙向問題,電流、水流都有方向(如果是無向圖也可歸為有向圖的特例),且不同的方向可能有不同的權值。更重要的一點是,根據最短路徑演算法的特性可以知道,頂點的出度是個重要指標,但是其入度在演算法里則不必考慮。綜合以上4種存儲結構的優缺點, 筆者採用了兩個數組來存儲網路圖,一個用來存儲和弧段相關的數據(Net-Arc List),另一個則存儲和頂點相關的數據(Net-Node Index)。Net-Arc List用一個數組維護並且以以弧段起點的點號來順序排列,同一起點的弧段可以任意排序。這個數組類似於鄰接矩陣的壓縮存儲方式,其內容則具有鄰接多重表的特點,即一條邊以兩頂點表示。Net-Node Index則相當於一個記錄了頂點出度的索引表,通過它可以很容易地得到此頂點的出度以及與它相連的第一條弧段在弧段數組中的位置。此外,屬性數據作為GIS不可少的一部分也是必須記錄的。這樣,計算最佳路徑所需的網路信息已經完備了。在頂點已編號的情況下,建立Net-Arc List和Net-Node Index兩個表以及對Net-Arc List的排序,其時間復雜度共為O(2n+lgn),否則為O(m+2n+lgn)。這個結構所需的空間也是必要條件下最小的,記錄了m個頂點以及n條邊的相關信息,與鄰接多重表是相同的。圖 2 是採用這個結構的示意圖。
3.2 快速搜索技術的實現
無論何種演算法,一個基本思想都是將點按權值的大小順序排列,以節省操作時間。前面已經提到過,這兩個演算法都是以時間換空間的演算法,所以在這里有必要討論存儲空間問題 (這部分空間的大小依賴於點的個數及其出度)。根據圖中頂點和邊的個數可以求出頂點的平均出度e=m/n(m為邊數,n為頂點數),這個數值代表了圖的連通程度,一般在GIS的網路圖中,e∈〔2,5〕。這樣,如果當前永久標記的點為t個,那麼,下一步需掃描點的個數就約為t~4t個。如果採用鏈表結構,按實際應用中的網路規模大小,所需的總存儲空間一般不會超過100 K。所以完全沒有必要採用以時間換空間的做法,相反以空間換時間的做法是完全可行的。在實現這部分時,筆者採用了一個FIFO隊列,相應的操作主要是插入、排序和刪除,插入和刪除的時間復雜度都是O(1),所以關鍵問題在於選擇一個合適的排序演算法。一般可供選擇的排序演算法有快速排序、堆排序以及歸並排序等,其實現的平均時間都為O(nlgn)。經過比較實驗,筆者選擇了快速排序法。另外,Visual C++提供的run-time庫也提供了現成的快速排序的函數qsort( )可供使用。

圖 2 基於最佳路徑計算的網路拓撲表示
Fig. 2 The Presentation of the Network Topology
Used for Computing the Shortest Path
按照以上思路,筆者用Visual C++實現了吉奧之星(GeoStar)中的最佳路徑模塊。以北京的街道為數據(共6 313個結點,9 214條弧段(雙向)),在主頻為133、硬碟為1 G、內存為32 M的機器上,計算一條貫穿全城、長為155.06 km的線路,約需1 s~2 s。如圖 3所示。

圖 3 GeoStar中最佳路徑實現示意圖

ps:圖片沒有辦法貼上去.
你可以參考《演算法導論》第二版

⑵ 大數據常用的各種演算法

我們經常談到的所謂的​​ 數據挖掘 是通過大量的數據集進行排序,自動化識別趨勢和模式並且建立相關性的過程。那現在市面的數據公司都是通過各種各樣的途徑來收集海量的信息,這些信息來自於網站、公司應用、社交媒體、移動設備和不斷增長的物聯網。

比如我們現在每天都在使用的搜索引擎。在自然語言處理領域,有一種非常流行的演算法模型,叫做詞袋模型,即把一段文字看成一袋水果,這個模型就是要算出這袋水果里,有幾個蘋果、幾個香蕉和幾個梨。搜索引擎會把這些數字記下來,如果你想要蘋果,它就會把有蘋果的這些袋子給你。

當我們在網上買東西或是看電影時,網站會推薦一些可能符合我們偏好的商品或是電影,這個推薦有時候還挺准。事實上,這背後的演算法,是在數你喜歡的電影和其他人喜歡的電影有多少個是一樣的,如果你們同時喜歡的電影超過一定個數,就把其他人喜歡、但你還沒看過的電影推薦給你。 搜索引擎和推薦系統 在實際生產環境中還要做很多額外的工作,但是從本質上來說,它們都是在數數。

當數據量比較小的時候,可以通過人工查閱數據。而到了大數據時代,幾百TB甚至上PB的數據在分析師或者老闆的報告中,就只是幾個數字結論而已。 在數數的過程中,數據中存在的信息也隨之被丟棄,留下的那幾個數字所能代表的信息價值,不抵其真實價值之萬一。 過去十年,許多公司花了大價錢,用上了物聯網和雲計算,收集了大量的數據,但是到頭來卻發現得到的收益並沒有想像中那麼多。

所以說我們現在正處於「 數字化一切 」的時代。人們的所有行為,都將以某種數字化手段轉換成數據並保存下來。每到新年,各大網站、App就會給用戶推送上一年的回顧報告,比如支付寶會告訴用戶在過去一年裡花了多少錢、在淘寶上買了多少東西、去什麼地方吃過飯、花費金額超過了百分之多少的小夥伴;航旅縱橫會告訴用戶去年做了多少次飛機、總飛行里程是多少、去的最多的城市是哪裡;同樣的,最後讓用戶知道他的行程超過了多少小夥伴。 這些報告看起來非常酷炫,又冠以「大數據」之名,讓用戶以為是多麼了不起的技術。

實際上,企業對於數據的使用和分析,並不比我們每年收到的年度報告更復雜。已經有30多年歷史的商業智能,看起來非常酷炫,其本質依然是數數,並把數出來的結果畫成圖給管理者看。只是在不同的行業、場景下,同樣的數字和圖表會有不同的名字。即使是最近幾年炙手可熱的大數據處理技術,也不過是可以數更多的數,並且數的更快一些而已。

在大數據處理過程中會用到那些演算法呢?

1、A* 搜索演算法——圖形搜索演算法,從給定起點到給定終點計算出路徑。其中使用了一種啟發式的估算,為每個節點估算通過該節點的較佳路徑,並以之為各個地點排定次序。演算法以得到的次序訪問這些節點。因此,A*搜索演算法是較佳優先搜索的範例。

2、集束搜索(又名定向搜索,Beam Search)——較佳優先搜索演算法的優化。使用啟發式函數評估它檢查的每個節點的能力。不過,集束搜索只能在每個深度中發現最前面的m個最符合條件的節點,m是固定數字——集束的寬度。

3、二分查找(Binary Search)——在線性數組中找特定值的演算法,每個步驟去掉一半不符合要求的數據。

4、分支界定演算法(Branch and Bound)——在多種最優化問題中尋找特定最優化解決方案的演算法,特別是針對離散、組合的最優化。

5、Buchberger演算法——一種數學演算法,可將其視為針對單變數較大公約數求解的歐幾里得演算法和線性系統中高斯消元法的泛化。

6、數據壓縮——採取特定編碼方案,使用更少的位元組數(或是其他信息承載單元)對信息編碼的過程,又叫來源編碼。

7、Diffie-Hellman密鑰交換演算法——一種加密協議,允許雙方在事先不了解對方的情況下,在不安全的通信信道中,共同建立共享密鑰。該密鑰以後可與一個對稱密碼一起,加密後續通訊。

8、Dijkstra演算法——針對沒有負值權重邊的有向圖,計算其中的單一起點最短演算法。

9、離散微分演算法(Discrete differentiation)。

10、動態規劃演算法(Dynamic Programming)——展示互相覆蓋的子問題和最優子架構演算法

11、歐幾里得演算法(Euclidean algorithm)——計算兩個整數的較大公約數。最古老的演算法之一,出現在公元前300前歐幾里得的《幾何原本》。

12、期望-較大演算法(Expectation-maximization algorithm,又名EM-Training)——在統計計算中,期望-較大演算法在概率模型中尋找可能性較大的參數估算值,其中模型依賴於未發現的潛在變數。EM在兩個步驟中交替計算,第一步是計算期望,利用對隱藏變數的現有估計值,計算其較大可能估計值;第二步是較大化,較大化在第一步上求得的較大可能值來計算參數的值。

13、快速傅里葉變換(Fast Fourier transform,FFT)——計算離散的傅里葉變換(DFT)及其反轉。該演算法應用范圍很廣,從數字信號處理到解決偏微分方程,到快速計算大整數乘積。

14、梯度下降(Gradient descent)——一種數學上的最優化演算法。

15、哈希演算法(Hashing)。

16、堆排序(Heaps)。

17、Karatsuba乘法——需要完成上千位整數的乘法的系統中使用,比如計算機代數系統和大數程序庫,如果使用長乘法,速度太慢。該演算法發現於1962年。

18、LLL演算法(Lenstra-Lenstra-Lovasz lattice rection)——以格規約(lattice)基數為輸入,輸出短正交向量基數。LLL演算法在以下公共密鑰加密方法中有大量使用:背包加密系統(knapsack)、有特定設置的RSA加密等等。

19、較大流量演算法(Maximum flow)——該演算法試圖從一個流量網路中找到較大的流。它優勢被定義為找到這樣一個流的值。較大流問題可以看作更復雜的網路流問題的特定情況。較大流與網路中的界面有關,這就是較大流-最小截定理(Max-flow min-cut theorem)。Ford-Fulkerson 能找到一個流網路中的較大流。

20、合並排序(Merge Sort)。

21、牛頓法(Newton's method)——求非線性方程(組)零點的一種重要的迭代法。

22、Q-learning學習演算法——這是一種通過學習動作值函數(action-value function)完成的強化學習演算法,函數採取在給定狀態的給定動作,並計算出期望的效用價值,在此後遵循固定的策略。Q-leanring的優勢是,在不需要環境模型的情況下,可以對比可採納行動的期望效用。

23、兩次篩法(Quadratic Sieve)——現代整數因子分解演算法,在實踐中,是目前已知第二快的此類演算法(僅次於數域篩法Number Field Sieve)。對於110位以下的十位整數,它仍是最快的,而且都認為它比數域篩法更簡單。

24、RANSAC——是「RANdom SAmple Consensus」的縮寫。該演算法根據一系列觀察得到的數據,數據中包含異常值,估算一個數學模型的參數值。其基本假設是:數據包含非異化值,也就是能夠通過某些模型參數解釋的值,異化值就是那些不符合模型的數據點。

25、RSA——公鑰加密演算法。較早的適用於以簽名作為加密的演算法。RSA在電商行業中仍大規模使用,大家也相信它有足夠安全長度的公鑰。

26、Schönhage-Strassen演算法——在數學中,Schönhage-Strassen演算法是用來完成大整數的乘法的快速漸近演算法。其演算法復雜度為:O(N log(N) log(log(N))),該演算法使用了傅里葉變換。

27、單純型演算法(Simplex Algorithm)——在數學的優化理論中,單純型演算法是常用的技術,用來找到線性規劃問題的數值解。線性規劃問題包括在一組實變數上的一系列線性不等式組,以及一個等待較大化(或最小化)的固定線性函數。

28、奇異值分解(Singular value decomposition,簡稱SVD)——在線性代數中,SVD是重要的實數或復數矩陣的分解方法,在信號處理和統計中有多種應用,比如計算矩陣的偽逆矩陣(以求解最小二乘法問題)、解決超定線性系統(overdetermined linear systems)、矩陣逼近、數值天氣預報等等。

29、求解線性方程組(Solving a system of linear equations)——線性方程組是數學中最古老的問題,它們有很多應用,比如在數字信號處理、線性規劃中的估算和預測、數值分析中的非線性問題逼近等等。求解線性方程組,可以使用高斯—約當消去法(Gauss-Jordan elimination),或是柯列斯基分解( Cholesky decomposition)。

30、Strukturtensor演算法——應用於模式識別領域,為所有像素找出一種計算方法,看看該像素是否處於同質區域( homogenous region),看看它是否屬於邊緣,還是是一個頂點。

31、合並查找演算法(Union-find)——給定一組元素,該演算法常常用來把這些元素分為多個分離的、彼此不重合的組。不相交集(disjoint-set)的數據結構可以跟蹤這樣的切分方法。合並查找演算法可以在此種數據結構上完成兩個有用的操作:

查找:判斷某特定元素屬於哪個組。

合並:聯合或合並兩個組為一個組。

32、維特比演算法(Viterbi algorithm)——尋找隱藏狀態最有可能序列的動態規劃演算法,這種序列被稱為維特比路徑,其結果是一系列可以觀察到的事件,特別是在隱藏的Markov模型中。

⑶ 有沒有人懂最小函數依賴集到底是個啥,資料庫基礎的,不懂怎麼得到最小函數依賴集,概念也看起來也很抽象

最小函數依賴集就是把函數依賴集依據化簡規則消除不必要的/重復的函數依賴。
求最小函數依賴集分三步:

1.將F中的所有依賴右邊化為單一元素

此題fd={abd->e,ab->g,b->f,c->j,cj->i,g->h};已經滿足

2.去掉F中的所有依賴左邊的冗餘屬性.

作法是屬性中去掉其中的一個,看看是否依然可以推導

此題:abd->e,去掉a,則(bd)+不含e,故不能去掉,同理b,d都不是冗餘屬性

ab->g,也沒有

cj->i,因為c+={c,j,i}其中包含i所以j是冗餘的.cj->i將成為c->i

F={abd->e,ab->g,b->f,c->j,c->i,g->h};

3.去掉F中所有冗餘依賴關系.

做法為從F中去掉某關系,如去掉(X->Y),然後在F中求X+,如果Y在X+中,則表明x->是多餘的.需要去掉.

此題如果F去掉abd->e,F將等於{ab->g,b->f,c->j,c->i,g->h},而(abd)+={a,d,b,f,g,h},其中不包含e.所有不是多餘的.

同理(ab)+={a,b,f}也不包含g,故不是多餘的.

b+={b}不多餘,c+={c,i}不多餘

c->i,g->h多不能去掉.

所以所求最小函數依賴集為 F={abd->e,ab->g,b->f,c->j,c->i,g->h};

最小函數依賴集

定義:如果函數依賴集F滿足下列條件,則稱F為最小函數依賴集或最小覆蓋。

① F中的任何一個函數依賴的右部僅含有一個屬性;

② F中不存在這樣一個函數依賴X→A,使得F與F-{X→A}等價;

③ F中不存在這樣一個函數依賴X→A,X有真子集Z使得F-{X→A}∪{Z→A}與F等價。

演算法:計算最小函數依賴集。

輸入 一個函數依賴集

輸出 F的一個等價的最小函數依賴集G

步驟:① 用分解的法則,使F中的任何一個函數依賴的右部僅含有一個屬性;

② 去掉多餘的函數依賴:從第一個函數依賴X→Y開始將其從F中去掉,然後在剩下的函數依賴中求X的閉包X+,看X+是否包含Y,若是,則去掉X→Y;否則不能去掉,依次做下去。直到找不到冗餘的函數依賴;

③ 去掉各依賴左部多餘的屬性。一個一個地檢查函數依賴左部非單個屬性的依賴。例如XY→A,若要判Y為多餘的,則以X→A代替XY→A是否等價?若A屬於(X)+,則Y是多餘屬性,可以去掉。

舉例:已知關系模式R,U={A,B,C,D,E,G},F={AB→C,D→EG,C→A,BE→C,BC→D,CG→BD,ACD→B,CE→AG},求F的最小函數依賴集。

解1:利用演算法求解,使得其滿足三個條件

① 利用分解規則,將所有的函數依賴變成右邊都是單個屬性的函數依賴,得F為:F={AB→C,D→E,D→G,C→A,BE→C,BC→D,CG→B,CG→D,ACD→B,CE→A,CE→G}

② 去掉F中多餘的函數依賴

A.設AB→C為冗餘的函數依賴,則去掉AB→C,得:F1={D→E,D→G,C→A,BE→C,BC→D,CG→B,CG→D,ACD→B,CE→A,CE→G}

計算(AB)F1+:設X(0)=AB

計算X(1):掃描F1中各個函數依賴,找到左部為AB或AB子集的函數依賴,因為找不到這樣的函數依賴。故有X(1)=X(0)=AB,演算法終止。

(AB)F1+= AB不包含C,故AB→C不是冗餘的函數依賴,不能從F1中去掉。

B.設CG→B為冗餘的函數依賴,則去掉CG→B,得:F2={AB→C,D→E,D→G,C→A,BE→C,BC→D,CG→D,ACD→B,CE→A,CE→G}

計算(CG)F2+:設X(0)=CG

計算X(1):掃描F2中的各個函數依賴,找到左部為CG或CG子集的函數依賴,得到一個C→A函數依賴。故有X(1)=X(0)∪A=CGA=ACG。

計算X(2):掃描F2中的各個函數依賴,找到左部為ACG或ACG子集的函數依賴,得到一個CG→D函數依賴。故有X(2)=X(1)∪D=ACDG。

計算X(3):掃描F2中的各個函數依賴,找到左部為ACDG或ACDG子集的函數依賴,得到兩個ACD→B和D→E函數依賴。故有X(3)=X(2)∪BE=ABCDEG,因為X(3)=U,演算法終止。

(CG)F2+=ABCDEG包含B,故CG→B是冗餘的函數依賴,從F2中去掉。

C.設CG→D為冗餘的函數依賴,則去掉CG→D,得:F3={AB→C,D→E,D→G,C→A,BE→C,BC→D,ACD→B,CE→A,CE→G}

計算(CG)F3+:設X(0)=CG

計算X(1):掃描F3中的各個函數依賴,找到左部為CG或CG子集的函數依賴,得到一個C→A函數依賴。故有X(1)=X(0)∪A=CGA=ACG。

計算X(2):掃描F3中的各個函數依賴,找到左部為ACG或ACG子集的函數依賴,因為找不到這樣的函數依賴。故有X(2)=X(1),演算法終止。(CG)F3+=ACG。

(CG)F3+=ACG不包含D,故CG→D不是冗餘的函數依賴,不能從F3中去掉。

D.設CE→A為冗餘的函數依賴,則去掉CE→A,得:F4={AB→C,D→E,D→G,C→A,BE→C,BC→D,CG→D,ACD→B,CE→G}

計算(CG)F4+:設X(0)=CE

計算X(1):掃描F4中的各個函數依賴,找到左部為CE或CE子集的函數依賴,得到一個C→A函數依賴。故有X(1)=X(0)∪A=CEA=ACE。

計算X(2):掃描F4中的各個函數依賴,找到左部為ACE或ACE子集的函數依賴,得到一個CE→G函數依賴。故有X(2)=X(1)∪G=ACEG。

計算X(3):掃描F4中的各個函數依賴,找到左部為ACEG或ACEG子集的函數依賴,得到一個CG→D函數依賴。故有X(3)=X(2)∪D=ACDEG。

計算X(4):掃描F4中的各個函數依賴,找到左部為ACDEG或ACDEG子集的函數依賴,得到一個ACD→B函數依賴。故有X(4)=X(3)∪B=ABCDEG。因為X(4)=U,演算法終止。

(CE)F4+=ABCDEG包含A,故CE→A是冗餘的函數依賴,從F4中去掉。

③ 去掉F4中各函數依賴左邊多餘的屬性(只檢查左部不是單個屬性的函數依賴)由於C→A,函數依賴ACD→B中的屬性A是多餘的,去掉A得CD→B。

故最小函數依賴集為:F={AB→C,D→E,D→G,C→A,BE→C,BC→D,CG→D,CD→B,CE→G}

⑷ 數學建模應該本著什麼指導思想,必須依賴於復雜的演算法

1.
蒙特卡洛方法:
又稱計算機隨機性模擬方法,也稱統計實驗方法。可以通過模擬來檢驗自己模型的正確性。
2.
數據擬合、參數估計、插值等數據處理
比賽中常遇到大量的數據需要處理,而處理的數據的關鍵就在於這些方法,通常使用matlab輔助,與圖形結合時還可處理很多有關擬合的問題。
3.
規劃類問題演算法:
包括線性規劃、整數規劃、多元規劃、二次規劃等;競賽中又很多問題都和規劃有關,可以說不少的模型都可以歸結為一組不等式作為約束條件,幾個函數表達式作為目標函數的問題,這類問題,求解是關鍵。
這類問題一般用lingo軟體就能求解。
4.
圖論問題:
主要是考察這類問題的演算法,包括:Dijkstra、Floyd、Prime、Bellman-Ford,最大流、二分匹配等。熟悉ACM的人來說,應該都不難。
5.
計算機演算法設計中的問題:
演算法設計包括:動態規劃、回溯搜索、分治、分支定界法(求解整數解)等。
6.
最優化理論的三大非經典演算法:
a)
模擬退火法(SA)
b)
神經網路(NN)
c)
遺傳演算法(GA)
7.
網格演算法和窮舉演算法
8.
連續問題離散化的方法
因為計算機只能處理離散化的問題,但是實際中數據大多是連續的,因此需要將連續問題離散化之後再用計算機求解。
如:差分代替微分、求和代替積分等思想都是把連續問題離散化的常用方法。
9.
數值分析方法
主要研究各種求解數學問題的數值計算方法,特別是適用於計算機實現的方法與演算法。
包括:函數的數值逼近、數值微分與數值積分、非線性返程的數值解法、數值代數、常微分方程數值解等。
主要應用matlab進行求解。
10.
圖像處理演算法
這部分主要是使用matlab進行圖像處理。
包括展示圖片,進行問題解決說明等。

⑸ 對聚類中心過於依賴的聚類演算法有哪些

層次聚類分析:
是創建一個層次以分解給定的數據集。該方法可以分為自上而下(分解)和自下而上(合並)兩種操作方式。為彌補分解與合並的不足,層次合並經常要與其它聚類方法相結合,如循環定位。典型的這類方法包括:
第一個是;BIRCH(Balanced Iterative Recing and Clustering using Hierarchies) 方法,它首先利用樹的結構對對象集進行劃分;然後再利用其它聚類方法對這些聚類進行優化。
第二個是CURE(Clustering Using REprisentatives) 方法,它利用固定數目代表對象來表示相應聚類;然後對各聚類按照指定量(向聚類中心)進行收縮。
第三個是ROCK方法,它利用聚類間的連接進行聚類合並。
最後一個CHEMALOEN,它則是在層次聚類時構造動態模型。

⑹ 如何判斷一個資料庫表是否滿足一個給定的函數依賴 演算法的復雜度是多少

經過對部分考生的調查以及對近年真題的總結分析,筆試部分經常考查的是演算法復雜度、數據結構的概念、棧、二叉樹的遍歷、二分法查找,讀者應對此部分進行重點學習。

1.演算法的概念、演算法時間復雜度及空間復雜度的概念

2.數據結構的定義、數據邏輯結構及物理結構的定義

3.棧的定義及其運算、線性鏈表的存儲方式

4.樹與二叉樹的概念、二叉樹的基本性質、完全二叉樹的概念、二叉樹的遍歷

5.二分查找法

6.冒泡排序法

1.1演算法

考點1 演算法的基本概念

考試鏈接

考點1在筆試考試中考核的幾率為30%,主要是以填空題的形式出現,分值為2分,此考點為識記內容,讀者還應該了解演算法中對數據的基本運算。

計算機解題的過程實際上是在實施某種演算法,這種演算法稱為計算機演算法。

1.演算法的基本特徵可行性、確定性、有窮性、擁有足夠的情報。

2.演算法的基本要素

演算法中對數據的運算和操作

一個演算法由兩種基本要素組成一是對數據對象的運算和操作;二是演算法的控制結構。

在一般的計算機系統中,基本的運算和操作有以下4類算術運算、邏輯運算、關系運算和數據傳輸。

演算法的控制結構演算法中各操作之間的執行順序稱為演算法的控制結構。

描述演算法的工具通常有傳統流程圖、N-S結構化流程圖、演算法描述語言等。一個演算法一般都可以用順序、選擇、循環3種基本控制結構組合而成。

考點2 演算法復雜度

考試鏈接

考點2在筆試考試中,是一個經常考查的內容,在筆試考試中出現的幾率為70%,主要是以選擇的形式出現,分值為2分,此考點為重點識記內容,讀者還應該識記演算法時間復雜度及空間復雜度的概念。

1.演算法的時間復雜度

演算法的時間復雜度是指執行演算法所需要的計算工作量。

同一個演算法用不同的語言實現,或者用不同的編譯程序進行編譯,或者在不同的計算機上運行,效率均不同。這表明使用絕對的時間單位衡量演算法的效率是不合適的。撇開這些與計算機硬體、軟體有關的因素,可以認為一個特定演算法運行工作量的大小,只依賴於問題的規模,它是問題規模的函數。即

演算法的工作量=f

2.演算法的空間復雜度

演算法的空間復雜度是指執行這個演算法所需要的內存空間。

一個演算法所佔用的存儲空間包括演算法程序所佔的空間、輸入的初始數據所佔的存儲空間以及演算法執行過程中所需要的額外空間。其中額外空間包括演算法程序執行過程中的工作單元以及某種數據結構所需要的附加存儲空間。如果額外空間量相對於問題規模來說是常數,則稱該演算法是原地工作的。在許多實際問題中,為了減少演算法所佔的存儲空間,通常採用壓縮存儲技術,以便盡量減少不必要的額外空間。

疑難解答演算法的工作量用什麼來計算?

演算法的工作量用演算法所執行的基本運算次數來計算,而演算法所執行的基本運算次數是問題規模的函數,即演算法的工作量=f,其中n是問題的規模。

1.2數據結構的基本概念

考點3 數據結構的定義

考試鏈接

考點3在筆試考試中,是一個經常考查的內容,在筆試考試中出現的幾率為70%,主要是以選擇的形式出現,分值為2分,此考點為識記內容,讀者還應該識記數據的邏輯結構和存儲結構的概念。

數據結構作為計算機的一門學科,主要研究和討論以下三個方面

數據集合中個數據元素之間所固有的邏輯關系,即數據的邏輯結構;

在對數據元素進行處理時,各數據元素在計算機中的存儲關系,即數據的存儲結構;

對各種數據結構進行的運算。

數據是對客觀事物的符號表示,在計算機科學中是指所有能輸入到計算機中並被計算機程序處理的符號的總稱。

數據元素是數據的基本單位,在計算機程序中通常作為一個整體進行考慮和處理。

數據對象是性質相同的數據元素的集合,是數據的一個子集。

數據的邏輯結構是對數據元素之間的邏輯關系的描述,它可以用一個數據元素的集合和定義在此集合中的若干關系來表示。數據的邏輯結構有兩個要素一是數據元素的集合,通常記為D;二是D上的關系,它反映了數據元素之間的前後件關系,通常記為R。一個數據結構可以表示成

B=

其中B表示數據結構。為了反映D中各數據元素之間的前後件關系,一般用二元組來表示。

數據的邏輯結構在計算機存儲空間中的存放形式稱為數據的存儲結構。

由於數據元素在計算機存儲空間中的位置關系可能與邏輯關系不同,因此,為了表示存放在計算機存儲空間中的各數據元素之間的邏輯關系,在數據的存儲結構中,不僅要存放各數據元素的信息,還需要存放各數據元素之間的前後件關系的信息。

一種數據的邏輯結構根據需要可以表示成多種存儲結構,常用的存儲結構有順序、鏈接、索引等存儲結構。而採用不同的存儲結構,其數據處理的效率是不同的。因此,在進行數據處理時,選擇合適的存儲結構是很重要的。

考點4 線性結構與非線性結構

考試鏈接

考點4在筆試考試中,雖然說不是考試經常考查的內容,但讀者還是對此考點有所了解,在筆試考試中出現的幾率為30%,主要是以填空題出現的形式出現,分值為2分,此考點為識記內容。

根據數據結構中各數據元素之間前後件關系的復雜程度,一般將數據結構分為兩大類型線性結構與非線性結構。如果一個非空的數據結構滿足下列兩個條件

有且只有一個根結點;

每一個結點最多有一個前件,也最多有一個後件。

則稱該數據結構為線性結構。線性結構又稱線性表。在一個線性結構中插入或刪除任何一個結點後還應是線性結構。如果一個數據結構不是線性結構,則稱之為非線性結構。

疑難解答空的數據結構是線性結構還是非線性結構?

一個空的數據結構究竟是屬於線性結構還是屬於非線性結構,這要根據具體情況來確定。如果對該數據結構的演算法是按線性結構的規則來處理的,則屬於線性結構;否則屬於非線性結構。

1.3棧及線性鏈表

考點5 棧及其基本運算

考試鏈接

考點5在筆試考試中,是一個必考的內容,在筆試考試中出現的幾率為100%,主要是以選擇的形式出現,分值為2分,此考點為重點掌握內容,讀者應該掌握棧的運算 。

1.棧的基本概念

棧是限定只在一端進行插入與刪除的線性表,通常稱插入、刪除的這一端為棧頂,另一端為棧底。當表中沒有元素時稱為空棧。棧頂元素總是後被插入的元素,從而也是最先被刪除的元素;棧底元素總是最先被插入的元素,從而也是最後才能被刪除的元素。棧是按照先進後出或後進先出的原則組織數據的。

2.棧的順序存儲及其運算

用一維數組S作為棧的順序存儲空間,其中m為最大容量。

在棧的順序存儲空間S中,S為棧底元素,S為棧頂元素。top=0表示棧空;top=m表示棧滿。

棧的基本運算有三種入棧、退棧與讀棧頂元素。

入棧運算入棧運算是指在棧頂位置插入一個新元素。首先將棧頂指針加一,然後將新元素插入到棧頂指針指向的位置。當棧頂指針已經指向存儲空間的最後一個位置時,說明棧空間已滿,不可能再進行入棧操作。這種情況稱為棧上溢錯誤。

退棧運算退棧是指取出棧頂元素並賦給一個指定的變數。首先將棧頂元素賦給一個指定的變數,然後將棧頂指針減一。當棧頂指針為0時,說明棧空,不可進行退棧操作。這種情況稱為棧的下溢錯誤。

讀棧頂元素讀棧頂元素是指將棧頂元素賦給一個指定的變數。這個運算不刪除棧頂元素,只是將它賦給一個變數,因此棧頂指針不會改變。當棧頂指針為0時,說明棧空,讀不到棧頂元素。

小技巧棧是按照先進後出或後進先出的原則組織數據,但是出棧方式有多種選擇,在考題中經常考查各種不同的出棧方式。

考點6 線性鏈表的基本概念

考試鏈接

考點6在筆試考試中出現的幾率為30%,主要是以選擇的形式出現,分值為2分,此考點為識記內容。重點識記結點的組成。

在鏈式存儲方式中,要求每個結點由兩部分組成一部分用於存放數據元素值,稱為數據域,另一部分用於存放指針,稱為指針域。其中指針用於指向該結點的前一個或後一個結點。

鏈式存儲方式既可用於表示線性結構,也可用於表示非線性結構。

線性鏈表

線性表的鏈式存儲結構稱為線性鏈表。

在某些應用中,對線性鏈表中的每個結點設置兩個指針,一個稱為左指針,用以指向其前件結點;另一個稱為右指針,用以指向其後件結點。這樣的表稱為雙向鏈表。

帶鏈的棧

棧也是線性表,也可以採用鏈式存儲結構。帶鏈的棧可以用來收集計算機存儲空間中所有空閑的存儲結點,這種帶鏈的棧稱為可利用棧。

疑難解答在鏈式結構中,存儲空間位置關系與邏輯關系是什麼?

在鏈式存儲結構中,存儲數據結構的存儲空間可以不連續,各數據結點的存儲順序與數據元素之間的邏輯關系可以不一致,而數據元素之間的邏輯關系是由指針域來確定的。

1.4樹與二叉樹

考點7 樹與二叉樹及其基本性質

考試鏈接

考點7在筆試考試中,是一個必考的內容,在筆試考試中出現的幾率為100%,主要是以選擇的形式出現,有時也有出現在填空題中,分值為2分,此考點為重點掌握內容。重點識記樹及二叉樹的性質。

誤區警示

滿二叉樹也是完全二叉樹,而完全二叉樹一般不是滿二叉樹。應該注意二者的區別。

1、樹的基本概念

樹(tree是一種簡單的非線性結構。在樹結構中,每一個結點只有一個前件,稱為父結點,沒有前件的結點只有一個,稱為樹的根結點。每一個結點可以有多個後件,它們稱為該結點的子結點。沒有後件的結點稱為葉子結點。

在樹結構中,一個結點所擁有的後件個數稱為該結點的度。葉子結點的度為0。在樹中,所有結點中的最大的度稱為樹的度。

2、二叉樹及其基本性質

二叉樹的定義

二叉樹是一種很有用的非線性結構,具有以下兩個特點

①非空二叉樹只有一個根結點;

②每一個結點最多有兩棵子樹,且分別稱為該結點的左子樹和右子樹。

由以上特點可以看出,在二叉樹中,每一個結點的度最大為2,即所有子樹也均為二叉樹,而樹結構中的每一個結點的度可以是任意的。另外,二叉樹中的每個結點的子樹被明顯地分為左子樹和右子樹。在二叉樹中,一個結點可以只有左子樹而沒有右子樹,也可以只有右子樹而沒有左子樹。當一個結點既沒有左子樹也沒有右子樹時,該結點即為葉子結點。

二叉樹的基本性質

二叉樹具有以下幾個性質

性質1在二叉樹的第k層上,最多有2k-1個結點;

性質2深度為m的二叉樹最多有2m-1個結點;

性質3在任意一棵二叉樹中,度為0的結點總是比度為2的結點多一個。

性質4具有n個結點的二叉樹,其深度至少為〔log2n〕+1,其中〔log2n〕表示取log2n的整數部分。

小技巧在二叉樹的遍歷中,無論是前序遍歷,中序遍歷還是後序遍歷,二叉樹的葉子結點的先後順序都是不變的。

3、滿二叉樹與完全二叉樹

滿二叉樹是指這樣的一種二叉樹除最後一層外,每一層上的所有結點都有兩個子結點。在滿二叉樹中,每一層上的結點數都達到最大值,即在滿二叉樹的第k層上有2k-1個結點,且深度為m的滿二叉樹有2m-1個結點。

完全二叉樹是指這樣的二叉樹除最後一層外,每一層上的結點數均達到最大值;在最後一層上只缺少右邊的若干結點。

對於完全二叉樹來說,葉子結點只可能在層次最大的兩層上出現對於任何一個結點,若其右分支下的子孫結點的最大層次為p,則其左分支下的子孫結點的最大層次或為p,或為p+1。

完全二叉樹具有以下兩個性質

性質5具有n個結點的完全二叉樹的深度為〔log2n〕+1。

性質6設完全二叉樹共有n個結點。如果從根結點開始,按層次用自然數1,2,,n給結點進行編號,則對於編號為k的結點有以下結論

①若k=1,則該結點為根結點,它沒有父結點;若k1,則該結點的父結點編號為INT。

②若2k≤n,則編號為k的結點的左子結點編號為2k;否則該結點無左子結點。

③若2k+1≤n,則編號為k的結點的右子結點編號為2k+1;否則該結點無右子結點。

考點8 二叉樹的遍歷

考試鏈接

考點8在筆試考試中考核幾率為30%,分值為2分,讀者應該熟練掌握各種遍歷的具體演算法,能由兩種遍歷的結果推導另一種遍歷的結果。

在遍歷二叉樹的過程中,一般先遍歷左子樹,再遍歷右子樹。在先左後右的原則下,根據訪問根結點的次序,二叉樹的遍歷分為三類前序遍歷、中序遍歷和後序遍歷。

前序遍歷先訪問根結點、然後遍歷左子樹,最後遍歷右子樹;並且,在遍歷左、右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。

中序遍歷先遍歷左子樹、然後訪問根結點,最後遍歷右子樹;並且,在遍歷左、右子樹時,仍然先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。

後序遍歷先遍歷左子樹、然後遍歷右子樹,最後訪問根結點;並且,在遍歷左、右子樹時,仍然先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。

疑難解答樹與二叉樹的不同之處是什麼?

在二叉樹中,每一個結點的度最大為2,即所有子樹也均為二叉樹,而樹結構中的每一個結點的度可以是任意的。

1.5查找技術

考點9 順序查找

考試鏈接

考點9在筆試考試中考核幾率在30%,一般出現選擇題中,分值為2分,讀者應該具體掌握順序查找的演算法。

查找是指在一個給定的數據結構中查找某個指定的元素。從線性表的第一個元素開始,依次將線性表中的元素與被查找的元素相比較,若相等則表示查找成功;若線性表中所有的元素都與被查找元素進行了比較但都不相等,則表示查找失敗。

在下列兩種情況下也只能採用順序查找

如果線性表為無序表,則不管是順序存儲結構還是鏈式存儲結構,只能用順序查找。

即使是有序線性表,如果採用鏈式存儲結構,也只能用順序查找。

考點10 二分法查找

考試鏈接

考點10在筆試考試中考核幾率為30%,一般出現填空題中,分值為2分,考核比

⑺ 一棵有依賴關系的樹,每個節點的權重不一樣。設計演算法根據節點的權重(由大到小)和依賴關系執行。

但您現在給出的示例圖並不是一棵「樹」而是一個無向圖……

⑻ 當前深度學習框架學習主要依賴哪個演算法框架

兩者不是同一個level上的,深度學習是機器學習的一種。最近火的發紫的深度學習實際上指的的深度神經網路學習,普通神經網路由於訓練代價較高,一般只有3-4層,而深度神經網路由於採用了特殊的訓練方法加上一些小trick,可以達到8-10層。深度神經

⑼ 土地財政依賴度是怎麼算的

土地財政依賴度的演算法按土地使用稅每平方米年稅額為標准計算。具體標准如下:
1、大城市1.5元至30元;
2、中等城市1.2元至24元;
3、小城市0.9元至18元;
4、縣城、建制鎮、工礦區0.6元至12元。
根據相關法律的規定,為了合理利用城鎮土地,調節土地級差收入,提高土地使用效益,加強土地管理。土地直接稅收及城市擴張帶來的間接稅收佔地方預算內收入的40%以上,而土地出讓金凈收入甚至占政府預算外收入的60%以上,土地使用稅以納稅人實際佔用的土地面積為計稅依據,依照規定稅額計算徵收。土地財政,作為地方政府發展經濟的一種工具,利弊互見。從有利方面,政府通過經營土地積聚建設資金,使城市建設突飛猛進,城市經濟飛速發展,市民生活質量不斷提高,也帶動了周邊農村經濟的轉型與發展,吸引了大量外地農民進城務工。
【法律依據】
《中華人民共和國城鎮土地使用稅暫行條例》第一條 為了合理利用城鎮土地,調節土地級差收入,提高土地使用效益,加強土地管理,制定本條例。第二條 在城市、縣城、建制鎮、工礦區范圍內使用土地的單位和個人,為城鎮土地使用稅,以下簡稱土地使用稅的納稅人,應當依照本條例的規定繳納土地使用稅。前款所稱單位,包括國有企業、集體企業、私營企業、股份制企業、外商投資企業、外國企業以及其他企業和事業單位、社會團體、國家機關、軍隊以及其他單位;所稱個人,包括個體工商戶以及其他個人。第三條 土地使用稅以納稅人實際佔用的土地面積為計稅依據,依照規定稅額計算徵收。
前款土地佔用面積的組織測量工作,由省、自治區、直轄市人民政府根據實際情況確定。

⑽ 當前深度學習框架演算法主要依賴於哪個演算法框架

深度學習的概念源於人工神經網路的研究。含多隱層的多層感知器就是一種深度學習結構。深度學習通過組合低層特徵形成更加抽象的高層表示屬性類別或特徵,以發現數據的分布式特徵表示

熱點內容
隨機啟動腳本 發布:2025-07-05 16:10:30 瀏覽:525
微博資料庫設計 發布:2025-07-05 15:30:55 瀏覽:24
linux485 發布:2025-07-05 14:38:28 瀏覽:304
php用的軟體 發布:2025-07-05 14:06:22 瀏覽:754
沒有許可權訪問計算機 發布:2025-07-05 13:29:11 瀏覽:431
javaweb開發教程視頻教程 發布:2025-07-05 13:24:41 瀏覽:699
康師傅控流腳本破解 發布:2025-07-05 13:17:27 瀏覽:240
java的開發流程 發布:2025-07-05 12:45:11 瀏覽:685
怎麼看內存卡配置 發布:2025-07-05 12:29:19 瀏覽:284
訪問學者英文個人簡歷 發布:2025-07-05 12:29:17 瀏覽:834