国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

堆優(yōu)化版迪杰斯特拉(Dijkstra)算法簡(jiǎn)單分析

這篇具有很好參考價(jià)值的文章主要介紹了堆優(yōu)化版迪杰斯特拉(Dijkstra)算法簡(jiǎn)單分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

堆優(yōu)化版迪杰斯特拉算法:

  1. 優(yōu)化原理:

上面的樸素版迪杰斯特拉算法主要缺陷是,每當(dāng)找到一個(gè)最短路徑,如果需要找下一個(gè)最短路徑,就需要在完成松弛操作之后,遍歷dist數(shù)組,尋找其中的最小值。遍歷dist數(shù)組的時(shí)間復(fù)雜度為O(n)。(dist數(shù)組儲(chǔ)存源點(diǎn)到各個(gè)點(diǎn)的當(dāng)前最短距離)

如果圖的邊數(shù)為n*(n-1),那么每找到一個(gè)最小值,所要進(jìn)行的松弛操作數(shù)就是n-1,這和遍歷dist數(shù)組可以同時(shí)進(jìn)行,算法優(yōu)化的空間不大。

然而,如果是稀疏圖,每找到一個(gè)最小值,所要進(jìn)行的松弛操作數(shù)就遠(yuǎn)小于n-1,這時(shí)就可以對(duì)算法進(jìn)行優(yōu)化。優(yōu)化的關(guān)鍵是省去對(duì)dist的線性查找,如果每次可以直接返回dist中的最大值,就可以大大減小算法的時(shí)間復(fù)雜度。

堆優(yōu)化后的迪杰斯特拉算法復(fù)雜度為mlogn

  1. 算法分析:

堆優(yōu)化版迪杰斯特拉時(shí)間復(fù)雜度為O(mlogn),n表示點(diǎn)數(shù),m表示邊數(shù)

    • 初始化dist[1]=0,dist[i]=+∞ (除1外其它點(diǎn))
    • 循環(huán)遍歷所有節(jié)點(diǎn)
      1. 找到當(dāng)前未在s中標(biāo)記過(guò)且離遠(yuǎn)點(diǎn)最近的點(diǎn) (樸素:總共n^2次)---->(堆優(yōu)化:總共n次)
      2. 該點(diǎn)進(jìn)行標(biāo)記
      3. 用t更新其它點(diǎn)的距離(樸素:O(n^2))----->(堆優(yōu)化:O(mlogn))

假設(shè)1為當(dāng)源點(diǎn)

堆優(yōu)化版迪杰斯特拉(Dijkstra)算法簡(jiǎn)單分析

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-402184.html

  • 找到當(dāng)前標(biāo)記過(guò)且離源點(diǎn)最近的1號(hào)點(diǎn)
  • 標(biāo)記1號(hào)點(diǎn)已確定的最短距離
  • 用1號(hào)點(diǎn)的距離更新2號(hào)與3號(hào)點(diǎn)的距離

堆優(yōu)化版迪杰斯特拉(Dijkstra)算法簡(jiǎn)單分析

  • 找到當(dāng)前為標(biāo)記過(guò)且離源點(diǎn)最近的2號(hào)點(diǎn)
  • 找到2號(hào)以確定最段距離
  • 用1號(hào)點(diǎn)的距離更新2號(hào)點(diǎn)與3號(hào)點(diǎn)(1+9<12)距離

堆優(yōu)化版迪杰斯特拉(Dijkstra)算法簡(jiǎn)單分析

依次類推得:

?堆優(yōu)化版迪杰斯特拉(Dijkstra)算法簡(jiǎn)單分析

?時(shí)間復(fù)雜度分析

