当前位置: 首页 > 编程日记 > 正文

基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)


#include <iostream>
using namespace std;
//约定:
//1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, 每个VERTEX则需要有一个id,也就是start, 取start是为了跟LINE更直观地结合。
//2. 每个节点关联着很多(LINE)构成,因此每个VERTEX由很多LINE构成, LINE不需要id, 但是它有3 要素: (start, end, weight), start不必说,取VERTEX中的即可,因此需要end和weight2种.注意: 每个VERTEX中都有一个LINE链表哦..
//3. 因此,图的结构如下所示:
/*
Graph{VERTEX1{line1->line2->line3}|VERTEX2{line1->line2->line3}...Vertexn{line1->line2->line3}
}*/
//图的边
struct LINE{int end;//尾端点int weight;//权重LINE *next;//所有LINE的链表LINE(int e, int w){end = e;weight = w;next = 0;cout<<"LINE:"<<end<<","<<weight<<" created"<<endl;}
};struct VERTEX{int start;//起始点int lineNums;//LINE的数量LINE *first;//与点相关联的边的链表VERTEX *next;//所有VERTEX的链表VERTEX(int s){start = s;lineNums = 0;first = 0;next = 0;cout<<"VERTEX:"<<start<<" created"<<endl;}void visit(){cout<<start<<" ";}
};
//最小生成树的Line结构
struct PrimTreeLine{int start;int end;//尾端点int weight;//权重PrimTreeLine *next;//所有LINE的链表PrimTreeLine(int s, int e, int w){start = s;end = e;weight = w;next = 0;}PrimTreeLine(){}
};
//prim最小生成树结构
struct PrimTree{int start; int vn, ln;int weight;PrimTreeLine*first;VERTEX* list;PrimTree(int s){start = s;vn = 1;ln = 0;weight = 0;first = 0;list = 0;}void insertVertex(int start){if(list){VERTEX * tmp = list;while(tmp->next){tmp = tmp->next;}tmp->next = new VERTEX(start);}else{list = new VERTEX(start);}}void deleteVertex(int start){if(list){VERTEX* tmp = list;if(tmp->start == start){delete tmp;list = 0;return;}else{while(tmp->next){if(tmp->start ==start){VERTEX* t = tmp;tmp = tmp->next;delete t;}}}}}PrimTreeLine* getLast(){PrimTreeLine* l = first;if(l){while(l->next){l = l->next;}return l;}else{return 0;}}PrimTreeLine* getFormer(PrimTreeLine* l){PrimTreeLine* line = first;while(line){if(line->next && line->next->end == l->end){break;}else{line = line->next;}}return line;}void insertLine(PrimTreeLine* l){if(first){getLast()->next = l;}else{first = l;}ln++;vn++;//cout<<"加入line: "<<l->end<<"####ln=="<<ln<<", vn =="<<vn<<endl;}void rmLine(PrimTreeLine*l){//不用delete,因为Line是在graph中的。PrimTreeLine * f = getFormer(l);if(f){PrimTreeLine*d = f->next;f->next = d->next;delete d;}else{PrimTreeLine*d = first;first = first->next;delete d;}}~PrimTree(){while(first){PrimTreeLine* tmp = first;first = first->next;rmLine(tmp);}}void print(){int p = start;PrimTreeLine*l = first;while(l){cout<<"["<<l->start<<"]---"<<l->weight<<"---["<<l->end<<"]";l = l->next;}cout<<endl;}
};//kruskal 开始
struct kruskalVertex{int root;int start;kruskalVertex*next;kruskalVertex*children;kruskalVertex(int start): start(start), root(0), children(0), next(0){}
};
typedef struct PrimTreeLine kruskalLine;
struct kruskalTree{kruskalVertex * root;kruskalLine * first;kruskalTree(int r){root = new kruskalVertex(r);first = 0;}void print(){kruskalLine*l = first;while(l){cout<<"["<<l->start<<"]---"<<l->weight<<"---["<<l->end<<"]";l = l->next;}cout<<endl;}kruskalVertex * findVertex(kruskalVertex * root, int start){kruskalVertex* bl = root;if(bl){if(bl->start == start){return root;}else{kruskalVertex * child = bl->children;while(child){kruskalVertex* res =  findVertex(child, start);if(res) return res;else child = child->next;}}}return 0;}void addLine(kruskalLine* l){if(first){while(first->next) first = first->next;first->next = l;}else{first = l;}}
};
kruskalLine ** allLines;
//kruskal endstruct GRAPH{enum Kind{DG, NG, DN, NN};Kind kind;int count;VERTEX* first;bool *visitDFSArr;GRAPH(): count(0), first(0){kind = DG;visitDFSArr = 0;}GRAPH(Kind k): count(0), first(0){kind = k;visitDFSArr = 0;}GRAPH(Kind k, int start, int end, int weight){kind = k;visitDFSArr = 0;addVertexWithLine(start, end, weight);}~GRAPH(){while(first){VERTEX* v = first;first = first->next;deleteVertex(v->start);}if(visitDFSArr)delete visitDFSArr;}//建立一条新的LineLINE* createNewLine(int end, int weight){//建立一个新LINEreturn new LINE(end,weight);}//建立一个新的VertexVERTEX* createNewVertex(int start){//创建新Vertexreturn new VERTEX(start);}//在图中查找一个Vertex, 如果找到p返回的就是该vertex否则返回最后一个节点。VERTEX* findVertex(VERTEX** p, int start){//寻找Vertex在graph中VERTEX* tmp = first;if(p)*p = 0;while(tmp){if(tmp->start == start)return tmp;if(p)*p = tmp;tmp = tmp->next;}return 0;}//从某一个Vertex的Line表中,查找一个Line, 如果找到, p返回的就是该Line否则返回最后一个Line。LINE* findLine(LINE**p, LINE*first, int end){LINE* tmp = first;if(p) *p = 0;while(tmp){if(tmp->end == end)return tmp;if(p)*p = tmp;tmp = tmp->next;}return 0;}//增加一个Vertex到图中VERTEX* addVertexToGraph(int start){VERTEX*f = 0;if(!findVertex(&f, start)){if(f){f->next = createNewVertex(start);count++;return f->next;}else{first = createNewVertex(start);count++;return first;}}return 0;}LINE* addLineToVertex(LINE *l, VERTEX*v){//前提:l和v必须都存在.LINE* vl = v->first;LINE *p = v->first;if(!vl){v->first = l;}else{while(vl){p = vl;vl = vl->next;}p->next = l;}}//增加一条线到VertexLINE* addLineToVertex(int start, int end, int weight){VERTEX *v;LINE* resLine = 0;if(findVertex(&v, start)){LINE* f = 0;if(v){v = v->next;}else{v = first;}if(!findLine(&f, v->first, end)){if(f){f->next = createNewLine(end,weight);resLine = f->next;}else{v->first = createNewLine(end,weight);resLine = v->first;}v->lineNums++;if(kind == NG){//如果是无向图还需要反向来一次的说,这个不会形成无限递归的.addLineToVertex(end, start, weight);}}}return resLine;}//增加一个带有一条Line的节点, 只有带边的点,和孤独的点,却没有孤独的边。因此没有类似的addLine的函数。void addVertexWithLine(int start, int end, int weight){if(addVertexToGraph(start)){if(addLineToVertex(start, end, weight)){cout<<"addVertexWithLine sucess!"<<endl;}else{cout<<"addVertexWithLine error1"<<endl;}}else{cout<<"addVertexWithLine error2!"<<endl;}}//删除一条线,首先,在LINE中的链表中删除,然后在Vertex中删除void deleteLine(int start, int end){//只有知道边的2个端点才能唯一确定一条边//首先找到顶点VERTEX *v;if(findVertex(&v, start)){if(v){v = v->next;}else{v = first;}}deleteLine(v, end);}    //删除一条线,首先,在LINE中的链表中删除,然后在Vertex中删除void deleteLine(VERTEX*v, int end){//只有知道边的2个端点才能唯一确定一条边LINE*l;if(findLine(&l, v->first, end)){if(l){delete l->next;l->next = l->next->next;}else{LINE*f =  v->first;v->first = f->next;delete f;}v->lineNums--;}}void deleteAllLine(VERTEX*v){//只有知道边的2个端点才能唯一确定一条边LINE*l = v->first;while(l){LINE*tmp = l;l = l->next;delete tmp;}v->first = 0;v->lineNums = 0;}void deleteAllLine(int start){//只有知道边的2个端点才能唯一确定一条边//首先找到顶点VERTEX *v;if(findVertex(&v, start)){if(v){v = v->next;}else{v = first;}}deleteAllLine(v);}void deleteVertex(int start){VERTEX*v;if(findVertex(&v, start)){//首先删除从start点出发的LINEdeleteAllLine(start);//然后删除节点VERTEX*tmp = v->next;v->next = v->next->next;delete tmp;count--;//删除以start为终点的Lines.VERTEX* f = first;while(f){deleteLine(f, start);f = f->next;}}}//深度优先遍历。void DFS(VERTEX*v){v->visit();visitDFSArr[v->start] = true;LINE * l = v->first;while(l){VERTEX* pv;findVertex(&pv, l->end);if(pv){pv = pv->next;}else{pv = first;}if(!visitDFSArr[pv->start]) DFS(pv);l = l->next;}}void DFSTraversal(){delete visitDFSArr;visitDFSArr = new bool[count];//泄漏for(int i = 0; i < count; i++){visitDFSArr[i] = false;}VERTEX*v = first;while(v){if(!visitDFSArr[v->start]) DFS(v);v = v->next;}cout<<endl;}//广度优先遍历。广度优先遍历选择一个队列辅助操作还是比较合理的。略//最小生成树//prim算法: 条件是加权连通图。找出图的最小生成树。PrimTree getPrimPrimTree(int start){PrimTree p(start);if(visitDFSArr){delete []visitDFSArr;visitDFSArr = 0;}visitDFSArr = new bool[count];for(int i = 0; i < count; i++){visitDFSArr[i] = false;}p.insertVertex(start);//起点加入p.listvisitDFSArr[start] = true;while(p.list){//如果list为空则结束。每次循环增加一条线VERTEX* vlist = p.list;VERTEX* vp =0;//遍历当前list表找出最短的linePrimTreeLine* shortest = 0;//最短linewhile(vlist){//遍历p.list中的所有的点,在所有点中找到一个最短的路径。vp = findVertex(0, vlist->start);LINE* bianli = vp->first;//遍历linewhile(bianli){//遍历该点上的所有lineif(!visitDFSArr[bianli->end]){//这条LINE是合法的。if里面是判断它是否最短if(shortest){//如果shortest已经有值了。则判断if(bianli->weight < shortest->weight){shortest->start = vlist->start;shortest->end = bianli->end;shortest->weight = bianli->weight;}}else{//如果没有值,shortest被赋值为合法值shortest = new PrimTreeLine(vlist->start, bianli->end, bianli->weight);}}bianli = bianli->next;}if(!shortest){//这说明,某个点上没有找到可以用的LINE,那就应该删除这个点。p.deleteVertex(vp->start);}vlist = vlist->next;//下一个点}if(shortest){//cout<<"加入: "<<shortest->start<<"-"<<shortest->end<<"("<<shortest->weight<<")"<<endl<<endl;p.insertLine(shortest);p.insertVertex(shortest->end);visitDFSArr[shortest->end] = true;shortest = 0;}else{//cout<<"结束"<<endl;//break;}}if(visitDFSArr){delete []visitDFSArr;visitDFSArr = 0;}return p;}void qsort(kruskalLine **arr, int start, int end){if(end - start <= 0) return;int ps = start, pe = end;kruskalLine* mark = arr[start];while(end > start){while(end > start&& arr[end]->weight > mark->weight) end--;if(end > start){arr[start] = arr[end];start++;}while(end > start && mark->weight > arr[start]->weight) start++;if(end > start) {arr[end] = arr[start];end--;}}arr[start] = mark;qsort(arr, ps, start - 1);qsort(arr, start+ 1, pe);}kruskalTree getKruskalTree(){//1. init linesVERTEX* vcount = first;int linenums = 0;while(vcount){linenums += vcount->lineNums;vcount = vcount->next;}if(allLines) delete []allLines;allLines = new kruskalLine*[linenums];VERTEX* v = first;int li = 0;while(v){LINE*l = v->first;while(l){kruskalLine *k = new kruskalLine(v->start, l->end, l->weight);allLines[li++] = k;l = l->next;}v = v->next;}//2. sortfor(int i = 0; i < linenums; i++){cout<<allLines[i]->weight<<" ";}cout<<endl;qsort(allLines, 0, linenums-1);for(int i = 0; i < linenums; i++){cout<<allLines[i]->weight<<" ";}cout<<endl;//3. init TreeskruskalTree ** trees = new kruskalTree*[count];VERTEX* vs = first;int vi = 0;while(vs){trees[vi++] = new kruskalTree(vs->start);vs = vs->next;}cout<<"count = "<<count<<", vi = "<<vi<<endl;//4. select one line. attach two tree;for(int i = 0; i < linenums; i++){//a. 取出一条线kruskalLine * kl = allLines[i];cout<<"the selected line kl = ["<<kl->start<<","<<kl->weight<<","<<kl->end<<"]"<<endl;//b. 找出对应的2棵树int startTree = -1;int endTree = -1;kruskalVertex* findVstart = 0;kruskalVertex* findVend = 0;for(int i = 0; i < count; i++){if(trees[i]){if(!findVstart){findVstart = trees[i]->findVertex(trees[i]->root, kl->start) ;if(findVstart && trees[i]->root->root == findVstart->root){startTree = i;if(startTree == endTree){//说明这条Line的2个端点在同一棵树上,返回循环开始处。break;}}}if(!findVend){findVend = trees[i]->findVertex(trees[i]->root, kl->end) ;if(findVend && trees[i]->root->root == findVend->root){endTree = i;if(startTree == endTree){break;}}}}if(startTree != -1 && endTree != -1) break;}if(-1 == startTree || -1 == endTree) {cout<<"startTree =="<<startTree<<endl;cout<<"endTree =="<<endTree<<endl;break;}else if(startTree == endTree){cout<<"startTree == endTree == "<<startTree<<endl;continue;}//c. 合并2棵树//i>首先, endTree的root作为, findVstart的一个childkruskalVertex * child = findVstart->children;if(child){while(child->next) {child = child->next;}child->next = trees[endTree]->root;}else{findVstart->children = trees[endTree]->root;}//ii>把endTree的所有child的root变成 startTree的root, 在i>中完成kruskalVertex* endBL = trees[endTree]->root;while(endBL){endBL->root = findVstart->root;endBL = endBL->next;}//iii>把endTree的所有Line加入startTree中kruskalLine * klOfStartTree = trees[startTree]->first;kruskalLine * klOfEndTree = trees[endTree]->first;if(!klOfStartTree){trees[startTree]->first = klOfEndTree;} else {while(klOfStartTree->next){klOfStartTree = klOfStartTree->next;}klOfStartTree->next = klOfEndTree;}//iV>删除endTree节点。并把数组对应下标置空。delete trees[endTree];trees[endTree] = 0;//d. 把kl 加入到新树中if(klOfEndTree){while(klOfEndTree->next) klOfEndTree = klOfEndTree->next;klOfEndTree->next = kl;cout<<"kl加入到tree中 1"<<endl;}else{if(klOfStartTree){klOfStartTree->next = kl;}else{trees[startTree]->first = kl;}cout<<"kl加入到tree中 2"<<endl;}}//5. clean scenefor(int i = 0; i < count; i++){if(trees[i]) return *trees[i];}}
};//希望在构造图的时候应该先构造所有的点.
int main(){//GRAPH g(GRAPH::DG);GRAPH g(GRAPH::NG);//使用维基百科上prim词条中的图g.addVertexToGraph(1);g.addVertexToGraph(2);g.addVertexToGraph(3);g.addVertexToGraph(4);g.addVertexToGraph(5);g.addVertexToGraph(6);g.addVertexToGraph(7);g.addLineToVertex(1, 2, 7);g.addLineToVertex(1, 4, 5);g.addLineToVertex(2, 3, 8);g.addLineToVertex(2, 4, 9);g.addLineToVertex(2, 5, 7);g.addLineToVertex(3, 5, 5);g.addLineToVertex(4, 5, 15);g.addLineToVertex(4, 6, 6);g.addLineToVertex(5, 6, 8);g.addLineToVertex(5, 7, 9);g.addLineToVertex(6, 7, 11);cout<<g.count<<endl;g.DFSTraversal();/*g.deleteVertex(2);g.deleteVertex(3);g.DFSTraversal();*///prim算法PrimTree p = g.getPrimPrimTree(5);p.print();cout<<p.ln<<" "<<p.vn<<endl;cout<<"\n-----------------------------------"<<endl;//kruskal算法kruskalTree kt = g.getKruskalTree();kt.print();
}


