JAVA—咖啡館

          ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術,交流工作經驗,分享JAVA帶來的快樂!本網站部分轉載文章,如果有版權問題請與我聯系。

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

          【JAVA算法】

          使用JAVA語言來實現算法。
               摘要: HashMap 和 HashSet 是 Java Collection Framework 的兩個重要成員,其中 HashMap 是 Map 接口的常用實現類,HashSet 是 Set 接口的常用實現類。雖然 HashMap 和 HashSet 實現的接口規范不同,但它們底層的 Hash 存儲機制完全一樣,甚至 HashSet 本身就采用 HashMap 來實現的。
          通過 HashMap、HashSet 的源代碼分析其 Hash 存儲機制

          集合和引用

          就像引用類型的數組一樣,當我們把 Java 對象放入數組之時,并不是真正的把 Java 對象放入數組中,只是把對象的引用放入數組中,每個數組元素都是一個引用變量。


          實際上,HashSet 和 HashMap 之間有很多相似之處,對于 HashSet 而言,系統采用 Hash 算法決定集合元素的存儲位置,這樣可以保證能快速存、取集合元素;對于 HashMap 而言,系統 key-value 當成一個整體進行處理,系統總是根據 Hash 算法來計算 key-val  閱讀全文
          posted @ 2010-03-23 09:37 rogerfan 閱讀(1030) | 評論 (0)  編輯

               摘要: 如果一個圖中所有點都是聯通的,求最小樹可以將圖遍歷完成,這里的最小是指邊最少,跟邊長沒有關系。

          算法利用深度優先遍歷,記載每個遍歷過的節點,將節點按照遍歷順序記錄下來就是所謂的最小樹。

          關于深度優先遍歷請參見深度優先遍歷。

          不過這里奇怪的是:

          假如所有節點之間是雙向聯通的,只用生成一個數組,裝入所有的節點,例如{'a','b','c','d','d'}

          然后每兩個點之間的線段就是最小樹的結果,即a --> b, b --> c, c --> d, d --> e

          似乎不用圖這樣復雜的結構支撐。

          不過這里還是給出了按照圖來產生最小樹的辦法。

          Graph.mst:返回最小樹。

          Graph.main:提供簡單測試。
            閱讀全文
          posted @ 2008-05-28 15:58 rogerfan 閱讀(725) | 評論 (0)  編輯

               摘要: 當每個任務有前后置關系時,需要找到一種滿足前后置關系的路線,將任務完成。

          如果將每個任務看成一個節點,任務之間的前后置關系表示為有向圖時,這種路線順序叫做為圖進行拓撲排序。也叫關鍵路徑分析。

          這里的圖用鄰接矩陣法表示,算法的關鍵是:

          1 找到一個沒有后繼的頂點

          2 在圖中刪除它,放入結果數組中

          3 重復 步驟 1 ,步驟 2 直到圖中沒有多余的節點。

          如果圖中出現環裝結構,則算法無法進行,因為此時任務之間循環成為前置。
            閱讀全文
          posted @ 2008-05-28 15:57 rogerfan 閱讀(1131) | 評論 (0)  編輯

               摘要: 圖的傳遞閉包是指修正后的鄰接矩陣表示的圖。(見Graph 圖-鄰接矩陣法 )

          在多個頂點的有向圖中,每個頂點可以到按照方向到達一定的節點,這叫圖的連通性。有種方法直接告訴我們,圖中的兩個節點是否可以聯通,這里說的是WarShall算法。

          WarShall的基本原理是,如果A可以到達B,且C可以到達A,則C可以到達B。通過對鄰接矩陣的修正可以做到這點。隨然這里舉例是將兩步可并成一步,但數學上可以證明這種修正可以達到任意步驟。
            閱讀全文
          posted @ 2008-05-28 15:54 rogerfan 閱讀(936) | 評論 (0)  編輯

               摘要: 與傳遞閉包問題 非常相似的一個問題是,能不能給出一個矩陣,根據矩陣可以以時間代價O(n)的方式得到在一個有向代權圖中任意指定端點之間的最短距離。求的這個矩陣的問題被稱為每一對端點間的最小距離問題。

          這里采用的是Floyd算法,它與WalShall 算法非常相似:

          如果A可以到達B,距離為x,且C可以到達A,距離為y,則求得C可以到達B,距離為 z = x + y,z小于如果c到B的原來的距離,則用z更新矩陣,否則c到B距離維持不變。

          和最小路徑算法類似,這里用一個很大數字INFINITY來表示兩個端點之間距離為無窮大的情況,即不通。這里INFINITY=最大的int值(~(1<<31))。

          Floyd.main()提供簡單的測試。

          與WalShall 一樣,Floyd算法本身的時間代價為O(n^3)
            閱讀全文
          posted @ 2008-05-28 15:53 rogerfan 閱讀(400) | 評論 (0)  編輯

               摘要: 圖中代權的最小樹的問題如下:


          如果N個城市之間(圖中的頂點)要修公路(圖中的邊)以使所有的城市聯通,求怎樣修可以使得公路的總長最小?
          以上問題中的N個城市之間可以用圖中的頂點表示,公路可以圖中的邊表示,公路的長度用邊長表示,公路是雙向的。問題就轉換為在有N個頂點中的雙向代權圖中求得一個最小樹。這里的代權指的邊的長度,這與以前的不代權的最小樹生成算法有很大的區別。


          算法描述如下:
            閱讀全文
          posted @ 2008-05-28 15:45 rogerfan 閱讀(413) | 評論 (0)  編輯

               摘要: 這里使用的是Dijkstra來計算最短路徑。事實上Dijkstra完成時,指定節點到所有節點的最小路徑均已求出。

          算法簡述如下:

          準備好兩個輔助性數據結構:

          1 ParentLength : 用來記錄到當前節點之前的父節點,與到當前節點的最小路徑

          2 Path: 記錄指定節點到所有節點的ParentLength。初始化時,所有的ParentLength的父節點都為指定的起始節點,長度都是INFINITY,代表沒有聯通,距離無窮大。
            閱讀全文
          posted @ 2008-05-28 15:39 rogerfan 閱讀(881) | 評論 (0)  編輯

          主站蜘蛛池模板: 忻城县| 江孜县| 长治市| 湖南省| 交城县| 东乌| 靖西县| 土默特右旗| 藁城市| 黑山县| 石阡县| 大丰市| 永城市| 宽甸| 岳普湖县| 枣强县| 卓资县| 肇州县| 瑞金市| 临安市| 台安县| 翁牛特旗| 陵水| 阿坝县| 茂名市| 明溪县| 巴林右旗| 中宁县| 上林县| 柳林县| 江孜县| 望奎县| 宜川县| 仙游县| 揭西县| 乌鲁木齐市| 天长市| 长沙县| 阳朔县| 万宁市| 开江县|