每次找到最小距離的點(diǎn)沿著邊更新其他的點(diǎn),若dist[j] > distance + w[i],表示可以更新dist[j],更新后再把j點(diǎn)和對(duì)應(yīng)的距離放入小根堆中。由于點(diǎn)的個(gè)數(shù)是n,邊的個(gè)數(shù)是m,在極限情況下(稠密圖m=n(n?1)2m=n(n?1)2)最多可以更新m回,每一回最多可以更新n個(gè)點(diǎn)(嚴(yán)格上是n - 1個(gè)點(diǎn)),有m回,因此最多可以把n2個(gè)點(diǎn)放入到小根堆中,因此每一次更新小根堆排序的情況是O(log(n2)),一共最多m次更新,因此總的時(shí)間復(fù)雜度上限是 O(mlog((n2)))=O(2mlogn)=O(mlogn)

算法代碼

?

	public class Main{  
   static int N = 100010;  
   static int n;  
 
   static int[] h = new int[N];  
   static int[] e = new int[N];  
   static int[] ne = new int[N];  
	    static int[] w = new int[N];  
	    static int idx = 0;  
	    static int[] dist = new int[N];// 存儲(chǔ)1號(hào)點(diǎn)到每個(gè)點(diǎn)的最短距離  
	    static boolean[] st = new boolean[N];  
	    static int INF = 0x3f3f3f3f;//設(shè)置無(wú)窮大  
	    public static void add(int a,int b,int c)  
	    {  
	        e[idx] = b;  
	        w[idx] = c;  
	        ne[idx] = h[a];  
	        h[a] = idx ++;  
	    }  
	  
	    // 求1號(hào)點(diǎn)到n號(hào)點(diǎn)的最短路,如果不存在則返回-1  
	    public static int dijkstra()  
	    {  
	        //維護(hù)當(dāng)前未在st中標(biāo)記過(guò)且離源點(diǎn)最近的點(diǎn)  
	        PriorityQueue<PIIs> queue = new PriorityQueue<PIIs>();  
	        Arrays.fill(dist, INF);  
	        dist[1] = 0;  
	        queue.add(new PIIs(0,1));  
	        while(!queue.isEmpty())  
	        {  
	            //1、找到當(dāng)前未在s中出現(xiàn)過(guò)且離源點(diǎn)最近的點(diǎn)  
	            PIIs p = queue.poll();  
	            int t = p.getSecond();  
	            int distance = p.getFirst();  
	            if(st[t]) continue;  
	            //2、將該點(diǎn)進(jìn)行標(biāo)記  
	            st[t] = true;  
	            //3、用t更新其他點(diǎn)的距離  
	            for(int i = h[t];i != -1;i = ne[i])  
	            {  
	                int j = e[i];  
	                if(dist[j] > distance + w[i])  
	                {  
	                    dist[j] = distance + w[i];  
	                    queue.add(new PIIs(dist[j],j));  
	                }  
	            }  
	  
	        }  
	        if(dist[n] == INF) return -1;  
	        return dist[n];  
	    }  
	  
	    public static void main(String[] args) throws IOException{  
	        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));  
	        String[] str1 = reader.readLine().split(" ");  
	        n = Integer.parseInt(str1[0]);  
	        int m = Integer.parseInt(str1[1]);  
	        Arrays.fill(h, -1);  
	        while(m -- > 0)  
	        {  
	            String[] str2 = reader.readLine().split(" ");  
	            int a = Integer.parseInt(str2[0]);  
	            int b = Integer.parseInt(str2[1]);  
	            int c = Integer.parseInt(str2[2]);  
	            add(a,b,c);  
	        }  
	        System.out.println(dijkstra());  
	    }  
}  

堆優(yōu)化版迪杰斯特拉(Dijkstra)算法簡(jiǎn)單分析

?

