主頁 > 軟體設計 > 初步學習BFS的心得體會

初步學習BFS的心得體會

2021-05-04 09:28:10 軟體設計

BFS問題初探

BFS,BFS,其英文全稱是Breadth First Search,指廣度優先搜索.該類問題利用了STL容器queue--佇列,進行搜索.原理是在保證當前狀態下,將此狀態入佇列,取出此狀態,佇列消除該狀態,再將該狀態往下一步發展的所有可能入佇列,再將每種可能取出,并且將著它所有可能發展的方向入隊,記錄步數,直到得到目的.

要想學會bfs,必須先了解佇列.我將bfs中可能涉及的佇列的函式列舉出來.

1.創建佇列物件:queue<佇列中元素型別>佇列名(佇列名自己取);(ps:對于元素型別,除了int,char以外,自己定義的型別也可以)

2.隊尾添加元素:佇列名.push(元素名);

3.隊首去除元素:佇列名.pop();

4.訪問隊首:佇列名.front();

5.訪問隊尾:佇列名.back();

6.判斷佇列是否為空:佇列名.empty();

7.回傳佇列大小:佇列名.size();

好了,工欲善其事必先利其器,器已在手,我們就可以初步去了解bfs.

下面是第一個例題.


逃亡的奶牛:農夫約翰已被告知一頭逃亡的奶牛的位置,并希望立即將其抓住, 他從數字線上的點N(0≤N≤100,000)開始,而母牛在同一數字線上的點K(0≤K≤100,000)開始, 農夫約翰有兩種運輸方式:步行和傳送,行走:約翰可以在一分鐘內從任意點X移至點X-1或X + 1.傳送:FJ可以在一分鐘內從任意X點移動到2×X點,如果沒有意識到他的追捕能力的母牛完全沒有動彈,那么農夫約翰要花多長時間才能找回它?

輸入

第1行:兩個以空格分隔的整數:N和K

輸出

第1行:農夫約翰用最少的時間(以分鐘為單位)捉住逃犯,

樣本輸入

5 17

樣本輸出

4

ps:農夫約翰到達逃犯的最快方法是沿著以下路線移動:5-10-9-18-17,這需要4分鐘,


我先把我的代碼放出來,再進行講解:

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int vis[100007];
struct john{
	int now,step;//記錄John的位置,步數
};
void bfs(int x,int y){
    john bef,nex;
	queue<john>qu;
	bef.now=x;
	bef.step=0;
	vis[bef.now]=1;//記錄初始狀態
	qu.push(bef);
	while(qu.empty()!=1){
		bef=qu.front();
		qu.pop();
		if(bef.now==y){
			cout<<bef.step;
			return;
		}//退出條件
		//-------------向前一步 
		if(vis[bef.now+1]==0&&((bef.now+1)<=100000)){
			nex.now=bef.now+1;
			nex.step=bef.step+1;
			vis[nex.now]=1;
			qu.push(nex);
		}
		//-------------向后一步
		if(vis[bef.now-1]==0&&((bef.now-1)>=0)){
			nex.now=bef.now-1;
			nex.step=bef.step+1;
			vis[nex.now]=1;
			qu.push(nex);
		}
		//-------------特殊
		if(vis[2*bef.now]==0&&((bef.now*2)>=0)){
			nex.now=bef.now*2;
			nex.step=bef.step+1;
			vis[nex.now]=1;
			qu.push(nex);
		} 
	}
	cout<<"-1";
}
int main(){
	int john,cow;
	memset(vis,0,sizeof(vis));
	cin>>john>>cow;
	bfs(john,cow);
}

然后是問題分析:

入題目所示,農夫有兩種運動方式,最多有三種運動所的結果,為什么是最多呢,因為當約翰在0或者N位置的時候,分別不能往后,往前走,這也是要考慮的條件之一.理解題目所給的追捕方式,無非就是往前一步,往后一步,瞬移到兩倍下標的位置(例如從3直接到6,從2直接到4).了解此問題后,我們直接敲代碼.

首先就是初始處理,關于如何儲存農夫此時的狀態和步數,struct結構體似乎是一個不錯的選擇:

struct john{
    int now;//記錄此時狀態,在某個點
    int step;//記錄從初始位置John走了多少步
};

當然,還有一個問題我沒有提及,就是對于bfs重復的處理,如果john沒睡醒,兩次到達了點5,那是不是其實第二次是完全沒有必要的呢?對,進行第二次的話毫無意義,因為我已經到過該點,后續操作將與第一次完全重合,浪費空間時間,此時我們可以引入一個標記陣列.