相关文章:

gatsby_如何使用Gatsby和Leaflet创建夏季公路旅行地图绘制应用程序

gatsbyGet ready for the summer by building your own road trip mapping app with this step-by-step guide!通过此逐步指南&#xff0c;构建自己的公路旅行地图应用&#xff0c;为夏天做好准备&#xff01; What are we going to build? 我们要建造什么&#xff1f; What …

NEFU 1146 又见A+B

又见ab Problem:1146 Time Limit:1000ms Memory Limit:65535K Description 给定两个非负整数A,B,求他们的和。 Input 多组输入&#xff0c;每组输入两个非负整数A和B&#xff08;0<A,B<10^3000&#xff09;&#xff0c;可能会有前缀0&#xff0c;但保证总长度不超过3000…

图的最短路径dijkstra算法

想法是这样的&#xff1a; 1. 最开始要建立4个list&#xff0c;分别存储 a. 所有的Vertex: allVertex[] b. 一个空的Vertex list: emptyVertex[] c. 一个前缀表 previous list(用来回溯路径用): previous[] d. 一个表示最短距离的表(就是表示某个点与0点的最短距离)&#xff1…

JDBC数据源连接池(1)---DBCP

何为数据源呢&#xff1f;也就是数据的来源。我在前面的一篇文章《JDBC原生数据库连接》中&#xff0c;采用了mysql数据库&#xff0c;数据来源于mysql&#xff0c;那么mysql就是一种数据源。在实际工作中&#xff0c;除了mysql&#xff0c;往往还会有Oracle&#xff0c;sql se…

