當前位置:首頁 » 編程語言 » java圖論

java圖論

發布時間: 2023-05-17 20:59:34

A. 一個java的多目的地最短路徑規劃的演算法,大家幫忙看一下,給解釋解釋,在線等,多謝多謝。

最短路徑規范是圖論的入門第一課,還是去學學理論吧。

B. 求圖論演算法java實現

求圖論演算法java實現

packagetest;
importjava.io.BufferedReader;
importjava.io.FileReader;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.Comparator;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.PriorityQueue;
importjava.util.Queue;

publicclassMinSpanningTree{
classEdge{//內部類定義邊的數據結果
intu,v,weight;
}

ArrayList<edge>Edges=newArrayList<edge>();
Map<integer,integer="">nodeFather=newHashMap<integer,integer="">();
intcnt=0,nodeCnt=0;

publicMinSpanningTree(Stringpath){
try{

BufferedReaderbr=newBufferedReader(newFileReader(path));
Stringstr;
String[]strArray;

while((str=br.readLine())!=null){
strArray=str.split("\s");
Edges.add(cnt,newEdge());
Edges.get(cnt).u=Integer.parseInt(strArray[0]);
Edges.get(cnt).v=Integer.parseInt(strArray[1]);
Edges.get(cnt).weight=Integer.parseInt(strArray[2]);
if(!nodeFather.containsKey(Edges.get(cnt).u)){
nodeFather.put(Edges.get(cnt).u,Edges.get(cnt).u);//初始化,father[i]=i;
++nodeCnt;
}
if(!nodeFather.containsKey(Edges.get(cnt).v)){
nodeFather.put(Edges.get(cnt).v,Edges.get(cnt).v);
++nodeCnt;
}
++cnt;
}
br.close();
}catch(IOExceptione){
e.printStackTrace();
}
}

publicbooleanunion(intu,intv){//並操作
inta=find(u);
intb=find(v);
if(a!=b){
nodeFather.put(a,b);
returntrue;
}
returnfalse;
}

publicintfind(intx){//查操作
if(x!=nodeFather.get(x)){
nodeFather.put(x,find(nodeFather.get(x)));
}
returnnodeFather.get(x);
}

publicArrayList<edge>getMinSpanningTree(){
ArrayList<edge>result=newArrayList<edge>();
Queue<edge>FsQueue=newPriorityQueue<edge>(1000,//設置優先隊列,使按邊權值從小到大排序
newComparator<edge>(){
publicintcompare(EdgeEdgeOne,EdgeEdgeTwo){
if(EdgeOne.weight>EdgeTwo.weight)
return1;
elseif(EdgeOne.weight<EdgeTwo.weight)
return-1;
else
return0;
}
});

for(inti=0;i<cnt;++i){
FsQueue.add(Edges.get(i));
}

while(!FsQueue.isEmpty()){//遍歷每一條邊
EdgeEdge=FsQueue.poll();
if(union(Edge.u,Edge.v)){
result.add(Edge);
}else{
continue;
}
}
returnresult;
}

publicstaticvoidmain(String[]args){
MinSpanningTreemstree=newMinSpanningTree("c:/treedata.txt");
ArrayList<edge>result=mstree.getMinSpanningTree();
for(inti=0;i<result.size();++i){
System.out.println(result.get(i).u+""+result.get(i).v+""+result.get(i).weight);
}
}
}

C. java程序開發中的邏輯思維怎樣學習的呢