int vis[100007];

標記陣列的大小依照題目來看,型別也可以是bool型,只要能達到它的作用,標記john已經到達的位置即可,我們可以設john沒到過的地方為0,當要進行下一步操作時,我們可以判斷,如果vis[下一步到達的地點下標]==0,那么就可以到達此處,并且將該種情況入隊記錄后,將vis[該點下標]更新為1,那么下次到達該點也就不會進行入隊操作.

然后就是進行對john初始狀態的處理,直接用一個結構體將其初始狀態記錄:

    john bef;//此處定義同型別結構體
    queue<john>qu;//創建佇列
    bef.n=x;//將john一開始的位置記錄在結構體里面
    bef.step=0;//此時john還沒有動
    vis[bef.n]=1;//記錄john已經到過該點

記錄完初始狀態,就把他入隊.在進入一個while回圈.該回圈為while(qu.empty()!=1).進入這樣一個回圈是為什么呢?因為我們在此回圈中會將每一種可能進行搜索,如果不符合情況就不會入隊,回圈往復,當搜索多次遇見不能夠入隊的情況,可能是所有的下一步都已經被標記,而qu佇列又需要出隊元素,當佇列為空時,也就說明沒有往下一步的可能了,但是仍然沒有達到目標地,這就是無法到達的情況,當while回圈到佇列了,還未到達,可以按題意輸出NO了.

然后就是退出條件,也就是滿足了題目條件,我們可以取出隊首元素直接與目的地對比,如果相等直接輸出步數,return.

if(bef.now==y){
	cout<<bef.step;
	return;
	}//退出條件

最后需要講解的就是對于每次到達一個點后,他下一步可能到達的地點.

                //向前
                if(vis[bef.now+1]==0&&((bef.now+1)<=100000)){
			nex.now=bef.now+1;
			nex.step=bef.step+1;
			vis[nex.now]=1;
			qu.push(nex);
		}
		//-------------向后一步
		if(vis[bef.now-1]==0&&((bef.now-1)>=0)){
			nex.now=bef.now-1;
			nex.step=bef.step+1;
			vis[nex.now]=1;
			qu.push(nex);
		}
		//-------------特殊
		if(vis[2*bef.now]==0&&((bef.now*2)>=0)){
			nex.now=bef.now*2;
			nex.step=bef.step+1;
			vis[nex.now]=1;
			qu.push(nex);
		} 

可以看到,每次我都進行了vis的判斷,如果沒到過,并且沒有到邊界,我就會進行入隊操作,這里的到邊界,以后很多題會出現,而且更加復雜,這里僅僅要注意在0位置不能往前走,在
N位置不能往后走,這種情況也要重點注意哦.對于后續可能情況處理,我引入了新的結構體變數,nex,他的好處就是我可以保留上一步,也就是bef的狀態,將下一步進行操作(位置的改變,步數的增加,標記點).

這是一個挺簡單的bfs了,bfs的模板基本如此,記錄初始狀態,while回圈,,回圈中退出條件,不能退出就往下一步搜索.其實bfs難點還是在于邊界判斷,標記,往下一步搜索下一步所有的可能性.

下面我再舉兩個題,針對它們的標記和退出條件講解.(畢竟bfs基礎題的話樣子都差不多,不同的就是1退出條件和下一步分支,標記等).


問題描述

有一個奇怪的升降機,升降機可以根據需要停在每個樓層,每個樓層上都有一個數字Ki(0 <= Ki <= N),該升降機只有兩個按鈕:上和下, 在第i層,如果您按“ UP”按鈕,您將在Ki層上,即,您將進入第i + Ki層,同樣,如果您按“ DOWN”按鈕,則將在下層 Ki樓層,即您將進入i-Ki樓層, 當然,電梯不能高于N,不能低于1,例如,有一個5層樓的建筑物,k1 = 3,k2 = 3,k3 = 1,k4 = 2,k5 =5,從1樓開始,您可以按“ UP”按鈕,然后您將上升到4樓,如果您按“ DOWN”按鈕,則電梯不能 它,因為它不能下降到-2樓,如您所知,-2樓不存在,

問題來了:當您在A樓上并且想去B樓時,他至少必須按“上”或“下”按鈕多少次?

輸入

輸入包含多個測驗用例,每個測驗用例包含兩行,

第一行包含上述三個整數N,A,B(1 <= N,A,B <= 200),第二行包含N個整數k1,k2,.... kn,

單個0表示輸入的結尾,

輸出