如果成为一名高级安卓开发_什么是高级开发人员,我如何成为一名开发人员?

如果成为一名高级安卓开发Becoming a Senior Developer is something many of us strive for as we continue our code journey and build our career. But what does it actually mean to be a "Senior" Developer?成为一名高级开发人员是我们许多人在继续我们的代…

拍牌神器是怎样炼成的(三)---注册全局热键

要想在上海拍牌的超低中标率中把握机会、占得先机&#xff0c;您不仅需要事先准备好最优的竞拍策略&#xff0c;还要制定若干套应急预案&#xff0c;应对不时之需。既定策略交给计算机自动执行&#xff0c;没有问题。可是谁来召唤应急预案呢&#xff1f;使用全局热键应该是个不…

eclipse 变成中文

官方下载 http://www.eclipse.org/babel/downloads.php 按照自己的eclipse版本下载对应的 复制链接 到eclipse ->help->Install New Software 勾选自己的语言包 如&#xff1a; 等待 安装完成 &#xff0c;无过不好用 更改 右键 属性 更改位置 加后缀 D:\xinle_eclips…

框架模式与设计模式之区别

http://my.oschina.net/u/991183/blog/109854 有很多程序员往往把框架模式和设计模式混淆&#xff0c;认为MVC是一种设计模式。实际上它们完全是不同的概念。框架、设计模式这两个概念总容易被混淆&#xff0c;其实它们之间还是有区别的。框架通常是代码重用&#xff0c;而设计…