邏輯思維的培養對軟體工程非常重要,思維快的能快速編寫邏輯代碼。可以從一下幾個方面進行慢慢培養。
第一:明確學習目的
邏輯思維學習編程對多數IT業人員來說都是非常有用的。學編程,做一名編程人員,從個人角度講,可以解決在軟體使用中所遇到的問題,改進現有軟體,可以為自己找到一份理想的工作添加重要得砝碼,有利於在求職道路上謀得一個好的職位;從國家的角度,可以為中國的軟體產業做出應有的貢獻,一名優秀的程序員永遠是被爭奪的對象。學習編程還能鍛煉思維,使我們的邏輯思維更加嚴密;能夠不斷享受到創新的樂趣,將一直有機會走在高科技的前沿,因為程序設計本身是一種創造性的工作。知識經濟時代給我們帶來了無限的機會,要想真正掌握計算機技術,並在IT行業里干出一番事業來,有所作為,具有一定的編程能力是一個基本條件和要求。
第二打好基礎,學好基礎知識對我們開發也很重要學編程要具備一定的基礎,總結之有以下幾方面:
首先是數學基礎 從計算機發展和應用的歷史來看計算機的數學模型和體系結構等都是有數學家提出的,最早的計算機也是為數值計算而設計的。因此,要學好計算機就要有一定的數學基礎,出學者有高中水平就差不多了。
其次是邏輯思維能力的培養 學程序設計要有一定的邏輯思維能力,「邏思力」的培養要長時間的實踐鍛煉。要想成為一名優秀的程序員,最重要的是掌握編程思想。要做到這一點必須在反復的實踐、觀察、分析、比較、總結中逐漸地積累。因此在學習編程過程中,我們不必等到什麼都完全明白了才去動手實踐,只要明白了大概,就要敢於自己動手去體驗。誰都有第一次。有些問題只有通過實踐後才能明白,也只有實踐才能把老師和書上的知識變成自己的,高手都是這樣成材的。最後是選擇一種合適的入門語言 面對各種各樣的語言,應按什麼樣的順序學呢?程序設計工具不外乎如下幾類: 1)本地開發 應用軟體開發的工具有:Visual Basic 、Delphi 、VC++ ( C++ Builder ) 等;資料庫開發工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 2)跨平台開發 開發工具如 Java 等。 3)網路開發 對客戶端開發工具如:Java Script 等;對伺服器開發工具如:PHP 、ASP 、JSP 、ISAPI 、NSAPI 、CGI 等。 以上不同的環境下幾種開發工具中 VB 法簡單並容易理解,界面設計是可設化的,易學、易用。選 VB 作為入門的方向對出學者是較為適合的。
第三:注意理解一些重要概念
一本程序設計的書看到的無非就是變數、函數、條件語句、循環語句等概念,但要真正能進行編程應用,需要深入理解這些概念,在理解的基礎上應用,不要只簡單地學習語法、結構,而要吃透針對這些語法、結構的應用例子,做到舉一反三,觸類旁通。
第四:掌握編程思想,編程思想使用較多的就是oop編程思想
學習一門語言或開發工具,語法結構、功能調用是次要的,最主要是學習它的思想。例如學習 VC 就要學習 Windows 的內在機理、什麼是線程......;學習 COM 就要知道VTALBE 、類廠、介面、idl......,關鍵是學一種思想,有了思想,那麼我們就可以觸類旁通。
第六:多實踐、多交流,一切思維來自項目開發的積累
掌握編程思想必須在編程實際工作中去實踐和體會。編程起步階段要經常自己動手設計程序,具體設計時不要拘泥於固定的思維方式,遇到問題要多想幾種解決的方案。這就要多交流,各人的思維方式不同、角度各異,各有高招,通過交流可不斷吸收別人的長處,豐富編程實踐,幫助自己提高水平。親自動手進行程序設計是創造性思維應用的體現,也是培養邏輯思維的好方法。
第七:養成良好的編程習慣
編程入門不難,但入門後不斷學習是十分重要的,相對來說較為漫長。在此期間要注意養成一些良好的編程習慣。編程風格的好壞很大程度影響程序質量。良好的編程風格可以使
程序結構清晰合理,且使程序代碼便於維護。如代碼的縮進編排、變數命令規則的一致性、代碼的注釋等。
第八:上網學編程
在網上可以學到很多不同的編程思想、方法、經驗和技巧,有大量的工具和作品及相關的輔導材料供下載
8.加強計算機理論知識的再學習
思維培養學編程是符合「理論→實踐→再理論→再實踐」的一個認識過程。一開始要具有一定的計算機理論基礎知識,包括編程所需的數學基礎知識,具備了入門的條件,就可以
開始編程的實踐,從實踐中可以發現問題需要加強計算機理論知識的再學習。程序人人皆可編,但當你發現編到一定程度很難再提高的時候,就要回頭來學習一些計算機科學和數
學基礎理論。學過之後,很多以前遇到的問題都會迎刃而解,使人有豁然開朗之感。因此在學習編程的過程中要不斷地針對應用中的困惑和問題深入學習數據結構、演算法、計算機
原理、編譯原理、操作系統原理、軟體工程等計算機科學的理論基礎和數理邏輯、代數系統、圖論、離散數學等數學理論基礎知識。這樣經過不斷的學習,再努力地實踐,編程水平一定會不斷提高到一個新高度。

D. 判斷有向圖是否連通+dfs+java

方法1:

如果存在迴路,則必存在一個子圖,是一個環路。環路中所有頂點的度>=2。
n演算法:
第一步:刪除所有度<=1的頂點及相關的邊,並將另外與這些邊相關的其它頂點的度減一。

第二步:將度數變為1的頂點排入隊列,並從該隊列中取出一個頂點重復步驟一。

如果最後還有未刪除頂點,則存在環,否則沒有環。

n演算法分析:
由於有m條邊,n個頂點。

