用邻接矩阵创建有向网,求最小生成树,最短路径(c语言)。

大神求解!!!用邻接矩阵法创建一个有向网,将有向边直接视为无向边后,得到对应的无向图,则利用Prim算法求取最小生成树MST;利用Dijkstra算法对无向图求取顶点V1对图中其余各点的最短路径。(c语言)
图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
新手求图的最小生成树,求指点.
#include<stdio.h> #include<stdlib.h> #define Infinity 32768 #define OK 1 #define Error -1 #define True 1 #define False 0 #define MAX_VERTEX_NUM 10 typedef enum{DG,DN,UDG,UDN}GraphKind; /*图的种类分别为有向图,有向网,无向图,无向网*/ typedef char VertexData; typedef struct ArcNode {int adj; }ArcNode; typedef struct {VertexData vertex[MAX_VERTEX_NUM]; ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vexnum,arcnum; /*图的顶点数和弧数*/ GraphKind kind; }AdjMatrix; struct Record{ char adjvex; // U集中的顶点 int lowcost; // 边的权值 }closedge[MAX_VERTEX_NUM]; int LocateVertex(AdjMatrix *G,VertexData v)/*求顶点位置函数*/ {int j=Error,k; for(k=0;k<G->vexnum;k++) if(G->vertex[k]==v) {j=k;break; } return(j); } int CreateDN(AdjMatrix *G) /*创建一个有向网*/ {int i,j,k,weight;VertexData v1,v2; printf("请输入两个数字表示弧数和顶点数\n"); fflush(stdin); /*清空输入缓冲区*/ scanf("%d,%d",&G->arcnum,&G->vexnum); for(i=0;i<G->vexnum;i++) /*初始化邻接矩阵*/ for(j=0;j<G->vexnum;j++) G->arcs[i][j].adj=Infinity; for(i=0;i<G->vexnum;i++) { printf("请输入图的顶点\n"); fflush(stdin); scanf("%c",&G->vertex[i]); } for(k=0;k<G->arcnum;k++) {printf("请输入一条弧的两个顶点及权值\n"); fflush(stdin); scanf("%c,%c,%d",&v1,&v2,&weight); i=LocateVertex(G,v1); j=LocateVertex(G,v2); G->arcs[i][j].adj=weight; /*建立弧*/ } return(OK); } int Minimum (Record closedge[]) {int reserve=Infinity; int min; for(int i=1;i<MAX_VERTEX_NUM;i++) { if(closedge[i].lowcost<reserve&&closedge[i].lowcost>0)//没有访问过但是存路径 { reserve=closedge[i].lowcost; min=i; } } return min; } void Print(AdjMatrix *G,char u,char v) {int start,end; start=LocateVertex(G,u); end=LocateVertex(G,v); printf("%c到%c的权值为%d",u,v,G->arcs[start][end]); } void MiniSpanTree_Prim(AdjMatrix &gn,char u)/*从顶点u出发,按普里姆算法构造连通网gn的最小生成树,并输出生成树的每条边*/ {int i,e; closedge[u].lowcost=0; /*初始化,U={u}*/ for(i=0;i<gn.vexnum;i++) if(i!=u) /*对V-U中的顶点i,初始化closedge[i]*/ {closedge[i].adjvex=u; closedge[i].lowcost=gn.arcs[u][i].adj; } for(e=1;e<=gn.vexnum-1;e++) /*找n-1条边(n=gn.vexnum*/ {int v=Minimum(closedge); /*closedge[v]中存有当前最小边(u,v)的信息*/ u=closedge[v].adjvex; /*u属于U*/ Print(&gn,u,v); /*输出生成树的当前最小边(u,v)*/ closedge[v].lowcost=0; /*将顶点v纳入U的集合*/ for(i=0;i<gn.vexnum;i++) /*在顶点v并入U之后,更新closedge[i]*/ if(gn.arcs[v][i].adj<closedge[i].lowcost) {closedge[i].lowcost=gn.arcs[v][i].adj; closedge[i].adjvex=v; } } } int main() {AdjMatrix G; CreateDN(&G); char first; printf("请输入第一个访问的结点\n"); scanf("%c",&first); MiniSpanTree_Prim(G,first); return 0; } Print函数和那个MiniSpanTree_Prim函数有问题谁帮忙看下。
数据结构关于图的小错误
#include<stdio.h> #include<stdlib.h> #define Infinity 32768 #define OK 1 #define Error -1 #define True 1 #define False 0 #define MAX_VERTEX_NUM 10 typedef enum{DG,DN,UDG,UDN}GraphKind; /*图的种类分别为有向图,有向网,无向图,无向网*/ typedef char VertexData; typedef struct ArcNode {int adj; }ArcNode; typedef struct {VertexData vertex[MAX_VERTEX_NUM]; ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vexnum,arcnum; /*图的顶点数和弧数*/ GraphKind kind; }AdjMatrix; struct Record{ char adjvex; // U集中的顶点 int lowcost; // 边的权值 }closedge[MAX_VERTEX_NUM]; int LocateVertex(AdjMatrix *G,VertexData v)/*求顶点位置函数*/ {int j=Error,k; for(k=0;k<G->vexnum;k++) if(G->vertex[k]==v) {j=k;break; } return(j); } int CreateDN(AdjMatrix *G) /*创建一个有向网*/ {int i,j,k,weight;VertexData v1,v2; printf("请输入两个数字表示弧数和顶点数\n"); fflush(stdin); /*清空输入缓冲区*/ scanf("%d,%d",&G->arcnum,&G->vexnum); for(i=0;i<G->vexnum;i++) /*初始化邻接矩阵*/ for(j=0;j<G->vexnum;j++) G->arcs[i][j].adj=Infinity; for(i=0;i<G->vexnum;i++) printf("请输入图的顶点\n"); fflush(stdin); scanf("%c",&G->vertex[i]); for(k=0;k<G->arcnum;k++) {printf("请输入一条弧的两个顶点及权值\n"); fflush(stdin); scanf("%c,%c,%d",&v1,&v2,&weight); i=LocateVertex(G,v1); j=LocateVertex(G,v2); G->arcs[i][j].adj=weight; /*建立弧*/ } return(OK); } int Minimum (Record closedge[]) {int reserve=Infinity; int min; for(int i=1;i<MAX_VERTEX_NUM;i++) { if(closedge[i].lowcost<reserve&&closedge[i].lowcost>0)//没有访问过但是存路径 { reserve=closedge[i].lowcost; min=i; } } return min; } MiniSpanTree_Prim(AdjMatrix &gn,char u)/*从顶点u出发,按普里姆算法构造连通网gn的最小生成树,并输出生成树的每条边*/ {int i,e; closedge[u].lowcost=0; /*初始化,U={u}*/ for(i=0;i<gn.vexnum;i++) if(i!=u) /*对V-U中的顶点i,初始化closedge[i]*/ {closedge[i].adjvex=u; closedge[i].lowcost=gn.arcs[u][i].adj; } for(e=1;e<=gn.vexnum-1;e++) /*找n-1条边(n=gn.vexnum*/ {int v=Minimum(closedge); /*closedge[v]中存有当前最小边(u,v)的信息*/ u=closedge[v].adjvex; /*u属于U*/ printf("%c,%c",u,v); /*输出生成树的当前最小边(u,v)*/ closedge[v].lowcost=0; /*将顶点v纳入U的集合*/ for(i=0;i<gn.vexnum;i++) /*在顶点v并入U之后,更新closedge[i]*/ if(gn.arcs[v][i].adj<closedge[i].lowcost) {closedge[i].lowcost=gn.arcs[v][i].adj; closedge[i].adjvex=v; } } } int main() {AdjMatrix G; CreateDN(&G); char first=' '; printf("请输入第一个访问的结点\n"); scanf("%c",&first); MiniSpanTree_Prim(G,first) ; return 0; } 出现这个错误\Users\Administrator\Desktop\3.2.cpp 69 C:\Users\Administrator\Desktop\C [Error] ISO C++ forbids declaration of `MiniSpanTree_Prim' with no type
求求。怎么在里面插入拓补排序。
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; int n = 0; int a[100][100]; int menu() { int m; printf(" 求最小生成树\n"); printf(" ________________________________\n\n"); printf(" 1 输入城市之间的信息\n"); printf(" 2 判断是否能构成一个最小生成树\n"); printf(" 3 查询信息\n"); printf(" 4 退出\n"); printf(" ________________________________\n\n"); printf(" 请输入所选功能1--4\n"); scanf("%d",&m); return m; } void xin_input() { printf("1 遍历所有城市的最小生成树\n"); printf("2 查询两个城市之间的距离\n"); printf("3 退出\n"); //printf("________________________________\n\n"); } //以下为克鲁斯卡尔算法 typedef struct node //构造一个结构体,两个城市可以看成起点和终点,之间的路道可以看成一个边 { int st; //起点 int ed; //终点 int dis;//距离 }node; node p[1000]; int pre[1000],rank[1000]; bool cmp(node p1,node p2) { return p1.dis < p2.dis; } //下面三个函数是并查集,其作用是检验当一条边添加进去,是否会产生回路 void set(int x) { pre[x] = x;//初始化 rank[x] = 0; } int find(int x)//找到这个点的祖先 { if(x != pre[x]) pre[x] = find(pre[x]); return pre[x]; } void Union(int x,int y)//将这两个添加到一个集合里去 { x = find(x); y = find(y); if(rank[x] >= rank[y]) { pre[y] = x; rank[x] ++; } else pre[y] = x; } void Kruskal() // { int ans = 0,i,j,k = 0; for(i = 1;i <= n;i ++) set(i); for(i = 1;i <= n;i ++) for(j = i + 1;j <= n;j ++) { p[++k].st = i; p[k].ed = j; p[k].dis = a[i][j]; //先把所有城市之间的路段看成一个边 } sort(p + 1,p + k + 1,cmp);//把所有的边按从小到大进行排序 int count = 0; for(i = 1;i <= k;i ++) { if(find(p[i].st) != find(p[i].ed))//如果这两点连接在一起不构成一个回路,则执行下面操作 { printf("第%d条路段为:%d--%d,权值为%d\n",++ count,p[i].st,p[i].ed,p[i].dis);//将这条边的起点、终点打印出来 ans += p[i].dis; //说明这条路段要用 Union(p[i].st,p[i].ed); } } printf("遍历所有城市的最短路程为: %d\n",ans);//最短遍历的路程 //printf("________________________________\n"); } //普里姆算法 int prim() { int close[100],low[100],i,j,ans = 0;//close[j]表示离j最近的顶点,low[j]表示离j最短的距离 bool use[100]; use[1] = 1; for(i = 2;i <= n;i ++) { low[i] = a[1][i]; //初始化 close[i] = 1; use[i] = 0; } for(i = 1;i < n;i ++) { int min = 100000000,k = 0; for(j = 2;j <= n;j ++) { if(use[j] == 0 && min > low[j])//找到最小的low[]值,并记录 { min = low[j]; k = j; } } //printf("%d %d\n",close[k],k); for(j = 2;j <= n;j ++) { if(use[j] == 0 && low[j] > a[k][j]) { low[j] = a[k][j]; //修改low[]值和close[]值 close[j] = k; } } ans += a[close[k]][k]; } return ans; } //求最短路径-单源点到其余点的最短路径(Dijkstra算法) void ShortestPath_DIJ(int x,int y) //X指单源点,y指目标点 { int i,d[100],j; bool use[100]; for(i = 1;i <= n;i ++) { use[i] = 0; //初始化 d[i] = a[x][i]; } use[x] = 1;//这个点肯定用过 d[x] = 0; for(i = 1;i < n;i ++)//执行n-1次操作 { int min = 100000000,v; for(j = 1;j <= n;j ++) { if(use[j] == 0 && min > d[j])//找出最短距离的 { min = d[j]; v = j; } } use[v] = 1; for(j = 1;j <= n;j ++) { if(use[j] == 0 && d[j] > min + a[v][j])//修改d[]的值 { d[j] = min + a[v][j]; } } } printf("%d城市到城市%d的最短距离为: %d\n",x,y,d[y]); } //求每一对顶点之间的最短路径(Floyd算法) int b[100][100]; void ShortestPath_FLOYD() //这个算法耗时多(n^3),不过容易理解 { int i,j,k; for(i = 1;i <= n;i ++) for(j = 1;j <= n;j ++) b[i][j] = a[i][j]; //先b[][]进行保存,避免a[][]的值发生变化 for(k = 1;k <= n;k ++) for(i = 1;i <= n;i ++) for(j = 1;j <= n;j ++) if(b[i][j] > b[i][k] + b[k][j]) b[i][j] = b[i][k] + b[k][j]; while(1) { int st,ed; printf("请输入两个城市的编号:\n");//对此进行多次操作 scanf("%d%d",&st,&ed); printf("%d 城市到 %d 城市的最短距离为: %d\n",st,ed,b[st][ed]); //printf("________________________________\n"); char str[100]; printf("是否要继续? yes or no\n"); scanf("%s",str); if(strcmp(str,"no") == 0) { //printf("________________________________\n"); break; } } } void shuru()//输入城市信息 { int i,j; if(n != 0) { char str[100]; printf("是否要确定输入新的城市之间的信息? yes or no ?\n"); scanf("%s",str); if(strcmp(str,"no") == 0) { return ; } } printf("请输入城市的个数:\n"); scanf("%d",&n); printf("输入%d个城市的邻接矩阵:\n",n); for(i = 1;i <= n;i ++) { for(j = 1;j <= n;j ++) scanf("%d",&a[i][j]); } //printf("________________________________\n"); } void chaxun() //一个查徇两个城市最短径的操作 { while(1) { int t1,t2; printf("输入第一个城市的编号:\n"); scanf("%d",&t1); printf("输入第二个城市的编号:\n"); scanf("%d",&t2); ShortestPath_DIJ(t1,t2);//调用 char str[100]; printf("是否要继续? yes or no\n"); scanf("%s",str); if(strcmp(str,"no") == 0) { //printf("________________________________\n"); break; } } } void chaxun_func() { if(n == 0) { printf("这里没有城市之间的信息\n"); return; } xin_input(); printf("请选择以上功能:1-3\n"); int m1; scanf("%d",&m1); printf("\n"); if(m1 == 1) Kruskal(); else if(m1 == 2) { chaxun(); } //else // break; } void judge() { int ans; ans = prim(); if(ans >= 100000000) printf("不能构成最小生成树\n"); else printf("能构成最小生成树\n"); } int main() { while(1) { switch(menu()) { case 1:shuru();break; case 2:judge();break; case 3: chaxun_func();break; case 4:goto loop; } } loop:; return 0; }
旅游管理系统小软件的bug求找一下
创建景点后,检测效果图 路径全替换为最大值,游客界面也无法查询线路,求指导一下谢谢 源代码 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define MaxSize 100 #define Max 32767 //////////////////////邻接表 typedef struct ArcNode { int adjvex; int info; ///////标志是否被访问过 int weight; struct ArcNode *nextarc; }ANode; typedef struct { int info; ///////标志是否被访问过 char name[50]; ANode *firstarc; }VNode, AdjList[MaxSize]; typedef struct { AdjList vertices; int vexnum, arcnum; }ALGraph; ////////////////////////邻接矩阵 typedef struct { int weight; int info; ///////0,表示无路径,1表示有路径 } AdjMatrix[MaxSize][MaxSize]; typedef struct { char names[MaxSize][50]; AdjMatrix arcs; int vexnum, arcnum; }MGrph; //////////////////////////////最短路径结点 typedef struct { int info; int weight; }MinW; ///////////////////////////拓扑排序用栈 typedef struct { VNode *Topo[MaxSize]; int top; }TP; //////////////////深度遍历生成树 typedef struct csnode { int num; struct csnode *firstchild, *nextsibling; }csnode, *cstree; int visited[MaxSize]; ////////////////////////函数部分 void Create(ALGraph *tu)//建立邻接链表 { int i; int shi, zhong, weight; ANode *p; printf("请输入景点数:"); scanf("%d", &tu->vexnum); printf("请输入道路数:"); scanf("%d", &tu->arcnum); for (i = 0; i<tu->vexnum; i++) { printf("请输入第个%d景点名:", i + 1); scanf("%s", tu->vertices[i].name); tu->vertices[i].firstarc = NULL; } for (i = 0; i<tu->arcnum; i++) { printf("请选择输入路径,形如(1 3)(从景点一到景点三):");//一条路径的起点和终点 scanf("%d%d", &shi, &zhong); printf("请输入该条路径的长度:"); scanf("%d", &weight); p = (ANode *)malloc(sizeof(ANode)); p->adjvex = zhong; p->weight = weight; p->nextarc = tu->vertices[shi].firstarc; tu->vertices[shi].firstarc = p; p = (ANode *)malloc(sizeof(ANode)); p->adjvex = shi; p->weight = weight; p->nextarc = tu->vertices[zhong].firstarc; tu->vertices[zhong].firstarc = p; } printf("创建完成!\n"); } void Rclear(MGrph *Ttu)//初始化邻接矩阵,(路径数与景点数已知)将矩阵路径长度初始化为Max,标志位初始化为0 { int i, j; for (i = 0; i<Ttu->vexnum; i++) for (j = 0; j<Ttu->vexnum; j++) { Ttu->arcs[i][j].weight = Max; Ttu->arcs[i][j].info = 0; } } void Turn(ALGraph *tu, MGrph *Ttu)//将邻接链表转换成邻接矩阵 { int i, j; ANode *p; Ttu->arcnum = tu->arcnum; Ttu->vexnum = tu->vexnum; Rclear(Ttu); for (i = 0; i<Ttu->vexnum; i++) strcpy(Ttu->names[i], tu->vertices[i].name); for (j = 0; j<tu->vexnum; j++) { p = tu->vertices[j].firstarc; while (p != NULL) { Ttu->arcs[j][p->adjvex].weight = p->weight; Ttu->arcs[j][p->adjvex].info = 1; p = p->nextarc; } } /* for(i=0;i<tu->vexnum;i++) { for(j=0;j<tu->vexnum;j++) printf("%d\t",Ttu->arcs[i][j].weight); printf("\n"); }*/ for (i = 0; i <= tu->vexnum; i++) { for (j = 0; j <= tu->vexnum; j++) { if (i == 0 && j == 0) { printf("\t"); } if (i == 0) { if (j != 0) { printf("景点%s\t", tu->vertices[j - 1].name); } } else { if (j == 0) { printf("景点%s\t", tu->vertices[i - 1].name); } else printf("%d\t", Ttu->arcs[i - 1][j - 1].weight); } }printf("\n"); } } void Rset(ALGraph *tu)//将邻接表中结点的标志以及边的标志初始化为0(路径数与景点数已知) { int i, j; ANode *p; for (i = 0; i<tu->vexnum; i++) tu->vertices[i].info = 0; for (j = 0; j<tu->vexnum; j++) { p = tu->vertices[j].firstarc; while (p != NULL) { p->info = 0; p = p->nextarc; } } } void Rbuild(ALGraph *tu)//景点规划(最小生成树) { int n, i, j, Min; ANode *p, *qin; MGrph GG; GG.arcnum = 0; GG.vexnum = 0; int min[MaxSize]; ALGraph *MinTree; MinTree = (ALGraph *)malloc(sizeof(ALGraph)); MinTree->vexnum = tu->vexnum; MinTree->arcnum = tu->vexnum - 1; Rset(tu); for (i = 0; i<tu->vexnum; i++) { min[i] = Max; strcpy(MinTree->vertices[i].name, tu->vertices[i].name); MinTree->vertices[i].firstarc = NULL; } printf("请选择做为入口的景点标号(1— %d):", tu->vexnum); scanf("%d", &n); for (i = 0; i<tu->vexnum; i++) { tu->vertices[n - 1].info = 1; Min = Max; p = tu->vertices[n - 1].firstarc; while (p != NULL) { if (min[p->adjvex]>p->weight) { min[p->adjvex] = p->weight; qin = (ANode *)malloc(sizeof(ANode)); qin->adjvex = n - 1; qin->weight = p->weight; qin->nextarc = NULL; MinTree->vertices[p->adjvex].firstarc = qin; } p = p->nextarc; } for (j = 0; j<tu->vexnum; j++) if (Min>min[j] && (tu->vertices[j].info != 1)) { Min = min[j]; n = j + 1; } } Turn(MinTree, &GG); } void DFSTree(ALGraph *tu, int v, cstree &T) { int first, w = -1; ANode *d; d = NULL; cstree p, q; visited[v] = 1; first = 1; T->num = v; if (tu->vertices[v].firstarc) d = tu->vertices[v].firstarc; for (; d; d = d->nextarc) { w = d->adjvex; if (!visited[w]) { p = (cstree)malloc(sizeof(csnode)); p->num = w; p->firstchild = NULL; p->nextsibling = NULL; if (first) { T->firstchild = p; first = 0; } else q->nextsibling = p; q = p; DFSTree(tu, w, q); } } } int Gshow(cstree T, int &f) { if (T) { printf("%d\n", T->num); if (T->nextsibling) { printf("有回路,下面进入人工选择!"); f = 1; return 0; } else if (T->firstchild) Gshow(T->firstchild, f); } return 1; } void minway(MGrph *Ttu) { MinW min[MaxSize]; int flags[MaxSize]; int i, mi, n, j, pre; printf("请输入您当前所在景点位置标号:\n"); scanf("%d", &n); for (i = 0; i<Ttu->vexnum; i++) { flags[i] = 0; min[i].info = n; min[i].weight = Ttu->arcs[n][i].weight; } flags[n] = 1; int k = n; for (i = 1; i<Ttu->vexnum; i++) { mi = Max; for (j = 0; j<Ttu->vexnum; j++) if (flags[j] == 0 && mi>min[j].weight) { mi = min[j].weight; pre = j; } min[pre].info = k; flags[pre] = 1; k = pre; for (j = 0; j<Ttu->vexnum; j++) if (flags[j] == 0 && (min[pre].weight + Ttu->arcs[pre][j].weight<min[j].weight)) { min[j].weight = min[pre].weight + Ttu->arcs[pre][j].weight; min[j].info = pre; } } printf("请输入目标位置:\n"); scanf("%d", &n); printf("您距离目标%d,您将由%d位置走向目标。\n", min[n].weight, min[n].info); } void Guide(ALGraph *tu, MGrph *Ttu) { int n; int f = 0; cstree T; T = (cstree)malloc(sizeof(csnode)); T->firstchild = NULL; T->nextsibling = NULL; Rset(tu); printf("请选择您所在景点(1 — %d):", tu->vexnum); scanf("%d", &n); DFSTree(tu, n - 1, T); Gshow(T, f); if (f == 1) minway(Ttu); } void main() { ALGraph G; MGrph TG; int f = 0; int key = 0; int ch; G.arcnum = 0; G.vexnum = 0; TG.arcnum = 0; TG.vexnum = 0; while (key != 3) { f = 0; printf("→→→欢迎进入旅游管理系统\n"); printf(" ↓↓↓ 请确认身份\n"); printf("1 → 管理员\n"); printf("2 → 游客\n"); printf("3 → 退出\n"); scanf("%d", &key); if (key>3 || key<1) { printf("错误选项!\n"); continue; } while (f == 0 && key == 1) { printf(" 管理系统为您服务!\n"); printf(" ☆ 请选择(1-4):\n"); printf("1 创建景点分布图\n"); printf("2 检测创建效果图\n"); printf("3 最低造价路线图\n"); printf("4 退出→管理系统\n"); scanf("%d", &ch); switch (ch) { case 1:Create(&G); break; case 2:Turn(&G, &TG); break; case 3:Rbuild(&G); break; case 4:f = 1; break; default:printf("错误选项!请重新选择!\n"); break; } } while (f == 0 && key == 2) { printf("机器人乐乐为您服务:\n"); printf(" ^ ^\n"); printf("1线路 0 0 导游\n"); printf(" 6\n"); printf("2捷径 + + 引领\n"); printf("3→退出导游系统\n"); scanf("%d", &ch); switch (ch) { case 1:Guide(&G, &TG); break; case 2:minway(&TG); break; case 3:f = 1; break; default:printf("错误选项!请重新选择!\n"); break; } } } } ```
matlab 蚁群算法报错 小白求助
function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q) %%------------------------------------------------------------------------- %% 主要符号说明 %% C n个城市的坐标,n×2的矩阵 load C.mat % 39个城市问题 %% NC_max 最大迭代次数 NC_max = 30; %% m 蚂蚁个数 m = 20; %% Alpha 表征信息素重要程度的参数 Alpha = 0.3; %% Beta 表征启发式因子重要程度的参数 Beta = 0.4; %% Rho 信息素蒸发系数 Rho = 0.5; %% Q 信息素增加强度系数 Q = 0.4; %% R_best 各代最佳路线 %% L_best 各代最佳路线的长度 %%========================================================================= %%第一步:变量初始化 n=size(C,1);%n表示问题的规模(城市个数) D=zeros(n,n);%D表示完全图的赋权邻接矩阵 for i=1:n for j=1:n if i~=j D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5; else D(i,j)=eps; %i=j时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示 end D(j,i)=D(i,j); %对称矩阵 end end Eta=1./D; %Eta为启发因子,这里设为距离的倒数 Tau=ones(n,n); %Tau为信息素矩阵 Tabu=zeros(m,n); %存储并记录路径的生成 NC=1; %迭代计数器,记录迭代次数 R_best=zeros(NC_max,n); %各代最佳路线 L_best=inf.*ones(NC_max,1); %各代最佳路线的长度 L_ave=zeros(NC_max,1); %各代路线的平均长度 while NC <=NC_max %停止条件之一:达到最大迭代次数,停止 %%第二步:将m只蚂蚁放到n个城市上 Randpos=[]; %随即存取 for i=1:(ceil(m/n)) Randpos=[Randpos,randperm(n)]; end Tabu(:,1)=(Randpos(1,1:m))'; %此句不太理解? %%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游 for j=2:n %所在城市不计算 for i=1:m visited=Tabu(i,1:(j-1)); %记录已访问的城市,避免重复访问 J=zeros(1,(n-j+1)); %待访问的城市 P=J; %待访问城市的选择概率分布 Jc=1; for k=1:n if length(find(visited==k))==0 %开始时置0 J(Jc)=k; Jc=Jc+1; %访问的城市个数自加1 end end %下面计算待选城市的概率分布 for k=1:length(J) P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta); end P=P/(sum(P)); %按概率原则选取下一个城市 Pcum=cumsum(P); %cumsum,元素累加即求和 Select=find(Pcum>=rand) %若计算的概率大于原来的就选择这条路线 to_visit=J(Select(1)) Tabu(i,j)=to_visit; end end if NC>=2 Tabu(1,:)=R_best(NC-1,:); end %%第四步:记录本次迭代最佳路线 L=zeros(m,1); %开始距离为0,m*1的列向量 for i=1:m R=Tabu(i,:); for j=1:(n-1) L(i)=L(i)+D(R(j),R(j+1)); %原距离加上第j个城市到第j+1个城市的距离 end L(i)=L(i)+D(R(1),R(n)); %一轮下来后走过的距离 end L_best(NC)=min(L); %最佳距离取最小 pos=find(L==L_best(NC)); R_best(NC,:)=Tabu(pos(1),:); %此轮迭代后的最佳路线 L_ave(NC)=mean(L); %此轮迭代后的平均距离 NC=NC+1 ; %迭代继续 %%第五步:更新信息素 Delta_Tau=zeros(n,n); %开始时信息素为n*n的0矩阵 for i=1:m for j=1:(n-1) Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i); %此次循环在路径(i,j)上的信息素增量 end Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i); %此次循环在整个路径上的信息素增量 end Tau=(1-Rho).*Tau+Delta_Tau; %考虑信息素挥发,更新后的信息素 %%第六步:禁忌表清零 Tabu=zeros(m,n); %%直到最大迭代次数 end %%第七步:输出结果 Pos=find(L_best==min(L_best)); %找到最佳路径(非0为真) Shortest_Route=R_best(Pos(1),:) %最大迭代次数后最佳路径 Shortest_Length=L_best(Pos(1)) %最大迭代次数后最短距离 subplot(1,2,1) %绘制第一个子图形 DrawRoute(C,Shortest_Route) %画路线图的子函数 subplot(1,2,2) %绘制第二个子图形 plot(L_best) hold on %保持图形 plot(L_ave,'r') title('平均距离和最短距离') %标题 function DrawRoute(C,R) %%========================================================================= %% DrawRoute.m %% 画路线图的子函数 %%------------------------------------------------------------------------- %% C Coordinate 节点坐标,由一个N×2的矩阵存储 %% R Route 路线 %%========================================================================= N=length(R); scatter(C(:,1),C(:,2)); hold on plot([C(R(1),1),C(R(N),1)],[C(R(1),2),C(R(N),2)],'g') hold on for ii=2:N plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)],'g') hold on end 最后报错。。。。 Index exceeds matrix dimensions. Error in ACATSP (line 127) to_visit=J(Select(1)); 求解答
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
程序员,职场上请远离这种人!
对有些职场人来讲,甩锅就是一种生存手段。01.从大学打篮球说起上大学的时候喜欢打篮球,然后我又特别喜欢抢篮板,经常是跳起来的时候没事,落下来的时候偶尔会踩到别人的脚上,于...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
一个读研让我损失了一百万的真实故事
关注我!只要10分钟,包你学会数据分析 毕业后,应该就业还是考研? 我刚出国留学那会儿,就惊讶的发现,外国local95%都不会选择读研 他们说,硕士学费很贵,时间宝贵,老板不认,所以很费 当几乎所有人都是本科学历时,硕士学历反而像个异类 在老板眼里,三年硕士远远不如3年的工作经验实用 他们甚至专门为拒绝高学历者发明了一个词,叫overoccupie...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给袈...
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
杭漂程序员2019的心路历程,还不起助学贷款,交不起房租,披荆斩棘终雨过天晴
一个杭漂2019的心酸历程,一路披荆斩棘终于还是雨过天晴。
我采访了同事,让他掏出了每天都会浏览的干货网站
前言只有光头才能变强。文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y在周六的晚上,我日常去到公司写文章。想写...
Java知识体系最强总结(2020版)
更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。 文章目录...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
春节不出门!这三款超好评编程游戏,好玩到停不下来
By 超神经场景描述:春节马上就要来临,在这个假期里,怎么能让自己放松,又不至于生疏了自己的老本行?不妨来玩一下编程向的小游戏吧,超神经在此整理了三款好玩有趣又有深度的游戏,快看看是不是...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
相关热词 c# 时间比天数 c# oracle查询 c# 主动推送 事件 c# java 属性 c# 控制台 窗体 c# 静态类存值 c#矢量作图 c#窗体调用外部程式 c# enum是否合法 c# 如何卸载引用
立即提问