村上春树 开始写作_如何克服对写作的恐惧并找到开始的动力

村上春树 开始写作Writing about our work is one of those things that most of us have on our to-do list. But whether its due to procrastination or fear, we never actually get to it. Heres some more motivation and reasons why you should give it a shot!撰写我们…

一个基于组件的动态对象系统

http://hulefei29.iteye.com/blog/1490889 一、静态的痛苦 作为一个项目经验丰富的程序员&#xff0c;你经常会遇到游戏开发过程中的“反复”(iterations)&#xff1a;今天美术将一个静态的模型改为骨骼模型并添加了动画&#xff1b;明天企划会议上决定把所有未拾取武器由…

Lua生成Guid(uuid)

全局唯一标识符&#xff08;GUID&#xff0c;Globally Unique Identifier&#xff09;也称作 UUID(Universally Unique IDentifier) 。GUID是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下&#xff0c;…

c:if标签的使用

1、标签的基本介绍 <c:if> 标签必须要有test属性&#xff0c;当test中的表达式结果为true时&#xff0c;则会执行本体内容&#xff1b;如果为false&#xff0c;则不会执行。例如&#xff1a;${requestScope.username admin}&#xff0c;如果requestScope.username等adm…

ecs和eks 比较_如何使用Kubernetes,EKS和NGINX为网站设置DNS