i)如果m>=n,則根據圖論知識可直接判斷存在環路。(證明:如果沒有環路,則該圖必然是k棵樹 k>=1。根據樹的性質,邊的數目m = n-k。k>=1,所以:m<n)

ii)如果m<n 則按照上面的演算法每刪除一個度為0的頂點操作一次(最多n次),或每刪除一個度為1的頂點(同時刪一條邊)操作一次(最多m次漏敏晌)。這兩種操作的總數不會超拿瞎過m+n。由於m<n,所以返鋒演算法復雜度為O(n)。

E. Java虛擬機怎麼判斷對象沒被引用從而回收,什麼時候會回收,什麼時候會銷毀

1. 引用計數器演算法
解釋
系統給每個對象添加一個引用計數器,每當有一個地方引用這個對象的時候,計數器就加1,當引用失效的時候,計數器就減1,在任何一個時刻計數器為0的對象就是不可能被使用的對象,因為沒有任何地方持有這個引用,這時這個對象就被視為內存垃圾,等待被虛擬機回收
優點
客觀的說,引用計數器演算法,他的實現很簡單,判定的效率很高,在大部分情況下這都是相當不錯的演算法
其實,很多案例中都使用了這種演算法,比如 IOS 的Object-C , 微軟的COM技術(用於給window開發驅動,.net裡面的技術幾乎都是建立在COM上的),Python語言等.
缺陷
無法解決循環引用的問題.
這就好像是懸崖邊的人採集草葯的人, 想要活下去就必須要有一根繩子綁在懸崖上. 如果有兩個人, 甲的手拉著懸崖, 乙的手拉著甲, 那麼這兩個人都能活, 但是, 如果甲的手拉著乙, 乙的手也拉著甲, 雖然這兩個人都認為自己被別人拉著, 但是一樣會掉下懸崖.
比如說 A對象的一個屬性引用B,B對象的一個屬性同時引用A A.b = B() B.a = A(); 這個A,B對象的計數器都是1,可是,如果沒有其他任何地方引用A,B對象的時候,A,B對象其實在系統中是無法發揮任何作用的,既然無法發揮作用,那就應該被視作內存垃圾予以清理掉,可是因為此時A,B的計數器的值都是1,虛擬機就無法回收A,B對象,這樣就會造成內存浪費,這在計算機系統中是不可容忍的.
解決辦法
在語言層面處理, 例如Object-C 就使用強弱引用類型來橋肢解決問題.強引用計數器加1 ,弱引用不增加
Java中也有強弱引用
2. 可達性分析演算法
解釋
這種演算法通過一系列成為 "GC Roots " 的對象作為起始點,從這些節點開始向下搜索所有走過的路徑成為引用鏈(Reference Chain) , 當一個對象GC Roots沒有任何引用鏈相連(用圖論的話來說就是從GC Roots到這個對象不可達),則證明此對象是不可用的
優點
這個演算法可以輕松的解決循環引用的問題
大部分的主流java虛擬機棚跡使用的都是這種演算法
3. Java語言中的GC Roots
在虛擬機棧(其實是棧幀中的本地變數表)中引用的對象
在方法區中鏈消並的類靜態屬性引用對象
在方法區中的常量引用的對象
在本地方法棧中JNI(即一般說的Native方法)的引用對象

F. Java 的垃圾回收如何判斷哪個對象可以被回收

一般情況下java中對象可被回收的前提是:該對象不再被引用。
例如:
object
o
=
new
object();
o
=
null;
此時第一步
new
出來的對象不再被引用,垃圾回收器在回收的時候便會把這個對象清理掉。
特殊情況下
,java中存在弱引用(weakreference<>
很少用,不確定拼寫的是否准確哈),對象即使被弱引用,垃圾回收機制也是可以回收的,我們正常直接賦值的引用屬於強引用,除了系統內存不足等因素外,垃圾回收機制是不會清理的。

G. 北大青鳥java培訓:編程需要多少數學知識

