每日算法刷題Day68:9.10:leetcode 最短路6道題,用時2h30min

一. 單源最短路:Dijkstra 算法

1.套路

1.Dijkstra 算法介紹
(1)定義 g[i][j] 表示節點 i 到節點 j 這條邊的邊權。如果沒有 i 到 j 的邊,則 g[i][j]=∞
(2)定義 dis[i] 表示起點 k 到節點 i 的最短路長度,一開始 dis[k]=0,其余 dis[i]=∞ 表示尚未計算出。
(3)我們的目標是計算出最終的 dis 數組。

  • 首先更新起點 k 到其鄰居 y 的最短路,即更新 dis[y] g[k][y]
  • 然后取除了起點 k 以外的 dis[i]最小值(貪心),假設最小值對應的節點是 3。此時可以斷言:dis[3] 已經是 k 到 3 的最短路長度,不可能有其它 k 到 3 的路徑更短!反證法:假設存在更短的路徑,那我們一定會從 k 出發經過一個點 u,它的 dis[u]dis[3] 還要小,然后再經過一些邊到達 3,得到更小的 dis[3]。但 dis[3]已經是最小的了,并且圖中沒有負數邊權,所以 u 是不存在的,矛盾。故原命題成立,此時我們得到了 dis[3] 的最終值。
  • 用節點 3 到其鄰居 y 的邊權 g[3][y] 更新 dis[y]:如果 dis[3]+g[3][y]<dis[y],那么更新 dis[y]dis[3]+g[3][y],否則不更新。
  • 然后取除了節點 k,3 以外的 dis[i] 的最小值,重復上述過程。
  • 由數學歸納法可知,這一做法可以得到每個點的最短路。當所有點的最短路都已確定時,算法結束。
    2.模版
// 返回從起點start到每個點的最短路徑dis,如果節點x不可達,則dis[x]=LLong_max
// 要求:沒有負數邊權
// 時間復雜度O(n+mlogm),注意堆中有O(m)個元素(懶更新所有邊進入),獲取堆元素每次為(logm)
// 兩個節點之間也可能有多條邊不用更改代碼,同樣滿足
typedef long long ll;
typedef pair<int,long long> PIL;
typedef pair<long long,int> PLI;
vector<ll> shortPathDijkstra(int n,vector<vector<int>>& edges,int start){// 注:如果節點編號從1開始(而不是從0開始),可以把n加1(g初始化,dis初始化以及最終dis結果不包括0元素)vector<vector<PIL>> g(n);for(auto& e:edges){int x=e[0],y=e[1],wt=e[2];g[x].push_back({y,wt});// g[y].push_back({x,wt}); // 無向圖}vector<ll> dis(n,LLONG_MAX);// 最短距離小頂堆priority_queue<PLI,vector<PLI>,greater<>> pq;dis[start]=0;pq.push({0,start});while(!pq.empty()){auto t=pq.top();pq.pop();ll dis_x=t.first;int x=t.second;// 懶刪除if(dis_x>dis[x]){continue;}for(auto& t2:g[x]){int y=t2.first;ll wt=t2.second;ll newdis=dis_x+wt;if(newdis<dis[y]){dis[y]=newdis;// 懶更新堆,先不更新堆中最短距離,而是全都入堆,出堆時再判斷pq.push({newdis,y});}}}return dis;
}

2.網格圖模版(無鄰接表,dis二維數組,堆中tuple三元組):