到了這里,關(guān)于堆優(yōu)化版迪杰斯特拉(Dijkstra)算法簡(jiǎn)單分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • dijkstra迪杰斯特拉算法(鄰接表法)

    dijkstra迪杰斯特拉算法(鄰接表法)

    算法簡(jiǎn)易過(guò)程: 求單源有向圖最短路徑 使用 鄰接表法 來(lái)存儲(chǔ)頂點(diǎn)和邊,錄入 有向圖 。 (當(dāng)然也可以無(wú)向圖,不過(guò)錄入時(shí)要錄入兩次,比如 a b 3? ? ? ? b a 3) ?代碼如下: 測(cè)試如下: ?

    2024年02月07日
    瀏覽(33)
  • C語(yǔ)言 最短路徑 迪杰斯特拉(Dijkstra)算法

    C語(yǔ)言 最短路徑 迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法是由荷蘭計(jì)算機(jī)科學(xué)家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是從一個(gè)頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,解決的是有權(quán)圖中單源最短路徑問(wèn)題。迪杰斯特拉算法主要特點(diǎn)是從起始點(diǎn)開(kāi)始,采用貪心算法的策略,每次遍歷到始點(diǎn)距離最

    2024年02月03日
    瀏覽(31)
  • 【數(shù)據(jù)結(jié)構(gòu)】圖解:迪杰斯特拉算法(Dijkstra)最短路徑

    【數(shù)據(jù)結(jié)構(gòu)】圖解:迪杰斯特拉算法(Dijkstra)最短路徑

    目錄 一、方法描述 二、例題一 ??編輯 三、例題二 ?有圖如上,用迪杰斯特拉算法求頂點(diǎn)A到其余各頂點(diǎn)的最短路徑,請(qǐng)問(wèn)1.第一步求出的最短路徑是A到C的最短路徑2.第二步求出的是頂點(diǎn)A到頂點(diǎn)B/F的最短路徑3.頂點(diǎn)A到D的最短路徑長(zhǎng)度是__25___ (填數(shù)字)4.頂點(diǎn)A到頂點(diǎn)F的最短路

    2024年02月12日
    瀏覽(20)
  • java實(shí)現(xiàn)迪杰斯特拉(Dijkstra)算法求解最短路問(wèn)題

    java實(shí)現(xiàn)迪杰斯特拉(Dijkstra)算法求解最短路問(wèn)題

    迪杰斯特拉(Dijkstra)算法是由荷蘭計(jì)算機(jī)科學(xué)家狄克斯特拉于1959年提出的。是尋找從一個(gè)頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,可用來(lái)解決最短路徑問(wèn)題。 迪杰斯特拉算法采用貪心算法的策略,將所有頂點(diǎn)分為已標(biāo)記點(diǎn)和未標(biāo)記點(diǎn)兩個(gè)集合,從起始點(diǎn)開(kāi)始,不斷在未標(biāo)記點(diǎn)中尋

    2024年02月12日
    瀏覽(30)
  • 大話數(shù)據(jù)結(jié)構(gòu)-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)

    大話數(shù)據(jù)結(jié)構(gòu)-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)

    ??最短路徑,對(duì)于圖來(lái)說(shuō),是兩頂點(diǎn)之間經(jīng)過(guò)的邊數(shù)最少的路徑;對(duì)于網(wǎng)來(lái)說(shuō),是指兩頂點(diǎn)之間經(jīng)過(guò)的邊上權(quán)值之和最小的路徑。路徑上第一個(gè)頂點(diǎn)為源點(diǎn),最后一個(gè)頂點(diǎn)是終點(diǎn)。 ??以如下無(wú)向圖為例: ??我們來(lái)計(jì)算下標(biāo)為0的頂點(diǎn),到其他頂點(diǎn)的最短路徑,首先定義

    2024年02月06日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu) -最短路徑dijkstra(迪杰斯特拉)算法講解及代碼實(shí)現(xiàn)

    數(shù)據(jù)結(jié)構(gòu) -最短路徑dijkstra(迪杰斯特拉)算法講解及代碼實(shí)現(xiàn)

    ? ? ? ? 迪杰斯特拉算法是一種廣義的貪心算法,求出局部最優(yōu)解,再去求全局最優(yōu)解 舉例圖:(起始點(diǎn)為1) 輔助數(shù)組: s:記錄了目標(biāo)頂點(diǎn)到其他頂點(diǎn)的最短路徑是否求得(求得為1,否則為0) p:目標(biāo)頂點(diǎn)到其他頂點(diǎn)的最短路徑的前驅(qū)節(jié)點(diǎn) (如,求得1-7-5的最短路徑,那

    2024年02月11日
    瀏覽(26)
  • MATLAB輕松繪制地圖路線——Dijkstra(迪杰斯特拉)算法最短路徑規(guī)劃

    MATLAB輕松繪制地圖路線——Dijkstra(迪杰斯特拉)算法最短路徑規(guī)劃

    利用MATLAB繪制地圖需要三個(gè)基本數(shù)據(jù): 節(jié)點(diǎn) 節(jié)點(diǎn)坐標(biāo) 節(jié)點(diǎn)間相通的路線 以11B交通巡警平臺(tái)調(diào)度問(wèn)題中的A區(qū)數(shù)據(jù)為例: (數(shù)據(jù)及工程文件下載鏈接見(jiàn)文末) Demo1: 可通過(guò)已知節(jié)點(diǎn)的坐標(biāo),計(jì)算出各節(jié)點(diǎn)之間的距離,有Matlab基礎(chǔ)的同學(xué)可以嘗試Demo2, 也可通過(guò)Excel自行實(shí)現(xiàn);

    2023年04月21日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)與算法 —— 最短路徑Dijkstra算法(迪杰斯特拉)詳細(xì)圖解以及python實(shí)現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)與算法 —— 最短路徑Dijkstra算法(迪杰斯特拉)詳細(xì)圖解以及python實(shí)現(xiàn)

    目錄 前言 1. 介紹 2. 加權(quán)圖 2.1 概念 3. 最短路徑 -- Dijkstra 算法 3.1 歷史 3.2 Dijkstra 算法的基本思路 3.3?Dijkstra 算法圖解 4.? python中dijkstra算法的實(shí)現(xiàn) 5. 總結(jié)? 前兩章我們講到了關(guān)于圖的基本知識(shí),和廣度/深度優(yōu)先搜索。 本章,我們將介紹 加權(quán)圖 和 最短路徑 的相關(guān)知識(shí)。 最

    2024年02月12日
    瀏覽(22)
  • 迪杰斯特拉(Dijkstra's )算法——解決帶權(quán)有向無(wú)向圖最短路徑

    迪杰斯特拉(Dijkstra's )算法——解決帶權(quán)有向無(wú)向圖最短路徑

    迪杰斯特拉算法(Dijkstra\\\'s Algorithm),又稱為狄克斯特拉算法,是一種用于解決帶權(quán)重有向圖或無(wú)向圖最短路徑問(wèn)題的算法。該算法由荷蘭計(jì)算機(jī)科學(xué)家艾茲赫爾·狄克斯特拉在1956年發(fā)明,是一種廣泛應(yīng)用于網(wǎng)絡(luò)路由和其他領(lǐng)域的算法。 在 2001 年的一次采訪中,Dijkstra 博士透露

    2024年02月03日
    瀏覽(25)
  • 使用omp并行技術(shù)加速最短路徑算法-迪杰斯特拉(Dijkstra)算法(記錄最短路徑和距離)

    使用omp并行技術(shù)加速最短路徑算法-迪杰斯特拉(Dijkstra)算法(記錄最短路徑和距離)

    原理: Dijkstra算法是解決**單源最短路徑**問(wèn)題的**貪心算法** 它先求出長(zhǎng)度最短的一條路徑,再參照該最短路徑求出長(zhǎng)度次短的一條路徑 ? ? 直到求出從源點(diǎn)到其他各個(gè)頂點(diǎn)的最短路徑。 首先假定源點(diǎn)為u,頂點(diǎn)集合V被劃分為兩部分:集合 S 和 V-S。 初始時(shí)S中僅含有源點(diǎn)u,

    2024年02月10日
    瀏覽(55)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包