ecs和eks 比较As the creator of Foo, a platform for website quality monitoring, I recently endeavored in a migration to Kubernetes and EKS (an AWS service).作为网站质量监控平台Foo的创建者&#xff0c;我最近努力迁移到Kubernetes和EKS(一种AWS服务)。 Kubernetes…

仅需6步,教你轻易撕掉app开发框架的神秘面纱(1):确定框架方案

遇到的问题 做游戏的时候用的是cocos2dxlua&#xff0c;游戏开发自有它的一套框架机制。而现在公司主要项目要做android和iOS应用。本文主要介绍如何搭建简单易用的App框架。 如何解决 对于新手来说&#xff0c;接触一门新的知识&#xff0c;往往会思考该怎么入手&#xff0c;…

js全局变量污染

一.定义全局变量命名空间 只创建一个全局变量&#xff0c;并定义该变量为当前应用容器&#xff0c;把其他全局变量追加在该命名空间下 var my{}; my.name{big_name:"zhangsan",small_name:"lisi" }; my.work{school_work:"study",family_work:&q…

cached-query 将缓存和查询数据库高速连接起来的轻类库

介绍 我们经常有这种需求&#xff1a;当我们把memcached增加到项目后我还还要写一个 cacheUtils 或者 cacheManager 之类的类来操作memcached。而且一般的操作不外乎是这种操作&#xff1a; 拿到一段sql&#xff0c;先去memcahed里面看下是否有缓存&#xff0c;假设有就直接返回…

