《数据结构》(非408代码题)
链表
设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型。试设计算法判断该链表的全部n个字符是否中心对称。例如xyx、xyyx都是中心对称。
分析:
这题完全可以参考19年那题,我们直接找到中间结点然后将后半段全部翻转,接着遍历一遍就好了(头指针和指向中间结点的那个指针同时向后直至后面那个指针指向空为止)唯一要额外考虑的是要是单链表长度为奇数时,要对正中间这个结点做点特殊处理,使其不参与后续的遍历比较。
struct Node {char data;Node* next;
};bool isSymmetric(Node* head) {if (!head || !head->next) return true; // 空链表或只有一个节点Node *slow = head, *fast = head;Node *prev = nullptr;// 找到中间节点,反转后半段链表while (fast && fast->next) {fast = fast->next->next; // 快指针每次走两步Node* nextNode = slow->next; // 保存下一个节点slow->next = prev; // 反转当前节点的指针prev = slow; // 移动前驱slow = nextNode; // 移动到下一个节点}// 如果链表长度为奇数,跳过中间节点if (fast) {slow = slow->next; // 跳过中间节点}// 比较前半段与反转后的后半段while (prev && slow) {if (prev->data != slow->data) {return false; // 不对称}prev = prev->next; // 移动前半段slow = slow->next; // 移动后半段}return true; // 对称
}
当然还有一种做法还是借助数组,第一轮遍历时,将其数值复制到数组当中。接着利用数组可以随机存取的特点,再从中间结点向两端比对即可。
struct Node {char data;Node* next;
};bool isSymmetric(Node* L) {std::vector<char> chars;Node* current = L;// 遍历链表并存储字符while (current != nullptr) {chars.push_back(current->data);current = current->next;}// 检查对称性int n = chars.size();for (int i = 0; i < n / 2; ++i) {if (chars[i] != chars[n - 1 - i]) {return false; // 不对称}}return true; // 对称
}
树
链式结构体
typedef struct BiTNode{int data;struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//BiTNode *p = BiTree p;
//BiTNode *p 偏向表示当前结点
//BiTree p 偏向表示当前结果为根的树typedef struct LNode{ElemType data;struct LNode* next;
}LNode,*LinkList;
二叉树的五种基本形态
- 空树
- 只有一个结点
- 有左子树,但右子树为空
- 有右子树,但左子树为空
- 左右两子树都不为空
递归遍历
递归算法理解:重点关注函数的功能(递和归)
二叉树的先序、中序和后序遍历
void PreOrder(BiTree T){if(T!=NULL){visit(T); //访问根结点PreOrder(T->lchild); //递归遍历左子树PreOrder(T->rchild); //递归遍历右子树}
}void PreOrder(BiTree T){if(T==NULL) return;visit(T); //访问根结点PreOrder(T->lchild); //递归遍历左子树PreOrder(T->rchild); //递归遍历右子树}//另外两个也只是交换语句顺序而已
先序遍历中第n个结点的值
int n=0;
void findn(BiTree T,int cnt){if(T==NULL) return;n++;if(n==cnt){printf("%d",T->data);}findn(T->lchild,cnt);findn(T->rchild,cnt);
}
求data域等于key的结点
BiTree* g=NULL; //全局变量
void findkey(BiTree T,int key){if(T==NULL) return;if(T->data==key) g=T; //g只会赋值一次findkey(T->lchild,key);findkey(T->rchild,Key);
}
求二叉树所有的结点个数
//Way1:使用全局变量
int n=0;//全局变量,表示总结点数
void cnt(BiTree T){if(T==NULL) return;n++;cnt(T->lchild);cnt(T->rchild);
}//Way 2:使用树的五种结构
int cnt(BiTree T){if(T==NULL) return 0;return 1+cnt(T->lchild)+cnt(T->rchild);
}
求二叉树所有叶子结点个数
//Way1:使用全局变量
int n=0;//全局变量,表示总结点数
void cnt(BiTree T){if(T==NULL) return;if(T->lchild==NULL&&T->rchild==NULL){n++; }cnt(T->lchild,k);cnt(T->rchild,K);
}//Way 2:使用树的五种结构
int cnt(BiTree T){if(T==NULL) return 0;else if(T->lchild==NULL&&T->rchild==NULL) return 1;//else if(T->lchild!=NULL&&T->rchild==NULL) return cnt(T->lchild);//else if(T->lchild==NULL&&T->rchild!=NULL) return cnt(T->rchild);return cnt(T->lchild)+cnt(T->rchild);
}
求二叉树所有的单分支结点
int cnt(BiTree T){if(T==NULL) return 0;else if(T->lchild==NULL&&T->rchild==NULL) return 0;else if(T->lchild!=NULL&&T->rchild==NULL) return 1+cnt(T->lchild);else if(T->lchild==NULL&&T->rchild!=NULL) return 1+cnt(T->rchild);return cnt(T->lchild)+cnt(T->rchild);
}
求二叉树所有的双分支结点
int cnt(BiTree T){if(T==NULL) return 0;else if(T->lchild==NULL&&T->rchild==NULL) return 0;else if(T->lchild!=NULL&&T->rchild==NULL) return cnt(T->lchild);else if(T->lchild==NULL&&T->rchild!=NULL) return cnt(T->rchild);return 1+cnt(T->lchild)+cnt(T->rchild);
}
求二叉树的高度
int high(BiTree T){if(T==NULL) return 0;return max(high(T->rchild),high(T->lchild))+1;
}
判断两个二叉树是否相等
int same(BiTree a,BiTree b){if(a==NULL&&b==NULL) return 1;else if(a!=NULL&&b==NULL) return 0;else if(a==NULL&&b!=NULL) return 0;else{if(a->data==b->data){return same(a->lchild,b->lchild)&&same(a->rchild,b->rchild);}else{return 0;}
}
判断两个二叉树是否相似
只要结构一样就好
int resemble(BiTree a,BiTree b){if(a==NULL&&b==NULL) return 1;else if(a==NULL||b==NULL) return 0;else{return resemble(a->lchild,b->lchild)&&resemble(a->rchild,b->rchild);}
}
二叉树的层次遍历
//层序遍历
void LevelOrder(BiTree T){LinkQueue Q;InitQueue(Q); //初始化辅助队列BiTree p;EnQueue(Q,T); //将根节点入队while(!isEmpty(Q)){ //队列不空则循环DeQueue(Q,p); //队头结点出队visit(p); //访问出队结点if(p->lchild != NULL)EnQueue(Q,p->lchild); //若左孩子不空,左孩子入队if(p->rchild != NULL)EnQueue(Q,p->rchild); //若右孩子不空,右孩子入队}
}
二叉树的层次遍历——变体(反转)
// 反转层序遍历
void ReverseLevelOrder(BiTree T) {LinkQueue Q;InitQueue(Q); // 初始化辅助队列EnQueue(Q, T); // 将根节点入队LinkStack S;InitStack(S);BiTNode *p, *s;while (!isEmpty(Q)) { // 队列不空则循环DeQueue(Q, p); // 队头结点出队Push(S, p);if (p->lchild != NULL)EnQueue(Q, p->lchild); // 若左孩子不空,左孩子入队if (p->rchild != NULL)EnQueue(Q, p->rchild); // 若右孩子不空,右孩子入队}while (!StackEmpty(S)) {Pop(S, s);printf("%d ", s->data); // 打印节点数据free(s); // 释放节点内存}
}
交换二叉树的左右子树
void swap(BiTree T){if(T==NULL) return;BiTNode* temp=T->lchild;T->lchild=T->rchild;T->rchild=temp;swap(T->lchild);swap(T->rchild);
}
层次遍历
//层序遍历
void LevelOrder(BiTree T){LinkQueue Q;InitQueue(Q); //初始化辅助队列BiTree p;EnQueue(Q,T); //将根节点入队while(!isEmpty(Q)){ //队列不空则循环DeQueue(Q,p); //队头结点出队visit(p); //访问出队结点if(p->lchild != NULL)EnQueue(Q,p->lchild); //若左孩子不空,左孩子入队if(p->rchild != NULL)EnQueue(Q,p->rchild); //若右孩子不空,右孩子入队}
}
求二叉树高度
int high(BiTree T) {if (T == NULL) return 0; // 空树高度为0LinkQueue Q;InitQueue(Q);EnQueue(Q, T); // 将根节点入队int size = 1; // 当前队列中的元素数量int high = 0; // 树的高度while (size != 0) {int level_size = size; // 当前层的节点数for (int i = 0; i < level_size; i++) {BiTNode *cur = DeQueue(Q); // 队头结点出队size--;if (cur->lchild != NULL) {EnQueue(Q, cur->lchild); // 若左孩子不空,左孩子入队size++;}if (cur->rchild != NULL) {EnQueue(Q, cur->rchild); // 若右孩子不空,右孩子入队size++;}}high++; // 每遍历完一层,高度加1}return high; // 返回二叉树的高度
}
求二叉树的宽度
int width(BiTree T) {if (T == NULL) return 0; // 空树宽度为0LinkQueue Q;InitQueue(Q);EnQueue(Q, T); // 将根节点入队int size = 1; // 当前队列中的元素数量int width = 0;while (size != 0) {int level_size = size; // 当前层的节点数width = max(level_size, width);for (int i = 0; i < level_size; i++) {BiTNode *cur = DeQueue(Q); // 队头结点出队size--;if (cur->lchild != NULL) {EnQueue(Q, cur->lchild); // 若左孩子不空,左孩子入队size++;}if (cur->rchild != NULL) {EnQueue(Q, cur->rchild); // 若右孩子不空,右孩子入队size++;}}}return width;
}
求data域等于key的结点的层次号
int keyLevel(BiTree T, int key) {if (T == NULL) return -1; // 空树返回-1LinkQueue Q;InitQueue(Q);EnQueue(Q, T); // 将根节点入队int size = 1; // 当前队列中的元素数量int high = 0;int ans = -1; // 未找到key时的标记while (size != 0) {int level_size = size; // 当前层的节点数for (int i = 0; i < level_size; i++) {BiTNode *cur = DeQueue(Q); // 队头结点出队size--;if (cur->data == key) ans = high + 1;if (cur->lchild != NULL) {EnQueue(Q, cur->lchild); // 若左孩子不空,左孩子入队size++;}if (cur->rchild != NULL) {EnQueue(Q, cur->rchild); // 若右孩子不空,右孩子入队size++;}}high++;}return ans; // 返回找到的层数,未找到返回-1
}
判断二叉树是否为完全二叉树
int IsCompleteBinaryTree(BiTree T) {if (T == NULL) return 1; // 空树视为完全二叉树LinkQueue Q;InitQueue(Q);EnQueue(Q, T); // 将根节点入队while (!isEmpty(Q)) {BiTNode *cur = DeQueue(Q);if (cur != NULL) {EnQueue(&Q, cur->lchild);EnQueue(&Q, cur->rchild);} else {// 遇到空节点,检查下一个节点是否非空if (!isEmpty(Q)) {BiTNode *next = DeQueue(Q);if (next != NULL) {return 0; // 如果下一个节点非空,则不是完全二叉树}}}}return 1; // 遍历完所有节点,是完全二叉树
}
非递归排序
二叉树的先序、中序和后序遍历
先序/中序(输出语句的改变决定其是先还是中):
- 循环结束条件:node为空且栈空
- node不空,入栈,node到左孩子
- node空,出栈,node到右孩子
后序:
- 循环结束条件:node为空且栈空
- node不空,入栈,node到左孩子
- node空取栈顶,看看右孩子,没有右孩子或者右孩子访问过,出栈标记,否则node到右孩子
注:因为每个结点都会被访问三次
// 先序遍历
void PreOrder(BiTree T) {LinkStack S;InitStack(S);BiTNode *node = T;while (node != NULL || !StackEmpty(S)) {if (node != NULL) {printf("%d ", node->data); // 访问节点Push(S, node);node = node->lchild;} else {node = Pop(S);node = node->rchild;}}
}// 中序遍历
void InOrder(BiTree T) {LinkStack S;InitStack(S);BiTNode *node = T;while (node != NULL || !StackEmpty(S)) {if (node != NULL) {Push(S, node);node = node->lchild;} else {node = Pop(S);printf("%d ", node->data); // 访问节点node = node->rchild;}}
}// 后序遍历
void PostOrder(BiTree T) {LinkStack S;InitStack(S);BiTNode *node = T;BiTNode *lastVisited = NULL;while (node != NULL || !StackEmpty(S)) {if (node != NULL) {Push(S, node);node = node->lchild;} else {BiTNode *topNode;GetTop(S, topNode); // 获取栈顶元素if (topNode->rchild == NULL || topNode->rchild == lastVisited) {printf("%d ", topNode->data); // 访问节点lastVisited = Pop(S); // 弹出节点} else {node = topNode->rchild;}}}
}
公共祖先
那这个不就是后续遍历非递归的变形题吗
void FindAncestors(BiTree T, int k) {BiTNode *p = T;BiTNode *r = NULL;LinkStack S;InitStack(S);while (p != NULL || !StackEmpty(S)) {if (p != NULL) {Push(S, p);p = p->lchild;} else {BiTNode *top;GetTop(S, top);if (top->rchild == NULL || top->rchild == r) {Pop(S);if (top->data == k) {while (!StackEmpty(S)) {BiTNode *ancestor = Pop(S);printf("%d ", ancestor->data->data);}return; // 找到k节点后打印所有祖先并返回}r = top;} else {p = top->rchild;}}}
}
孩子兄弟表示法
以二叉树的形式表示树或者森林
typedef struct CSNode{ElemType data; //数据域struct CSNode *firstchild, *nextsibling; //第一个孩子和右兄弟指针
}CSNode. *CSTree;
求森林的叶子节点总个数
int leafNodeNum(CSTree root) {if (root == NULL) {return 0;} else if (root->firstchild == NULL) {// 如果没有子节点,返回1(当前节点作为叶子节点的一个路径)加上兄弟节点的路径数量return 1 + fun(root->nextsibling);} else {// 如果有子节点,返回左子树和右子树路径数量之和return fun(root->firstchild) + fun(root->nextsibling);}
}
求树的高度
int high(CSTree T) {if (T == NULL) {return 0; // 空树的高度为0} else {// 递归计算左子树的高度和右子树的高度,并返回最大值加1(当前节点)return max(fun(T->firstchild) + 1, fun(T->nextsibling));}
}
线索二叉树
//线索二叉树结点
typedef struct ThreadNode{ElemType data;struct ThreadNode *lchild, *rchild;int ltag, rtag; // 左、右线索标志
}ThreadNode, *ThreadTree;
构建先序线索二叉树
ThreadNode *pre=NULL:void preThreadTree(ThreadTree p) {if (p == NULL) return;//====对这段代码移动===if (p->lchild == NULL) {p->lchild = pre;p->ltag = 1;}if (pre != NULL && pre->rchild == NULL) {pre->rchild = p;pre->rtag = 1;}pre = p;//====对这段代码移动===if (p->ltag == 0) {preThreadTree(p->lchild);}if (p->rtag == 0) {preThreadTree(p->rchild);}
}
线索二叉树的遍历(中序和先序)
// 获取线索二叉树的第一个节点
ThreadNode* firstNode(ThreadNode *p) {while (p->ltag == 0) p = p->lchild;return p;
}// 获取线索二叉树的下一个节点
ThreadNode* nextNode(ThreadNode *p) {if (p->rtag == 1)return p->rchild;elsereturn firstNode(p->rchild);
}// 遍历线索二叉树并访问每个节点
void visit(ThreadTree t) {for(ThreadNode *p = firstNode(t);p != NULL;p = nextNode(p)){printf("%d", p->data);}
}
ThreadNode* nextNode(ThreadNode *p) {if (p->tag == 0)return p->lchild;elsereturn p->rchild;
}
// 遍历线索二叉树并访问每个节点
void visit(ThreadTree t) {for(ThreadNode *p = t;p != NULL;p = nextNode(p)){printf("%d", p->data);}
}
二叉排序树
在二叉排序树中查找值为k的结点并返回
BiTNode* findk(BiTree t, int k){ if(t==NULL) return NULL; if(t->data==k) return t;else if(k>t->data) return findk(t->rchild, k); else return findk(t->lchild, k);
}
在二叉排序树中插入值为k的新结点,插入成功返回1,插入失败返回0
int insertk(BiTree &t, int k){if(t==NULL){t = (BiTNode*)malloc(sizeof(BiTNode)); t->data = k;t->lchild = NULL; t->rchild = NULL; return 1;}if(t->data==k) return 0;else if(k>t->data) return insertk(t->rchild, k); else return insertk(t->lchild, k);
}
注:在二叉排序树中不允许出现重复的值
判别二叉树是否为二叉排序树
int pre=-100000;
int ans=1; //1表示二叉树排序树,0则不是
void BST(BiTree T){if(T==NULL) return; BST(T->lchild); if(pre>T->data){ ans=0;}pre=T->data; BST(T->rchild);
}
指定结点在给定二叉排序树中的层次
void kNodeLevel(BiTree T,int level,int k){//传入根结点时 level=1 if(T==NULL) return;if(T->data==k) printf("%d" level); else if(k>T->data)kNodeLevel(T->rchild, level+1, k); elsekNodeLevel(T->Lchild, Level+1, k);
}
图
邻接矩阵
邻接矩阵结构体
#define MaxVertexNum 100 //项目数目的最大值
typedef char VertexType; //顶点对应的数据类型
typedef int EdgeType; //边对应的数据类型
typedef struct{VertexType Vex[MaxVertexNum]; //顶点集EdgeType Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表(也就是权重)int vexnum,arcnum; //图的当前顶点数和边数
}MGraph;
注:行出度、列入度
采用邻接矩阵表示法创建无向网
// 创建无向图的邻接矩阵
void CreateMGraph(MGraph &G) {cout << "请输入顶点数和边数: ";cin >> G.vexnum >> G.arcnum;// 初始化顶点cout << "请输入顶点信息: ";for (int i = 0; i < G.vexnum; i++) {cin >> G.Vex[i];}// 初始化邻接矩阵for (int i = 0; i < G.vexnum; i++) {for (int j = 0; j < G.vexnum; j++) {G.Edge[i][j] = (i == j) ? 0 : INT_MAX; // 自环为0,其他为无穷大}}// 输入边的信息cout << "请输入边的信息 (格式: 起点 终点 权重): " << endl;for (int k = 0; k < G.arcnum; k++) {char v1, v2;EdgeType weight;cin >> v1 >> v2 >> weight;int i = -1, j = -1;for (int m = 0; m < G.vexnum; m++) {if (G.Vex[m] == v1) i = m;if (G.Vex[m] == v2) j = m;}if (i != -1 && j != -1) {G.Edge[i][j] = weight; // 无向图G.Edge[j][i] = weight; // 无向图}}
}
邻接表
邻接表结构体
#define MaxVertexNum 100 //图中顶点数目的最大值
typedef struct ArcNode{ //边表结点int adjvex; //该弧所指向的顶点的位置struct ArcNode *next; //指向下一条弧的指针//InfoType info; //网的边权值
}ArcNode;typedef struct VNode{ //顶点表结点VertexType data; //顶点信息ArcNode *first; //指向第一条依附该顶点的弧的指针
}VNode,AdjList[MaxVertexNum];typedef struct{AdjList vertices; //邻接表int vexnum,arcnum; //图的顶点数和弧数
}ALGraph; //ALGraph是以邻接表存储的图类型
采用邻接表表示法创建无向网
// 创建无向图的邻接表
void CreateALGraph(ALGraph &G) {cout << "请输入顶点数和边数: ";cin >> G.vexnum >> G.arcnum;// 初始化顶点cout << "请输入顶点信息: ";for (int i = 0; i < G.vexnum; i++) {cin >> G.vertices[i].data;G.vertices[i].first = nullptr; // 初始化边表}// 输入边的信息cout << "请输入边的信息 (格式: 起点 终点): " << endl;for (int k = 0; k < G.arcnum; k++) {char v1, v2;cin >> v1 >> v2;int i = -1, j = -1;for (int m = 0; m < G.vexnum; m++) {if (G.vertices[m].data == v1) i = m;if (G.vertices[m].data == v2) j = m;}if (i != -1 && j != -1) {// 添加边 v1 -> v2ArcNode *newArc1 = new ArcNode{j, G.vertices[i].first};G.vertices[i].first = newArc1;// 添加边 v2 -> v1ArcNode *newArc2 = new ArcNode{i, G.vertices[j].first};G.vertices[j].first = newArc2;}}
}
邻接表的遍历(BFS、DFS)
// 深度优先搜索(DFS)
void DFS(ALGraph &G, int v, bool visited[]) {visited[v] = true; // 标记为已访问cout << G.vertices[v].data << " "; // 访问顶点ArcNode *arc = G.vertices[v].first;while (arc != nullptr) {if (!visited[arc->adjvex]) {DFS(G, arc->adjvex, visited); // 递归访问}arc = arc->next;}
}// 广度优先搜索(BFS)
void BFS(ALGraph &G, int v) {bool visited[MaxVertexNum] = {false}; // 访问标记queue<int> q;visited[v] = true; // 标记为已访问cout << G.vertices[v].data << " "; // 访问顶点q.push(v); // 入队while (!q.empty()) {int current = q.front();q.pop();ArcNode *arc = G.vertices[current].first;while (arc != nullptr) {if (!visited[arc->adjvex]) {visited[arc->adjvex] = true; // 标记为已访问cout << G.vertices[arc->adjvex].data << " "; // 访问顶点q.push(arc->adjvex); // 入队}arc = arc->next;}}
}
图的遍历
深度优先遍历
bool visited[MAX_VERTEX_NUM];
void DFSTraverse(MGraph G){int v; for(v=0; v<G.vexnum; ++v){visited[v] = FALSE; //初始化已访问标记数据}for(v=0; v<G.vexnum; ++v){ //从v=0开始遍历if(!visited[v]){DFS(G, v);}}
}
广度优先遍历
//BFS伪代码
bool visited[Max_vertex_num]; //访问标记数组
void BFSTraverse(Graph G) { for (int i = 0; i < G.vexnum; ++i)visited[i] = false; //访问数组初始化InitQueue(Q); //初始化辅助队列Qfor (int i = 0; i < G.vexnum; ++i){if(!visited[i])BFS(G, i); //对每个连通分量调用一次BFS}
}
相关文章:
《数据结构》(非408代码题)
链表 设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型。试设计算法判断该链表的全部n个字符是否中心对称。例如xyx、xyyx都是中心对称。 分析: 这题完全可以参考19年那题,我们直接找到中间结点然后将后…...
springboot427民航网上订票系统设计和实现(论文+源码)_kaic
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装民航网上订票系统软件来发挥其高效地信息处理的作用&#x…...
UE4_控件蓝图_制作3D生命血条
一:效果图如下: 二、实现步骤: 1、新建敌人 右键蓝图类 选择角色, 重命名为BP_Enemytest。 双击打开,配置敌人网格体 修改位置及朝向 效果如下: 选择合适的动画蓝图类: 人物就有了动作&#x…...
欧拉计划 Project Euler 21题解
欧拉计划21 Project Euler Problem21题干亲和数约数和的计算定义对于任何素数 \( p \):考虑 p a p^a pa:示例可乘性回到示例 Project Euler Problem21 题干 亲和数 记 d ( n ) d(n) d(n) 为 n 的所有真约数(小于 n 且整除 n 的正整数)之和。 如果 d(a) b , d(b) a &…...
python中的Counter函数
在 Python 中,Counter 是 collections 模块中的一个类,用于统计可迭代对象中元素的出现次数,并以字典的形式返回,键为元素,值为对应的计数。它非常适合处理频率统计问题。 用之前必须先导入 from collections import…...
WPF+MVVM案例实战与特效(三十七)- 实现带有水印和圆角的自定义 TextBox 控件
文章目录 1、概述2、案例实现1、基本功能2、代码实现3、控件应用4、案例效果5、源代码下载4、总结1、概述 在开发用户界面时,TextBox 是最常见的输入控件之一。为了提升用户体验,我们经常需要为 TextBox 添加一些额外的功能,例如显示提示文本(水印)和设置圆角边框。本文将…...
SQLServer到MySQL的数据高效迁移方案分享
SQL Server数据集成到MySQL的技术案例分享 在企业级数据管理中,跨平台的数据集成是一个常见且关键的任务。本次我们将探讨如何通过轻易云数据集成平台,将巨益OMS系统中的退款单明细表从SQL Server高效、安全地迁移到MySQL数据库中。具体方案名称为“7--…...
docker快速实现ELK的安装和使用
目录 一、ELK功能原理 二、项目功能展示 三、日志查询展示 四、ELK安装步骤 1、创建elasticsearch、kibana、filebeat相关data、log、conf目录 2、进入/usr/local/elk目录,并创建一个docker网络 3、启动 elasticsearch容器 4、运行kibana容器 5、启动f…...
hbase读写操作后hdfs内存占用太大的问题
hbase读写操作后hdfs内存占用太大的问题 查看内存信息hbase读写操作 查看内存信息 查看本地磁盘的内存信息 df -h查看hdfs上根目录下各个文件的内存大小 hdfs dfs -du -h /查看hdfs上/hbase目录下各个文件的内存大小 hdfs dfs -du -h /hbase查看hdfs上/hbase/oldWALs目录下…...
解决vue2中更新列表数据,页面dom没有重新渲染的问题
在 Vue 2 中,直接修改数组的某个项可能不会触发视图的更新。这是因为 Vue 不能检测到数组的索引变化或对象属性的直接赋值。为了确保 Vue 能够正确地响应数据变化,你可以使用以下几种方法: 1. 使用 Vue.set() 使用 Vue.set() 方法可以确保 …...
Go语言错误分类
错误的分类 在 Go 语言中,错误是通过实现 error 接口的类型表示的,但不同场景下的错误可以按性质和用途进行分类。以下是 Go 语言错误的常见分类,以及每类错误的解释和示例: 标准错误类型 标准库中定义了许多常见的错误类型&…...
使用 Ansys Fluent 对气体泄漏检测进行建模
了解使用 Ansys Fluent 仿真气体泄漏和确保安全的前沿技术。 挑战 气体泄漏对人类安全和环境构成重大风险。及早检测气体泄漏可以防止潜在的灾难,包括爆炸、火灾和有毒物质暴露。有效的气体泄漏检测系统对于石油和天然气、化学加工和住宅基础设施等行业至关重要。…...
Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告Gherkin格式命令行报告
Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告&Gherkin格式命令行报告 前言一、创建Feature文件二、创建步骤定义文件三、生成Cucumber格式的JSON报告四、使用Gherkin格式的命令行报告五、将BDD报告集成到Jenkins中总结 前言 在自动…...
lc46全排列——回溯
46. 全排列 - 力扣(LeetCode) 法1:暴力枚举 总共n!种全排列,一一列举出来放入list就行,关键是怎么去枚举呢?那就每次随机取一个,然后删去这个,再从剩下的数组中继续去随机选一个&a…...
软考:工作后再考的性价比分析
引言 在当今的就业市场中,软考(软件设计师、系统分析师等资格考试)是否值得在校学生花费时间和精力去准备?本文将从多个角度深入分析软考在不同阶段的性价比,帮助大家做出明智的选择。 一、软考的价值与局限性 1.1 …...
如何设置 Data Guard 的报警机制?
概述 设置 Data Guard 的报警机制是确保高可用性和及时响应故障的关键步骤。以下是一些常见的方法来配置 Data Guard 的报警机制,包括使用 Oracle Enterprise Manager (OEM)、Data Guard Broker 以及自定义脚本和外部监控工具。 1. 使用 Oracle Enterprise Manage…...
Elastic 8.17:Elasticsearch logsdb 索引模式、Elastic Rerank 等
作者:来自 Elastic Brian Bergholm 今天,我们很高兴地宣布 Elastic 8.17 正式发布! 紧随一个月前发布的 Elastic 8.16 之后,我们将 Elastic 8.17 的重点放在快速跟踪关键功能上,这些功能将带来存储节省和搜索性能优势…...
Please activate LaTeX Workshop sidebar item to render the thumbnail of a PDF
Latex代码中使用pdf图片,无法预览,提示: Please activate LaTeX Workshop sidebar item to render the thumbnail of a PDF 解决办法: 点击左边这个刷新下即可...
HiveQL命令(一)- 数据库操作
文章目录 前言一、数据库操作1. 创建数据库1.1 语法及解释1.2 创建数据库示例 2. 查看数据库2.1 查看所有数据库2.2 查看数据库信息2.2.1 语法及解释2.2.2 查看数据库信息示例 3. 切换数据库3.1 语法3.2 示例 4. 修改数据库4.1 语法4.2 示例 5. 删除数据库5.1 语法及解释5.2 示…...
【esp32s3】esp-dl模型部署demo
一个单片机部署手写数字识别的demo 源码: # 别跑,给我star git clone https://gitee.com/Shine_Zhang/esp32s3_dl_helloworld.git功能: 网页绘制28x28手写数字,串口输入设备,串口打印输出10个数字的概率值࿰…...
Zemax 中的 LED 阵列模型
LED 阵列的光学特性 LED 阵列由多个发光二极管 (LED) 组成,这些二极管以特定模式或配置排列,以实现均匀照明、更高强度或特定照明特性。这些阵列广泛用于显示器、照明系统、光通信和传感等应用。 LED 阵列的光学特性对于了解它如…...
123213124
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...
游戏引擎学习第42天
仓库: https://gitee.com/mrxiao_com/2d_game 简介 目前我们正在研究的内容是如何构建一个基本的游戏引擎。我们将深入了解游戏开发的每一个环节,从最基础的技术实现到高级的游戏编程。 角色移动代码 我们主要讨论的是角色的移动代码。我一直希望能够使用一些基…...
elasticsearch设置密码访问
1 用户认证介绍 默认ES是没有设置用户认证访问的,所以每次访问时,直接调相关API就能查询和写入数据。现在做一个认证,只有通过认证的用户才能访问和操作ES。 2 开启加密设置 1.生成证书文件 /usr/share/elasticsearch/bin/elasticsearch-…...
阿里云-通义灵码:测试与实例展示
目录 一.引子 二.例子 三.优点 四.其他优点 五.总结 一.引子 在软件开发的广袤天地中,阿里云通义灵码宛如一座蕴藏无尽智慧的宝库,等待着开发者们去深入挖掘和探索。当我们跨越了入门的门槛,真正开始使用通义灵码进行代码生成和开发工作…...
开发者指南--RecyclerView显示数据列表和网格
一、RecyclerView的优势 RecyclerView 的最大优势在于,它对大型列表来说非常高效: 默认情况下,RecyclerView 仅会处理或绘制当前显示在屏幕上的项。例如,如果您的列表包含一千个元素,但只有 10 个元素可见࿰…...
Ajax--实现检测用户名是否存在功能
目录 (一)什么是Ajax (二)同步交互与异步交互 (三)AJAX常见应用情景 (四)AJAX的优缺点 (五)使用jQuery实现AJAX 1.使用JQuery中的ajax方法实现步骤…...
操作系统(5)进程
一、定义与特点 定义:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 特点: 动态性:进程是动态创建的,有它自身的生命周期,…...
力扣9. 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而…...
1_linux系统网络性能如何优化——几种开源网络协议栈比较
之前合集《计算机网络从入门到放弃》第一阶段算是已经完成了。都是理论,没有实操,让“程序猿”很难受,操作性不如 Modbus发送的报文何时等到应答和 tcp通信测试报告单1——connect和send。开始是想看linux内核网络协议栈的源码,然…...
C#—BitArray点阵列
C#—BitArray点阵列 在 C# 中,BitArray 类用来管理一个紧凑型的位值数组,数组中的值均为布尔类型,其中 true(1)表示此位为开启,false(0)表示此位为关闭。 当需要存储位(…...
特工找密码(蓝桥杯)
本来这题想用枚举暴力解的,但是运行总是超时,数值范围太大了~,所以该题不能用枚举进行暴力。 转换成二进制,我们判断一下其规律 注意:按位与是都为1时其值才为1,所以当x和y按位与的结果为2时,其…...
微信小程序--创建一个日历组件
微信小程序–创建一个日历组件 可以创建一个日历组件,来展示当前月份的日期,并支持切换月份的功能。 一、目录结构 /pages/calendarcalendar.wxmlcalendar.scsscalendar.jscalendar.json二、calendar.wxml <view class"calendar"><…...
A6919 基于java+SSM+mysql的区域物流管理系统设计与实现
的区域物流管理系统的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 摘 要 随着当前我国市场经济和计算机互联网技术迅速发展,各行各业的销售和管理都在逐步转向着第三方物流服务,包括中通快递,申通&…...
Python大数据可视化:基于python的电影天堂数据可视化_django+hive
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 电影数据 看板展示 我的信息 摘要 电影天堂数据可视化是…...
美畅物联丨JS播放器录像功能:从技术到应用的全面解析
畅联云平台的JS播放器是一款功能十分强大的视频汇聚平台播放工具,它已经具备众多实用功能,像实时播放、历史录像回放、云台控制、倍速播放、录像记录、音频播放、画面放大、全屏展示、截图捕捉等等。这些功能构建起了一个高效、灵活且用户友好的播放环境…...
前端国际化实战:从需求到落地的完整实践
"我们要开拓东南亚市场了!"产品经理小王兴奋地告诉我这个消息。作为技术负责人,我立刻意识到这意味着我们需要对整个系统进行国际化改造。说实话,虽然之前也做过一些多语言的项目,但面对一个正在运行的大型系统,国际化改造的挑战还是不小。 回想起上周的…...
MySQL 内置函数
字符串函数 concat(str1, str2, ...) 描述: 这个函数用于连接两个或多个字符串,返回一个新字符串。语法: concat(str1, str2, ...)注意点: 如果任意一个参数是null,则结果为null。可以连接任意数量的字符串。示例: select concat(first name: , first_…...
【Spring】日志类Logger的使用
在Spring框架中,日志记录是一个重要的组成部分,通常使用不同的日志框架来处理应用程序的日志。Spring 本身并直接提供一个名为Logger 的类,而是通过抽象的日志 API 让开发者能够选择和使用不同的日志实现(如 Log4j、Logback、SLF4…...
动态高优先权优先进程调度
一、实验目的 目的:了解并掌握动态高优先权优先调度算法的理论,掌握动态优先权的设置方式。 任务:模拟实现动态高优先权优先的调度(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高…...
【Linux SH脚本】LinuxCheck 应急检查信息脚本
LinuxCheck 1.下载地址 【Linux SH脚本】LinuxCheck 应急检查信息脚本 2.简介 LinuxCheck 是一个开源的自动化检查脚本,旨在快速检测 Linux 系统的安全配置和潜在问题。它支持多种发行版,能够扫描并生成详细的报告,涵盖用户管理、权限配置…...
Vue - route路由(router-link、useRoute、useRouter)
为了避免反复在 app.vue 中去修改引入的路径,当用了新的页面,想切换回老页面的时候,都需要去手动改变路径,那么有没有一种可能,可以在一个地方,把这些组件配置好,然后通过不同的路径,…...
【HarmonyOS】鸿蒙应用实现手机摇一摇功能
【HarmonyOS】鸿蒙应用实现手机摇一摇功能 一、前言 手机摇一摇功能,是通过获取手机设备,加速度传感器接口,获取其中的数值,进行逻辑判断实现的功能。 在鸿蒙中手机设备传感器ohos.sensor (传感器)的系统API监听有以下…...
渗透测试工具 -- SQLmap安装教程及使用
随着网络安全问题日益严峻,渗透测试成为了保护信息安全的重要手段。而在渗透测试的众多工具中,SQLmap凭借其强大的自动化SQL注入检测和利用能力,成为了网络安全专家必备的利器。那么,你知道如何高效地使用SQLmap进行漏洞扫描吗&am…...
vue 前端使用fetch实现下载文件跨域
首先配置vite.config.js export default defineConfig({plugins: [vue(),],resolve: {alias: {: /src, // 根据你的项目结构进行设置},},server: {proxy: {/image-proxy: {target: https://你得代理服务器,changeOrigin: true,rewrite: path > path.replace(/^/image-proxy…...
AI与大数据的深度结合:驱动决策的革命性力量
引言:数字时代的决策挑战 在这个信息爆炸的数字时代,数据早已渗透到我们生活的方方面面。全球每天产生的数据量呈指数级增长,无论是用户的消费行为、设备的运行状态,还是社会热点的实时动态,这些信息的规模和复杂性前所…...
搭建C#开发环境
本文记录C#开发环境的搭建过程。 一、Windows系统 二、Ubuntu 运行以下命令安装.NET SDK, sudo add-apt-repository ppa:dotnet/backports sudo apt-get install -y dotnet-sdk-9.0网络资料 Install .NET on Windowshttps://learn.microsoft.com/en-us/dotnet/co…...
Gitlab分支合并及在本地解决冲突
文章目录 问题及解决参考 问题及解决 Gitlab分支合并时碰到了合并冲突的问题,进行了本地解决冲突的操作,并成功进行了合并。 在服务器端的冲突解决比较简单,在此不赘述,这里主要记录下在本地解决冲突的操作。 Gitlab冲突的根本…...
解决 “TypeError: ‘tuple‘ object cannot be interpreted as an integer“ 错误提示
错误背景 这个错误通常出现在期望一个整数时,却传入了一个元组(tuple)。Python 无法将元组解释为整数,因此会抛出 TypeError。 错误示例 python 复制代码 for i in (1, 2, 3): print(range(i)) 运行时会抛出如下错误:…...
OSPF协议
OSPF介绍 OSPF(Open Shortest Path First,开放最短路径优先)是一种用于互联网协议网络的链路状态路由协议。它属于内部网关协议(IGP),主要用于单一自治系统(AS)内部的路由选择。在A…...