class Solution {
public:int n, m;typedef long long ll;typedef tuple<long long, int, int> TLII;vector<int> dx = {1, -1, 0, 0}, dy = {0, 0, 1, -1};bool inMap(int x, int y) { return 0 <= x && x < n && 0 <= y && y < m; }int minTimeToReach(vector<vector<int>>& moveTime) {n = moveTime.size(), m = moveTime[0].size();vector<vector<ll>> dis(n, vector<ll>(m, LLONG_MAX));priority_queue<TLII, vector<TLII>, greater<>> pq;dis[0][0] = 0;pq.push({0, 0, 0});while (!pq.empty()) {auto t = pq.top();pq.pop();ll dis_xy = get<0>(t);int x = get<1>(t), y = get<2>(t);if (dis_xy > dis[x][y])continue;for (int i = 0; i < 4; ++i) {int nx = x + dx[i], ny = y + dy[i];if (!inMap(nx, ny))continue;ll newdis = max(dis_xy, 1LL * moveTime[nx][ny]) + 1;if (newdis < dis[nx][ny]) {dis[nx][ny] = newdis;pq.push({newdis, nx, ny});}}}return dis[n - 1][m - 1];}
};
2.題目描述
3.學習經驗
1. 743. 網絡延遲時間(中等)

743. 網絡延遲時間 - 力扣(LeetCode)

思想

1.有?n?個網絡節點,標記為?1?到?n
給你一個列表?times,表示信號經過?有向?邊的傳遞時間。?times[i] = (ui, vi, wi),其中?ui?是源節點,vi?是目標節點,?wi?是一個信號從源節點傳遞到目標節點的時間。
現在,從某個節點?K?發出一個信號。需要多久才能使所有節點都收到信號?如果不能使所有節點收到信號,返回?-1?。
2.模版題,時間即邊權,答案為起點到其他點的最大距離

代碼
class Solution {
public:typedef long long ll;typedef pair<int, long long> PIL;typedef pair<long long, int> PLI;int networkDelayTime(vector<vector<int>>& times, int n, int k) {vector<vector<PIL>> g(n + 1);for (auto& e : times) {int u = e[0], v = e[1], wt = e[2];g[u].push_back({v, wt});}vector<ll> dis(n + 1, LLONG_MAX);priority_queue<PLI, vector<PLI>, greater<>> pq;dis[k] = 0;pq.push({0, k});while (!pq.empty()) {auto t = pq.top();pq.pop();int u = t.second;ll dis_u = t.first;if (dis_u > dis[u])continue;for (auto& t2 : g[u]) {int y = t2.first;ll wt = t2.second;if (dis_u + wt < dis[y]) {dis[y] = dis_u + wt;pq.push({dis[y], y});}}}ll res = -1;for (int i = 1; i <= n; ++i) {if (dis[i] == LLONG_MAX)return -1;res = max(res, dis[i]);}return res;}
};
2. 3341. 到達最后一個房間的最少時間I(中等)

3341. 到達最后一個房間的最少時間 I - 力扣(LeetCode)

思想

1.有一個地窖,地窖中有?n x m?個房間,它們呈網格狀排布。
給你一個大小為?n x m?的二維數組?moveTime?,其中?moveTime[i][j]?表示房間開啟并可達所需的?最小?秒數。你在時刻?t = 0?時從房間?(0, 0)?出發,每次可以移動到?相鄰?的一個房間。在?相鄰?房間之間移動需要的時間為 1 秒。
請你返回到達房間?(n - 1, m - 1)?所需要的?最少?時間。
如果兩個房間有一條公共邊(可以是水平的也可以是豎直的),那么我們稱這兩個房間是?相鄰?的。
2.網格圖Dijkstra,不再是單個頂點編號,而是一個位置,所以dis變成二維數組,堆中為三元組,可以用tuple<ll,int,int>,但獲取元素不再是first,second,而是get<0>(t),get<1>(t),get<2>(t)
3.多了個限制條件:“其中?moveTime[i][j]?表示房間開啟并可達所需的?最小?秒數”,所以從(x,y)到(nx,ny)的最少秒數為max(dis_xy,moveTime[nx][ny])+1