全栈Python Flask教程-建立社交网络

Learn how to build a basic social platform with the Python Flask web framework. 了解如何使用Python Flask网络框架构建基本的社交平台。 In this video, we show you how to:在此视频中&#xff0c;我们向您展示如何&#xff1a; how to create a database, 如何创建数…

py执行系统命令

py执行系统命令 1. os.system In [32]: run os.system("date") Thu Jan 28 09:41:25 CST 2016 In [33]: run Out[33]: 0 只能得到返回值&#xff0c;无法得到输出。 2. os.popen In [35]: run os.popen("date") In [36]: run.read Out[36]: <function…

仅需6步,教你轻易撕掉app开发框架的神秘面纱(2):MVP比MVC更好吗

对于程序框架的选择&#xff0c;由于android天然的MVC&#xff0c;本来不需要另外设计直接使用即可。但是我更加钟情于MVP模式&#xff0c;对于其将ui完全与业务逻辑分离的思路很赞同。 那么什么是业务逻辑&#xff1f;个人认为&#xff0c;对数据&#xff08;即MVC中的M&…

一、nginx 安装

添加官方 yum 源 1 vim /etc/yum.repos.d/nginx.rep 输入以下内容&#xff08;OS为你的系统&#xff0c;OSRELEASE 系统版本&#xff09; 1 [nginx] 2 namenginx repo 3 baseurlhttp://nginx.org/packages/mainline/OS/OSRELEASE/$basearch/ 4 gpgcheck0 5 enabled1 列出可安装…