對于每種輸入輸出情況,整數時,在A樓時必須最少按下一次按鈕,然后才想轉到B樓,如果無法到達B樓,則列印“ -1”,

樣本輸入

5 1 5

3 3 1 2 5

0

樣本輸出

3


本題也是基礎的bfs,可以把上題搞明白后依葫蘆畫瓢,套用模板,注意退出條件,分支可能,標記即可.先上代碼:

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int flo[201];//記錄該層可以操作的層數
int vis[201];//標記是否已經到達
struct floor{
	int now;//現在所處狀態
	int step;//步數
};
void bfs(int N,int A,int B){
	queue<floor>qu;
	floor bef,nex;
	bef.now=A;
	bef.step=0;
	vis[A]==1;//記錄初始狀態
	qu.push(bef);
	while(qu.empty()==0){
		bef=qu.front();
		qu.pop();
		if(bef.now==B){
			printf("%d\n",bef.step);
			return;
		}//退出條件
		else{
			nex.now=bef.now+flo[bef.now];
			if(nex.now<=N&&vis[nex.now]!=1){
				nex.step=bef.step+1;
				vis[nex.now]=1;
				qu.push(nex);
			}//往上走
			nex.now=bef.now-flo[bef.now];
			if(nex.now>=1&&vis[nex.now]!=1){
				nex.step=bef.step+1;
				vis[nex.now]=1;
				qu.push(nex);
			}//往下走
		}
	}
	printf("-1\n");//結果不存在
	return;
}
int main(){
	int N,A,B;//N為共有多少層,A起始,B結尾
	while(scanf("%d",&N)&&N!=0){
	scanf("%d%d",&A,&B);
	memset(vis,0,sizeof(vis));//初始化標記陣列
	for(int i=1;i<=N;i++){
		scanf("%d",&flo[i]);//記錄每一層可以上下的層數
	}
	bfs(N,A,B);
	}
}

該題有一個陣列,用來存樓層上可運算元,我之前提到過可以套模板,但是切忌生搬硬套,仔細審題后,將題目任務拆分逐步實作,不能漏下一個,這也是我寫代碼的思想.

針對該題與上題有一個點要注意一下,多組資料的讀入,如果粗心會發生一個問題,忘記將vis陣列初始化而對下一組資料進行搜索,這樣很可能導致可以到達目的地的代碼無法搜索到最后,因為你上一組的標記沒洗掉,令這組本該到達的地方沒有到達,一定要注意,細節決定成敗,bfs代碼初學可能較長,不注重細節幾百行debug到頭顱爆炸.

memset(vis,0,sizeof(vis));//初始化標記陣列
//每次回圈都要初始化

注意本題也有邊界,需要判斷下一步到達的樓層到底存不存在.

然后就是最后一個題:


Problem Description

大家一定覺的運動以后喝可樂是一件很愜意的事情,但是seeyou卻不這么認為,因為每次當seeyou買了可樂以后,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多,但seeyou的手中只有兩個杯子,它們的容量分別是N 毫升和M 毫升 可樂的體積為S (S<101)毫升 (正好裝滿一瓶) ,它們三個之間可以相互倒可樂 (都是沒有刻度的,且 S==N+M,101>S>0,N>0,M>0) ,聰明的ACMER你們說他們能平分嗎?如果能請輸出倒可樂的最少的次數,如果不能輸出"NO",

Input

三個整數 : S 可樂的體積 , N 和 M是兩個杯子的容量,以"0 0 0"結束,

Output

如果能平分的話請輸出最少要倒的次數,否則輸出"NO",

Sample Input

7 4 3

4 1 3

0 0 0

Sample Output

NO

3


