欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

深拷貝一個(gè)圖的方法教程

深拷貝一個(gè)圖的方法教程,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)專業(yè)IDC數(shù)據(jù)服務(wù)器托管提供商,專業(yè)提供成都服務(wù)器托管,服務(wù)器租用,服務(wù)器托管,服務(wù)器托管,成都多線服務(wù)器托管等服務(wù)器托管服務(wù)。

前言

在此之前,你需要對(duì)一些概念搞清楚:什么是深拷貝、淺拷貝?

淺拷貝:如果拷貝的是引用類型(非基本類型),就只會(huì)拷貝一層(嵌套的對(duì)象不會(huì)被拷貝),如果原對(duì)象發(fā)生改變,那么拷貝對(duì)象也會(huì)發(fā)生改變。

深拷貝:深拷貝的話會(huì)拷貝多層,嵌套的對(duì)象也會(huì)被拷貝出來(lái),相當(dāng)于開辟一個(gè)新的內(nèi)存地址用于存放拷貝的對(duì)象。

用通俗一點(diǎn)(可能不完全確切)的話解釋,淺拷貝就像你的雙胞胎兄弟一樣,你們父母親人都是一樣的;而深拷貝就像另一個(gè)平行的時(shí)空,那里有另一個(gè)你的一切。

既然搞懂了深淺拷貝以及其區(qū)別,我們?cè)倏纯磮D,圖一般用來(lái)表示節(jié)點(diǎn)和節(jié)點(diǎn)之間的關(guān)系,常分為有向圖和無(wú)向圖,在這里我們以無(wú)向圖(一旦連接即雙向)為主題。

我們對(duì)圖的表示一般有鄰接矩陣和鄰接表,鄰接矩陣的話比較直觀的表示一個(gè)圖的連通性,操作維護(hù)更簡(jiǎn)單,在Java中一般使用二維數(shù)組表示鄰接矩陣,數(shù)組中的值可以表示兩個(gè)節(jié)點(diǎn)的權(quán)值。

深拷貝一個(gè)圖的方法教程

鄰接矩陣表示一個(gè)圖

使用鄰接矩陣雖然簡(jiǎn)單但是有個(gè)比較差的就是浪費(fèi)較多內(nèi)存空間,所以很多情況還是使用鄰接表來(lái)表示一個(gè)圖,鄰接表一般是數(shù)組+鏈表的這么一個(gè)組合。但是也有一些特殊情況各個(gè)節(jié)點(diǎn)比較獨(dú)立的不用數(shù)組聯(lián)立。

深拷貝一個(gè)圖的方法教程

鄰接表表示一個(gè)圖

問(wèn)題分析

如果這個(gè)圖使用鄰接表表示,給你無(wú)向 連通 圖中一個(gè)節(jié)點(diǎn)的引用,請(qǐng)你返回該圖的 深拷貝(克隆),這個(gè)問(wèn)題是力扣131克隆圖原題。

圖中的每個(gè)節(jié)點(diǎn)都包含它的值 val(int) 和其鄰居的列表(list[Node])。

class Node {     public int val;     public List<Node> neighbors; }

深拷貝一個(gè)圖的方法教程

圖片來(lái)源力扣

給一個(gè)節(jié)點(diǎn)的引用,怎么克隆這個(gè)圖呢?

如果只有這一個(gè)節(jié)點(diǎn),那么克隆這個(gè)節(jié)點(diǎn)就好。如果這個(gè)節(jié)點(diǎn)只有一層鄰居,那克隆這個(gè)鄰居的列表(克隆List集合)即可。

但事實(shí)是這個(gè)節(jié)點(diǎn)可能有多層鄰居,并且鄰居之間可能存在著復(fù)雜聯(lián)系。

深拷貝一個(gè)圖的方法教程

可能的一個(gè)圖

克隆整個(gè)圖,所以圖的每一個(gè)節(jié)點(diǎn)都要被克隆的,我們需要使用圖論的搜索算法來(lái)枚舉所有節(jié)點(diǎn),并且在遍歷的過(guò)程中我們需要想辦法將節(jié)點(diǎn)之間的關(guān)系也克隆下來(lái)。遍歷的方法可以使用dfs或者bfs,這里使用bfs來(lái)實(shí)現(xiàn)。

凡是遇到苦難的時(shí)候我們模擬一下這個(gè)克隆的過(guò)程即可,通過(guò)下面這張圖可以大概了解克隆圖的過(guò)程中,最大的問(wèn)題是要避免創(chuàng)建重復(fù)節(jié)點(diǎn)。即有的節(jié)點(diǎn)一旦被創(chuàng)建它的引用可能在后面會(huì)被用到的。

深拷貝一個(gè)圖的方法教程

模擬克隆的過(guò)程

那我們?cè)撊绾谓鉀Q這個(gè)問(wèn)題呢?怎么樣能夠快速找到對(duì)應(yīng)節(jié)點(diǎn)的引用?