华为技术面试编码题_最佳技术编码面试准备书

华为技术面试编码题Technical coding interviews are notoriously difficult — almost borderline quiz-like for those unprepared. It can sometimes be a daunting task to navigate all the technical coding preparation resources available online, and one might as…

仅需6步,教你轻易撕掉app开发框架的神秘面纱(3):构造具有个人特色的MVP模式

1. MVP的问题 之前我们说过MVP模式最大的问题在于&#xff1a;每写一个Activity/Fragment需要写4个对应的文件&#xff0c;对于一个简易的app框架来说太麻烦了。所以我们需要对MVP进行一定的简化。 关于MVP模式是什么及其简单实现&#xff0c;可以参照&#xff1a;浅谈 MVP i…

Java进阶之自动拆箱与自动装箱

序. java基本类型介绍 java中&#xff0c;基本数据类型一共有8种&#xff0c;详细信息如下表&#xff1a; 类型大小范围默认值byte8-128 - 1270short16-32768 - 327680int32-2147483648-21474836480long64-9233372036854477808-92333720368544778080float32-3.40292347E38-3.40…

Ceilometer Polling Performance Improvement

Ceilometer的数据采集agent会定期对nova/keystone/neutron/cinder等服务调用其API的获取信息&#xff0c;默认是20秒一次&#xff0c; # Polling interval for pipeline file configuration in seconds.# (integer value)#pipeline_polling_interval 20 这在大规模部署中会对O…

vue使用pwa_如何使用HTML,CSS和JavaScript从头开始构建PWA

vue使用pwaProgressive web apps are a way to bring that native app feeling to a traditional web app. With PWAs we can enhance our website with mobile app features which increase usability and offer a great user experience.渐进式Web应用程序是一种将本地应用程…

仅需6步,教你轻易撕掉app开发框架的神秘面纱(4):网络模块的封装

程序框架确定了&#xff0c;还需要封装网络模块。 一个丰富多彩的APP少不了网络资源的支持&#xff0c;毕竟用户数据要存储&#xff0c;用户之间也要交互&#xff0c;用户行为要统计等等。 使用开源框架 俗话说得好&#xff0c;轮子多了路好走&#xff0c;我们不需要自己造轮…

结构体成员数组不定长如何实现

【目的】 定义一个结构体类&#xff0c;其中的成员变量数组长度不定&#xff0c;根据实例化的对象指定长度&#xff0c;所以想到用指针实现 【现状】 指针可以指向任意长度数组&#xff0c;但结构体类只分配指针本身4字节长度&#xff0c;所以无法扩展 1 /**2 ****************…

团队项目:二次开发

至此&#xff0c;我们有了初步的与人合作经验&#xff0c;接下来投入到更大的团队中去。 也具备了一定的个人能力&#xff0c;能将自己的代码进行测试。接下来尝试在别人已有的基础上进行开发。 上一界51冯美欣同学的项目&#xff1a;http://www.cnblogs.com/maxx/ 1.每个团队从…

arduino 呼吸灯_如何改善您的Arduino呼吸机:用于临时COVID-19呼吸机设计的RTS和SCS简介...

arduino 呼吸灯The world as we know it was recently taken by storm. That storm was the outbreak of the COVID-19 pandemic. This has in turn created a shortage of ventilators world wide which has led many people to foray into the world of ventilator design. 我…

reboot 百度网盘资源

提醒&#xff1a;同志们这是记录&#xff0c;视频文件是加密的&#xff0c;请勿下载 基础班第十三期&#xff1a;http://pan.baidu.com/s/1c2GcvKG 密码: 743j 基础班第十四期链接: http://pan.baidu.com/s/1c24AYa8 密码: x2sh 第十五期&#xff1a; https://pan.baidu.com…