1、編程中的數學於是我馬上回顧了下編程中用到的數學知識,好像少的可憐。
計數的能力:for循環中經常用,小學生都會。
數字的加減乘除:每種編程語言都會內置支持,都不需要你自己算余數和模:偶爾會用得到集合運算:交集、並集、差集,編程中用的不多。
布爾運算:AND,OR,非各種進制:二進制、十進制、十六進制還有哪些?我想不起來了。
當然這和我從事的編程領域有極大關系,遼寧北大青鳥http://www.kmbdqn.cn/認為如果我做的不是Web開發,而是搜索,游戲,安全,演算法,人工智慧等,那對數學的要求估計就開始飆升了。
其實計算機的基礎是數讓搜裂學,只是我們一直在應用層編程,體會不到罷了。
比如說我們日常使用的計算機,絕大部分都是所謂馮諾依曼結構,這個結構可以說是圖靈機這個概念機器的具體實現,而圖靈機就是一個純數學的東西啊,沒有圖靈機這么偉大的抽象作為數學基礎,現代的計算機是製造不出來的。
再比如說密碼領域需要很多數論的知識,RSA演算法就涉及到大素數的分解;我們常用的Mysql,Oracle等關系資料庫的底層基礎是離散數學的笛卡爾乘積;通信系統中很重要的一個原理就是傅里葉變換。
編譯器會用到有限狀態機;數據的壓縮會用到各種數學的演算法;項目管理中的進度管理,甘特圖數學基礎就是圖論。
.....總之,數學在計算機科學扮演著非常重要的角色,是整個學科的基礎。
2、不拼數學拼什麼?具體到應用層編程,尤其Web開發、企業信息化開發,整天折騰的是框架和類庫,用不到這么多高大上的數學知識,那到底拼的是什麼?想想編程中常用的數組,如果是一維數組,做個循環和遍歷,每個人都能輕松應對。
如果要用數組來表示二叉樹坦閉,就需要把一個樹形結構對應到線性結構,那難度立刻上升。
如果在編程中需要自己實現鏈表,就會發現把各個節點的鏈接關系維護好,需要把指針調來調去,挪來挪去,實在不是一件容易的事情。
這樣的能力就是邏輯思維的一種體現。
我們在做系統設計的時候,經常需要總結、分析現實需求,找到容易變化的部分和相對穩定的部分,把他們封裝起來,形成核心的概念,支撐起整個系統,這是一個抽象的過程,雖然用不到多少數學知識,但是思維的過程也極不容易。
邏輯思維能力和抽象能力的差別,能夠區分出程序員的優秀和平庸。
一個優秀程序員寫出的代碼,介面清晰,容易擴展,易於維護;一個差程序員寫出的代碼,思路混亂,完全是一些計算機語句的堆砌,漏卜別人看不明白,過一段時間自己都看不明白了。
數學系的同學在這兩方面恰恰是長項,想想看,數學系同學們整天折騰這么多「枯燥的」抽象概念,再去看編程這樣大部分都是具體化的實現,簡直是分分鍾搞定!這可能是數學系的轉到編程領域很厲害的原因吧。
邏輯思維能力通過學習數據結構和演算法,做數據結構的習題可以得到有效的提高,抽象能力需要在實踐中不斷的練習、積累經驗。
對於初學編程的同學,從現在就開始努力提升吧!

H. java中的演算法,一共有多少種,哪幾種,怎麼分類。

就好比問,漢語中常用寫作方法有多少種,怎麼分類。

演算法按用途分,體現設計目的、有什麼特點
演算法按實現方式分,有遞歸、迭代、平行、序列、過程、確定、不確定等等
演算法按設計范型分,有分治、動態、貪心、線性、圖論、簡化等等

作為圖靈完備的語言,理論上」Java語言「可以實現所有演算法。
「Java的標准庫'中用了一些常用數據結構和相關演算法.

像apache common這樣的java庫中又提供了一些通用的演算法

I. Java 的垃圾回收如何判斷哪個對象可以被回收

java對象符合以下條件便會被垃圾回收:

1.所有實例都沒有活動線程訪問
2.沒有被其他任何實例訪問的循環引用實例。
3.Java 中有不同的引用類型。判斷實例是否符合垃圾收集的條件都依賴於它的引用類型。

在編譯過程中作為一種優化技術,Java編譯器能選擇給實例賦null值,從而標記實例為可回收。

classAnimal{

publicstaticvoidmain(String[]args){

Animallion=newAnimal();

System.out.println("Mainiscompleted.");

}

protectedvoidfinalize(){

System.out.println("RestinPeace!");

}

}

熱點內容
如何選擇最佳配置 發布:2025-07-16 01:56:44 瀏覽:603
mad加密 發布:2025-07-16 01:52:12 瀏覽:424
linux64位內存 發布:2025-07-16 01:02:36 瀏覽:960
壓縮衣尺碼表 發布:2025-07-16 00:47:33 瀏覽:640
安卓恢復了出廠怎麼找回照片 發布:2025-07-16 00:43:56 瀏覽:933
為什麼說伺服器已停止響應 發布:2025-07-16 00:29:36 瀏覽:391
python判斷字元串是否為空 發布:2025-07-16 00:21:47 瀏覽:210
安卓轉蘋果用什麼軟體 發布:2025-07-16 00:21:45 瀏覽:628
安卓官服如何登ios 發布:2025-07-16 00:21:32 瀏覽:624
天龍搶店腳本 發布:2025-07-16 00:14:47 瀏覽:958