該題比較麻煩的就是每次倒可樂后下一種可能的分支,可能有六種,s->n,s->m,n->s,n->m,m->s,m->n.每一種情況都不能漏,目前有兩個思路,1.直接將每種情況列舉,2.建立兩個小陣列,分別將每次的s,m,n中可樂可能情況存入,再使用for回圈倒水(此代碼我的學長已經實作,我還沒寫出來).我采用的第一種方法.第二個難點就是標記,三個容器如何標記?因為本題資料不算太大,我采用了三維陣列vis[101][101][101],陣列長度沒有超過1e8.代碼呈現如下:

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int vis[101][101][101];//標記狀態
struct kola{
	int s;
	int n;
	int m;//s,n,m中可樂量
	int step;//步數
};
bool che(kola bef){
	if((bef.m==bef.n)&&bef.s==0)return false;
	else if((bef.m==bef.s)&&bef.n==0)return false;
	else if((bef.s==bef.n)&&bef.m==0)return false;
	else return true;
}//退出條件封裝函式,當三者之中一個空,兩個相等,即可停止搜索.
void bfs(int S,int N,int M){
	int a,b,c;
	memset(vis,0,sizeof(vis));
	queue<kola>qu;
	kola bef,nex;
	bef.s=S;
	bef.m=0;
	bef.n=0;
	bef.step=0;
	vis[bef.s][bef.n][bef.m]=1;//記錄初始狀態
	qu.push(bef);
	while(qu.empty()!=1){
		bef=qu.front();
		qu.pop();
		a=bef.s;
		b=bef.n;
		c=bef.m;//abc比較短,方便記錄,平時不建議寫這種變數名,變數名一多容易搞混
		if(che(bef)==false){
			printf("%d\n",bef.step);
			return;
		}
	//--從S倒---------------------------------------------//
		if(N-b>=a&&vis[0][a+b][c]==0){
			qu.push({0,a+b,c,bef.step+1});
			vis[0][a+b][c]=1;
		}                                     //可以將s全部倒進n
		
                else if(N-b<a&&vis[a-(N-b)][N][c]==0){
			qu.push({a-(N-b),N,c,bef.step+1});
			vis[a-(N-b)][N][c]=1;        //不可以將s全部倒進n

		}//-------------------------------s向n倒水
		if(M-c>=a&&vis[0][b][a+c]==0){
			qu.push({0,b,a+c,bef.step+1});
			vis[0][b][a+c]=1;
		}                                     //可以將s全部倒進m

		else if(M-c<a&&vis[a-(M-c)][b][M]==0){
			qu.push({a-(M-c),b,M,bef.step+1});
			vis[a-(M-c)][b][M]=1;         //不可以將s全部倒進n(ps:下面兩段與上面幾乎相同)

		}//--------------------------------s向m倒水
        //--從N倒----------------------------------------------//
		if(S-a>=b&&vis[a+b][0][c]==0){
			qu.push({a+b,0,c,bef.step+1});
			vis[a+b][0][c]=1;
		}
		else if(S-a<b&&vis[S][b-(S-a)][c]==0){
			qu.push({S,b-(S-a),c,bef.step+1});
			vis[S][b-(S-a)][c]=1;
		}//--------------------------------n向s倒水
		if(M-c>=b&&vis[a][0][b+c]==0){
			qu.push({a,0,b+c,bef.step+1});
			vis[a][0][b+c]=1;
		}
		else if(M-c<b&&vis[a][b-(M-c)][M]==0){
			qu.push({a,b-(M-c),M,bef.step+1});
			vis[a][b-(M-c)][M]=1;
		}//--------------------------------n向m倒水
	//--從M倒---------------------------------------------//
		if(S-a>=c&&vis[a+c][b][0]==0){
			qu.push({a+c,b,0,bef.step+1});
			vis[a+c][b][0]=1;
		}
		else if(S-a<c&&vis[S][b][c-(S-a)]==0){
			qu.push({S,b,c-(S-a),bef.step+1});
			vis[S][b][c-(S-a)]=1;
		}//---------------------------------m向s倒水
		if(N-b>=c&&vis[a][b+c][0]==0){
			qu.push({a,b+c,0,bef.step+1});
			vis[a][b+c][0]=1;
		}
		else if(N-b<c&&vis[a][N][c-(N-b)]==0){
			qu.push({a,N,c-(N-b),bef.step+1});
			vis[a][N][c-(N-b)]=1;
		}//--------------------------------m向n倒水
		
//-------------------------------------------------//
		
	}
	printf("NO\n");
	return;//沒有可能相等
}
int main(){
	int S,N,M;
	while(scanf("%d%d%d",&S,&N,&M)&&N!=0){
	bfs(S,N,M);
	}
}

當把s向n,m倒可樂寫出來了,可以直接復制粘貼然后改資料寫出所有情況.(類比)

bfs比較注重于考驗細心(個人觀點),你要考慮到是否有邊界,如何標記,一共有多少種情況......當然,在完成基本代碼后可以進行優化,就像剛才倒可樂的題目,第二種思想大家也可以思考一下.

我也是個初學者,這是第一次寫博客,下次會嘗試寫一下dfs,有什么不足希望大家指出來.qwq

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/282652.html

標籤:其他

上一篇:Redis資料庫(一)——Redis簡介、部署及常用命令

下一篇:C++--繼承(繼承的概念與定義、派生類默認成員函式、菱形繼承及菱形虛擬繼承)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more