代碼
class Solution {
public:int n, m;typedef long long ll;typedef tuple<long long, int, int> TLII;vector<int> dx = {1, -1, 0, 0}, dy = {0, 0, 1, -1};bool inMap(int x, int y) { return 0 <= x && x < n && 0 <= y && y < m; }int minTimeToReach(vector<vector<int>>& moveTime) {n = moveTime.size(), m = moveTime[0].size();vector<vector<ll>> dis(n, vector<ll>(m, LLONG_MAX));priority_queue<TLII, vector<TLII>, greater<>> pq;dis[0][0] = 0;pq.push({0, 0, 0});while (!pq.empty()) {auto t = pq.top();pq.pop();ll dis_xy = get<0>(t);int x = get<1>(t), y = get<2>(t);if (dis_xy > dis[x][y])continue;for (int i = 0; i < 4; ++i) {int nx = x + dx[i], ny = y + dy[i];if (!inMap(nx, ny))continue;ll newdis = max(dis_xy, 1LL * moveTime[nx][ny]) + 1;if (newdis < dis[nx][ny]) {dis[nx][ny] = newdis;pq.push({newdis, nx, ny});}}}return dis[n - 1][m - 1];}
};
3. 3112. 訪問消失節點的最少時間(中等)

3112. 訪問消失節點的最少時間 - 力扣(LeetCode)

思想

1.給你一個二維數組?edges?表示一個?n?個點的無向圖,其中?edges[i] = [ui, vi, lengthi]?表示節點?ui?和節點?vi?之間有一條需要?lengthi?單位時間通過的無向邊。
同時給你一個數組?disappear?,其中?disappear[i]?表示節點?i?從圖中消失的時間點,在那一刻及以后,你無法再訪問這個節點。
注意,圖有可能一開始是不連通的,兩個節點之間也可能有多條邊。
請你返回數組?answer?,answer[i]?表示從節點?0?到節點?i?需要的?最少?單位時間。如果從節點?0?出發?無法?到達節點?i?,那么?answer[i]?為?-1?。
2.從x->y,獲得到達y的newdis后,先判斷是否在disappear[y]之前即可

代碼
class Solution {
public:typedef pair<int, int> PII;vector<int> minimumTime(int n, vector<vector<int>>& edges,vector<int>& disappear) {vector<vector<PII>> g(n);for (auto& e : edges) {int u = e[0], v = e[1], w = e[2];g[u].push_back({v, w});g[v].push_back({u, w});}priority_queue<PII, vector<PII>, greater<>> pq;vector<int> dis(n, INT_MAX);dis[0] = 0;pq.push({0, 0});while (!pq.empty()) {auto t = pq.top();pq.pop();int dis_u = t.first;int u = t.second;if (dis_u > dis[u])continue;for (auto& t2 : g[u]) {int v = t2.first;int w = t2.second;int newdis = dis_u + w;if (newdis < disappear[v] && newdis < dis[v]) {dis[v] = newdis;pq.push({newdis, v});}}}for (int i = 0; i < n; ++i) {if (dis[i] == INT_MAX)dis[i] = -1;}return dis;}
};

二. 全源最短路:Floyd 算法

1.套路

1.Floyd 算法本質是三維 DP,理解:
f[k][i][j]表示i和j之間可以通過編號為1-k的節點集的最短路徑
初值f[0][i][j]為原圖的鄰接矩陣
f[k][i][j]:

  • (1)從f[k-1][i][j]轉移過來,表示不經過k
  • (2)從f[k-1][i][k]+f[k-1][k][j]轉移過來,表示經過k
    所以,f[k][i][j]=min(f[k-1][i][j],f[k-1][i][k]+f[k-1][k][j])
    發現最外層f[k]只由f[k-1]轉移,所以可以覆蓋,所以代碼中只有寫二維數組,但最外層遍歷是k
    ![[floyd三維DP.png]]
    2.圖解為什么遍歷時k在最外層,不能再最里層
    (1)在最里層的反例(當前路徑需要之后遍歷的路徑轉移過來,即轉移順序與遍歷順序相斥):
    ![[floyd的k在內層反例.png]]
    (2)k在最外層的更新邏輯(交換兩個k作對比):
    ![[floyd的k在最外層.png]]
    3.模版:
// 返回一個二維列表(鄰接矩陣),其中(i,j)這一項表示從i到j的最短路長度
// 如果無法從i到j,則最短路長度為LLONG_MAX/2(防止加法溢出)
// 允許負數邊權
// 如果計算完畢后,存在i,使得從i到i的最短路長度小于0(負環找不到最短路,無限更新),說明圖中有負環
// 節點編號從0到n-1
// 時間復雜度O(nn^3+m),其中m是edges的長度
typedef long long ll;
const ll INF=LLONG_MAX/2; // 防止加法溢出
vector<vector<ll>> shortestPathFloyd(int n,vector<vector<int>>& edges){vector<vector<ll>> f(n,vector<ll>(n,INF));for(int i=0;i<n;++i){f[i][i]=0;}for(auto& e:edges){int x=e[0],y=e[1];ll w=e[2];f[x][y]=min(f[x][y],w); // 如果有重邊,取最小值f[y][x]=min(f[y][x],w); // 無向圖}// 三層遍歷,最外層kfor(int k=0;k<n;++k){for(int i=0;i<n;++i){// 針對稀疏圖的優化if(f[i][k]==INF){continue;}for(int j=0;j<n;++j){f[i][j]=min(f[i][j],f[i][k]+f[k][j]);}}}/*// 檢查負環for(int i=0;i<n;++i){if(f[i][i]<0){// 存在負環}}*/return f;
}
2.題目描述
3.學習經驗
1. 1334. 閾值距離內鄰居最少的城市(中等)

1334. 閾值距離內鄰居最少的城市 - 力扣(LeetCode)

思想

1.有?n?個城市,按從?0?到?n-1?編號。給你一個邊數組?edges,其中?edges[i] = [fromi, toi, weighti]?代表?fromi?和?toi?兩個城市之間的雙向加權邊,距離閾值是一個整數?distanceThreshold
返回在路徑距離限制為?distanceThreshold?以內可到達城市最少的城市。如果有多個這樣的城市,則返回編號最大的城市。
注意,連接城市?i?和?j?的路徑的距離等于沿該路徑的所有邊的權重之和。
2.模版題

代碼
class Solution {
public:typedef long long ll;const ll INF = LLONG_MAX / 2;int findTheCity(int n, vector<vector<int>>& edges, int distanceThreshold) {vector<vector<ll>> f(n, vector<ll>(n, INF));for (int i = 0; i < n; ++i)f[i][i] = 0;for (auto& e : edges) {int x = e[0], y = e[1], w = e[2];f[x][y] = min(f[x][y], 1LL * w);f[y][x] = min(f[y][x], 1LL * w);}for (int k = 0; k < n; ++k) {for (int i = 0; i < n; ++i) {if (f[i][k] == INF)continue;for (int j = 0; j < n; ++j) {f[i][j] = min(f[i][j], f[i][k] + f[k][j]);}}}int res = -1, resCnt = INT_MAX;// 倒序保證編號最大for (int i = n - 1; i >= 0; --i) {int cnt = 0;for (int j = 0; j < n; ++j) {if (f[i][j] <= distanceThreshold)++cnt;}if (cnt < resCnt) {resCnt = cnt;res = i;}}return res;}
};
2. 2642. 設計可以求最短路徑的圖類(困難,學習)

2642. 設計可以求最短路徑的圖類 - 力扣(LeetCode)

思想

1.給你一個有?n?個節點的?有向帶權?圖,節點編號為?0?到?n - 1?。圖中的初始邊用數組?edges?表示,其中?edges[i] = [fromi, toi, edgeCosti]?表示從?fromi?到?toi?有一條代價為?edgeCosti?的邊。
請你實現一個?Graph?類:

  • Graph(int n, int[][] edges)?初始化圖有?n?個節點,并輸入初始邊。
  • addEdge(int[] edge)?向邊集中添加一條邊,其中?edge = [from, to, edgeCost]?。數據保證添加這條邊之前對應的兩個節點之間沒有有向邊。
  • int shortestPath(int node1, int node2)?返回從節點?node1?到?node2?的路徑?最小?代價。如果路徑不存在,返回?-1?。一條路徑的代價是路徑中所有邊代價之和。
    2.首先能想到Dijkstra,初始化要O(n+m),addEdge要O(1),查詢要O(n+mlogm)
    學習Floyd,初始化要O(n3+m),**`addEdge`要O(n2),但是查詢只要O(1)**
    3.重點學習addEdge,即新增一條x->y,它會影響所有i->j的最短路,會出現i->…x->y…->j,所以二重循環更新
    4.注意因為有f[i][x] + w + f[y][j],所以INF開INT_MAX / 3
代碼
class Graph {
public:vector<vector<int>> f;const int INF = INT_MAX / 3;int len;Graph(int n, vector<vector<int>>& edges) {len = n;f.assign(n, vector<int>(n, INF));for (int i = 0; i < n; ++i)f[i][i] = 0;for (auto& e : edges) {int x = e[0], y = e[1], w = e[2];f[x][y] = min(f[x][y], w);}for (int k = 0; k < n; ++k) {for (int i = 0; i < n; ++i) {if (f[i][k] == INF)continue;for (int j = 0; j < n; ++j) {f[i][j] = min(f[i][j], f[i][k] + f[k][j]);}}}}void addEdge(vector<int> edge) {int x = edge[0], y = edge[1], w = edge[2];if (w >= f[x][y]) { // 無需更新return;}for (int i = 0; i < len; ++i) {for (int j = 0; j < len; ++j) {f[i][j] = min(f[i][j], f[i][x] + w + f[y][j]);}}}int shortestPath(int node1, int node2) {if (f[node1][node2] == INF)return -1;elsereturn f[node1][node2];}
};/*** Your Graph object will be instantiated and called as such:* Graph* obj = new Graph(n, edges);* obj->addEdge(edge);* int param_2 = obj->shortestPath(node1,node2);*/
3. 1462. 課程表IV(中等,floyd可以作為初始化,多次查詢判斷多源點是否可達,不是只能求最短距離)
思想

1.你總共需要上?numCourses?門課,課程編號依次為?0?到?numCourses-1?。你會得到一個數組?prerequisite?,其中?prerequisites[i] = [ai, bi]?表示如果你想選?bi?課程,你?必須?先選?ai?課程。

  • 有的課會有直接的先修課程,比如如果想上課程?1?,你必須先上課程?0?,那么會以?[0,1]?數對的形式給出先修課程數對。
    先決條件也可以是?間接?的。如果課程?a?是課程?b?的先決條件,課程?b?是課程?c?的先決條件,那么課程?a?就是課程?c?的先決條件。
    你也得到一個數組?queries?,其中?queries[j] = [uj, vj]。對于第?j?個查詢,您應該回答課程?uj?是否是課程?vj?的先決條件。
    返回一個布爾數組?answer?,其中?answer[j]?是第?j?個查詢的答案。
    2.首先,這一問乍一眼看是拓撲排序,但拓撲排序是獲得個順序,而此題核心在于多次查詢兩個點是否可達,要簡化查詢的時間。從而多源點想到floyd,其作為初始化時間復雜度為O(n^3),但是查詢只需O(1),所以非常合適,將邊權簡單設置為1即可,只要最短距離不是INF,說明可達。
代碼
class Solution {
public:const int INF = INT_MAX / 2;vector<bool> checkIfPrerequisite(int numCourses,vector<vector<int>>& prerequisites,vector<vector<int>>& queries) {vector<vector<int>> f(numCourses, vector<int>(numCourses, INF));for (int i = 0; i < numCourses; ++i) {f[i][i] = 0;}for (auto& e : prerequisites) {int x = e[0], y = e[1];f[x][y] = 1; // 假設邊權位1}for (int k = 0; k < numCourses; ++k) {for (int i = 0; i < numCourses; ++i) {if (f[i][k] == INF)continue;for (int j = 0; j < numCourses; ++j) {f[i][j] = min(f[i][j], f[i][k] + f[k][j]);}}}vector<bool> res;for (auto& q : queries) {int x = q[0], y = q[1];// 利用floyd求出來的f數組判斷是否可達if (f[x][y] == INF)res.push_back(false);elseres.push_back(true);}return res;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96117.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96117.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96117.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot + Apache Tika 從文件或文件流中提取文本內容

應用效果&#xff1a;1、安裝 Apache Tika 依賴pom.xml<!-- Apache Tika 從文件中提取結構化文本和元數據 --><dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>2.9.2</version>&l…

qqq數據結構補充

1.緒論1.存儲方式順序存儲&#xff1a;邏輯相鄰&#xff0c;物理相鄰鏈式存儲&#xff1a;邏輯相鄰&#xff0c;物理不一定相鄰2.線性表1.順序表1.不可擴容數組寫一個順序表1.在頭文件中應有#pragam once&#xff0c;防止頭文件多次編譯&#xff1b;如果頭文件多次編譯&#x…

Anaconda與Jupyter 安裝和使用

Anaconda內部集成了很多科學計算包&#xff0c;并且可以實現環境隔離 1. 安裝Anaconda 定義&#xff1a;Anaconda是一個集成的Python發行版&#xff0c;專為數據科學、機器學習和AI開發而設計。它包含了常用的Python庫、包管理工具&#xff08;Conda&#xff09;和Jupyter No…

5.后臺運行設置和包設計與實現

程序的入口點(想讓其后臺默認.exe進程運行)也可以不通過vs設置也可以通過定義預處理設置第三種就是沒有窗口的變成后臺運行的了 處理client傳來的數據包 第一步&#xff1a;咱們怎么設計一種包呢&#xff1f;FEFF在網絡環境里面出現的概率低所以就采用這個 自己數據包截斷了&am…

【開題答辯全過程】以 基于微信小程序校園綜合服務平臺的設計與實現為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

地級市人口集聚、經濟集聚、產業集聚與綠色經濟效率匹配數據(含區域經濟研究相關的控制變量,Excel|shp|免費數據)

D006 地級市人口集聚、經濟集聚、產業集聚與綠色經濟效率匹配數據&#xff08;含區域經濟研究相關的控制變量&#xff0c;Excel|shp|免費數據&#xff09;數據簡介今天我們分享的數據是2004-2020年地級市人口聚集、經濟聚集與綠色經濟效率匹配數據&#xff0c;并對其進行可視化…

視覺SLAM第7講:視覺里程計2(3D-2D:PnP、3D-3D:ICP)

接上文&#xff0c;視覺SLAM第7講&#xff1a;視覺里程計1&#xff08;特征點法、2D-2D對極約束&#xff09;&#xff0c;本節主要學習3D-2D:PnP、3D-3D:ICP。 目錄 7.7 3D-2D:PnP 7.7.1 直接線性變換&#xff08;DLT&#xff09; 7.7.2 P3P 1.原理 2.小結 7.7.3 最小化重…

友元的功能解析

目錄 一、友元的作用 二、實例說明 1. 友元方法 例&#xff1a; 2.友元類 例&#xff1a; 三、注意事項 一、友元的作用 1. 可以讓一個類外 函數 或 類對象 訪問一個 類內私有 成員或方法。 二、實例說明 1. 友元方法 例&#xff1a; 用friend 關鍵字在Tom 類中聲明…

GNSS校準氣壓計

1、gnss信號較好的時候得到的GNSS高&#xff0c;得到海拔高。2、氣壓計數據轉到標準數據然后計算出來海拔高。3、gnss高作基準 - 氣壓高 高差 &#xff1b;需要修正的是氣壓偏差&#xff0c;那么如何得到氣壓偏差1&#xff09;用gnss高 反求出一個氣壓&#xff0c;這個氣壓與…

基于Springboot + vue3實現的校園二手交易平臺

項目描述本系統包含管理員、用戶兩個角色。管理員角色&#xff1a;用戶管理&#xff1a;管理系統中所有用戶的信息&#xff0c;包括添加、刪除和修改用戶。配置管理&#xff1a;管理系統配置參數&#xff0c;如上傳圖片的路徑等。權限管理&#xff1a;分配和管理不同角色的權限…

新型存儲介質應用:CXL內存擴展技術與AI工作負載適配

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;AI計算的內存瓶頸挑戰 當前AI技術發展正面臨著一…

Java 多線程(二)

目錄synchronized刷新內存synchronized的特性可重入的出現死鎖的情況如何避免死鎖&#xff08;重點&#xff0c;死鎖的成因和解決&#xff09;volatile關鍵字wait和notify多線程的代碼案例餓漢模式和懶漢模式的線程安全問題指令重排序問題阻塞隊列使用自己實現一個阻塞隊列實現…

MySql 內外連接

1.內連接內連接實際上就是利用where子句對兩種表形成的笛卡兒積進行篩選&#xff0c;我們前面學習的查詢都是內連 接&#xff0c;也是在開發過程中使用的最多的連接查詢。 語法&#xff1a;select 字段 from 表1 inner join 表2 on 連接條件 and 其他條件&#xff1b;備注&…

【大前端】 斷點續傳 + 分片上傳(大文件上傳優化) 的前端示例

寫一個 斷點續傳 分片上傳&#xff08;大文件上傳優化&#xff09; 的前端示例。這樣即使網絡中斷&#xff0c;文件也可以從已上傳的部分繼續傳&#xff0c;不需要重新傳整個大文件。&#x1f539; 分片上傳 斷點續傳思路分片切割&#xff1a;把大文件切成固定大小的小塊&…

機器學習的發展與應用:從理論到現實

目錄 引言 一、機器學習的發展歷程 1. 萌芽階段&#xff08;1950s–1970s&#xff09; 2. 符號主義與統計學習階段&#xff08;1980s–1990s&#xff09; 3. 數據驅動與算法突破&#xff08;2000s–2010s&#xff09; 4. 深度學習崛起&#xff08;2012年至今&#xff09; …

Python實現訊飛星火大模型Spark4.0Ultra的WebSocket交互詳解

核心架構設計與初始化機制 代碼采用面向對象的設計模式構建了Ws_Param類作為核心配置載體。該類在初始化時接收四個關鍵參數:APPID(應用標識)、APIKey(接口密鑰)、APISecret(簽名秘鑰)和Spark_url(服務端點地址)。通過urlparse模塊解析URL結構,分離出主機名(host)與…

如何通過Linux在高通躍龍QCS6490 平臺上優化部署AI/ML模型?

簡介 高通于今年推出了高通躍龍&#xff0c;在邊緣提供前沿的AI性能和超低延遲&#xff0c;為可擴展的工業創新帶來新的可能性。研華已在各種規格尺寸的嵌入式方案中采用躍龍技術&#xff0c;包括由高通躍龍 QCS6490處理器支持的嵌入式模塊、單板電腦和AI攝像頭解決方案。研華…

MySQL內核革新:智能攔截全表掃描,百度智能云守護數據庫性能與安全

在日常數據庫運維中&#xff0c;“掃表風暴”數次悄然而至——某條未走索引的 SQL 突然執行全表掃描&#xff0c;短短幾分鐘內吃光 IO、拖高 CPU&#xff0c;最終引發集群抖動甚至服務不可用。這樣的事故&#xff0c;你是否也曾經歷過&#xff1f; 全表掃描&#xff08;Full Ta…

TCP 三次握手、四次揮手

三次握手 三次握手形象版&#xff0c;快速理解 deepseek 的象形比喻&#xff1a;三次握手建立連接就像打電話一樣&#xff1a; (1) A 打給 B&#xff0c;“喂&#xff0c; 你能聽到我說話嗎&#xff1f;” (2) B 回答 A&#xff0c;“嗯&#xff0c;可以聽到&#xff0c;你能聽…

數據管理戰略|1概念及組成部分

【小語】前面兩個文章講到了“數據管理戰略數字化轉型、數據驅動”三者之間關系,數字化改革中的原則與邏輯,本節用三次文章學習數據管理戰略內容的組成部分(DAMA數據管理第1章1.2.6節)。 數據戰略 VS 數字化轉型 VS 數據驅動 數據管理戰略|熵減與熵增相容原則 下文為【…