這里最好的方法是使用HashMap,其中key保存的是被克隆圖中的節(jié)點(diǎn),而value是在克隆圖中所對(duì)應(yīng)的節(jié)點(diǎn),這樣在克隆新圖的過(guò)程中,我們遍歷被克隆圖中節(jié)點(diǎn)鄰居的時(shí)候,就可以用哈希判斷這個(gè)節(jié)點(diǎn)對(duì)應(yīng)的value是否存在(即這個(gè)節(jié)點(diǎn)在克隆圖中是否存在)。

如果存在那么直接使用HashMap找到對(duì)應(yīng)節(jié)點(diǎn)放入克隆圖中新創(chuàng)建的List中。

不過(guò)不存在說(shuō)明這個(gè)節(jié)點(diǎn)第一次遇到,克隆這個(gè)節(jié)點(diǎn),先放到hashMap中與被克隆節(jié)點(diǎn)對(duì)應(yīng),然后放入克隆圖中新創(chuàng)建的List中。

這個(gè)流程其中大概是這樣的:

深拷貝一個(gè)圖的方法教程

其中一個(gè)過(guò)程Map的變化和作用

有了上面的分析,想必你對(duì)這個(gè)問(wèn)題的解決已經(jīng)有了思路和想法,下面就提供一下代碼實(shí)現(xiàn)。

/* // Definition for a Node. class Node {     public int val;     public List<Node> neighbors;     public Node() {         val = 0;         neighbors = new ArrayList<Node>();     }     public Node(int _val) {         val = _val;         neighbors = new ArrayList<Node>();     }     public Node(int _val, ArrayList<Node> _neighbors) {         val = _val;         neighbors = _neighbors;     } } */  class Solution {     public Node cloneGraph(Node node) {         if(node==null)                 return null;         Map<Node, Node>map=new HashMap<Node, Node>();//節(jié)點(diǎn)映射克隆的節(jié)點(diǎn)          Queue<Node>oldqueue=new ArrayDeque<Node>();//bfs隊(duì)列         oldqueue.add(node);         Node value=new Node(node.val);//先將返回的節(jié)點(diǎn) 創(chuàng)建、映射         map.put(node, value);         while (!oldqueue.isEmpty()) {             Node oldnode=oldqueue.poll();             Node newnode=map.get(oldnode);//找到這個(gè)節(jié)點(diǎn)對(duì)應(yīng)克隆的映射(一定存在)             List<Node>list=oldnode.neighbors;//鄰居             List<Node>listnew=new ArrayList<Node>();//克隆鄰居             for(Node team:list)             {                 if(map.containsKey(team))                 {                     listnew.add(map.get(team));                     //點(diǎn)以前已經(jīng)遇到,直接添加到鄰居列表                 }                 else {//這個(gè)鄰居第一次碰到,需要?jiǎng)?chuàng)建新節(jié)點(diǎn)賦予值                     Node no=new Node(team.val);                     map.put(team, no);//映射                     listnew.add(no);                     oldqueue.add(team);//這個(gè)點(diǎn)第一次遇到,要將它放到隊(duì)列中進(jìn)行bfs搜索                 }             }             newnode.neighbors=listnew;//將節(jié)點(diǎn)的鄰居指向list         }         return value;     } }

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

分享題目:深拷貝一個(gè)圖的方法教程
分享路徑:http://aaarwkj.com/article40/gojhho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司響應(yīng)式網(wǎng)站、網(wǎng)站排名、手機(jī)網(wǎng)站建設(shè)、微信公眾號(hào)靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司
人妻乱人伦中文字幕在线| 日韩精品一区三区二区| 国产亚洲精品国产福利久久| 国产av综合一区二区三区最新| 国产欧美日韩精品三级| 亚洲成在人线免费观看| 欧美成人精品在线观看| 亚洲国产精品一区二区三区在线| 国产亚洲精品久久综合阿香| 亚洲av不卡一区二区在线观看| 亚洲综合日韩丝袜人妻| 国内自拍韩国资源在线| 国产黄片免费看久久久| 精品久久人妻中文字幕免费| 国产不卡高清视频在线| 亚洲各类熟女们中文字幕| 国产一区二区三区在线看片| 日韩女优在线播放一区二区| 亚洲精品隔壁傲慢人妻| av网址在线免费观看| 国产高清av免费在线观看| 99精品欧美一区二区三区视频| 亚洲成年人黄色在线观看| 大香蕉一区二区亚洲欧美| 久久99精品综合国产女同| 亚洲av成人在线播放| 丰满人妻的诱惑中文字幕| 人妻中字幕出轨中文字幕| 人妻少妇av免费久久蜜臀| 国产一区二区黄色在线| 午夜福利网午夜福利网| 麻豆国产传媒片在线看| 亚洲欧美日韩不卡视频| 99久久成人精品国产片| 日韩视频 一区 二区| 国产精品国语对白av处女| 国产模特一区二区三区| 中文字幕乱码高清免费| 亚洲国产99在线精品一区| 黄色录像免费一内片一级 | 成人午夜三级在线观看|