【数据结构笔记】408二叉树、堆、AVL、图、拓扑排序

文章目录

  • 堆和二叉树
      • 一、定义与性质
      • 二、结构特点
      • 三、应用场景
      • 四、查找效率
      • 解释
      • 荷兰围棋问题
            • 拓扑排序的树
    • 逆拓扑排序
        • 邻接表的存储
      • 二叉树、二叉平衡树、图刷题笔记

堆和二叉排序树是数据结构中两种不同的树状结构,它们之间存在显著的区别。以下是对这两种数据结构的详细比较:

堆和二叉树

一、定义与性质

    • 堆是一种特殊的完全二叉树。
    • 在堆中,每个节点的值都满足特定的顺序关系。具体分为:
      • 大根堆:任何一个父节点的值都大于或等于它的子节点的值。
      • 小根堆:任何一个父节点的值都小于或等于它的子节点的值。
    • 堆通常用于实现排序算法,如堆排序。
  1. 二叉排序树(二叉查找树、二叉搜索树)

    • 二叉排序树是一种具有特定性质的二叉树。
    • 在二叉排序树中,左子树上所有节点的值均小于根节点的值,右子树上所有节点的值均大于根节点的值。
    • 左右子树也分别为二叉排序树。
    • 二叉排序树主要用于实现动态查找操作。

二、结构特点

    • 堆是完全二叉树,因此具有完全二叉树的性质,如节点按层序排列,且除最后一层外,每一层都是满的,最后一层的节点都靠左对齐。
    • 堆中节点的值满足特定的顺序关系,但左右子节点之间的大小关系没有限定。
  1. 二叉排序树

    • 二叉排序树的形状取决于插入节点的顺序,因此不一定是完全二叉树。
    • 在二叉排序树中,每个节点的左子节点的值小于该节点的值,右子节点的值大于该节点的值,这保证了中序遍历二叉排序树时可以得到一个有序序列。

三、应用场景

    • 堆主要用于实现排序算法,如堆排序。
    • 堆还可以用于实现优先级队列等数据结构。
  1. 二叉排序树

    • 二叉排序树主要用于实现动态查找操作,如插入、删除和查找节点。
    • 由于二叉排序树的中序遍历可以得到有序序列,因此也可以用于排序操作,但通常不是其主要应用场景。

四、查找效率

    • 在堆中查找一个节点需要进行遍历,其平均时间复杂度是O(n)。
    • 但由于堆的特殊性质,我们可以快速地找到堆顶元素(大根堆中的最大值或小根堆中的最小值),其时间复杂度为O(1)。
  1. 二叉排序树

    • 在二叉排序树中查找一个节点的平均时间复杂度是O(log n)(在平衡二叉排序树中)。
    • 但如果二叉排序树退化为链表(如按序插入节点),则查找效率会下降到O(n)。

同时满足大根堆和二叉排序树:没有右子树
同时满足小根堆和二叉排序树:没有左子树


如果只想得到一个序列中第k(k>=5)个最小元素之前的部分排序序列,最好采用什么排序方法?
冒泡排序、堆排序和简单选择排序。
k超过某一个值之后堆排序是最好的。


在这里插入图片描述


已知线性表按顺序存储,且每个元素都是不相同的整数型元素,设计把所有奇数移动到所有偶数前边的算法(要求时间最少,辅助空间最少)。

可以利用快速排序中的分区(partition)思想。快速排序的分区步骤能够在O(n)时间复杂度内将一个数组分成两部分,这里我们可以利用这个特性将奇数移到数组的前面,偶数移到数组的后面。

该算法的时间复杂度是 O(n),其中 n 是数组的长度。

这是因为算法使用了双指针技术,并且每个元素最多只被访问一次。具体来说:

  • left 指针从数组的开头向右移动,直到它遇到一个偶数或者与 right 指针相遇。
  • right 指针从数组的末尾向左移动,直到它遇到一个奇数或者与 left 指针相遇。
  • 在每次循环中,leftright 指针最多各移动一步,直到它们相遇或交错。

由于数组中的每个元素最多只会被 leftright 指针访问一次,因此总的时间复杂度是线性的,即 O(n)。

以下是一个使用C++实现的算法,它利用了双指针和快速排序中的分区思想,但整体时间复杂度是O(n):

#include <iostream>
#include <vector>// 函数声明
void moveOddToFront(vector<int>& nums);int main() {vector<int> nums = {12, 34, 45, 9, 8, 90, 7};cout << "Original array: ";for (int num : nums) {cout << num << " ";}cout << endl;moveOddToFront(nums);cout << "Modified array: ";for (int num : nums) {cout << num << " ";}cout << endl;return 0;
}void moveOddToFront(vector<int>& nums) {int left = 0;int right = nums.size() - 1;while (left < right) {// 从左向右找到第一个偶数while (left < right && nums[left] % 2 != 0) {left++;}// 从右向左找到第一个奇数while (left < right && nums[right] % 2 == 0) {right--;}// 交换找到的偶数和奇数if (left < right) {std::swap(nums[left], nums[right]);left++;right--;}}
}

解释

  1. 初始化指针

    • left 指针从数组的开头开始。
    • right 指针从数组的末尾开始。
  2. 双指针遍历

    • 使用 while 循环,当 left 小于 right 时继续。
    • 从左向右遍历,找到第一个偶数(nums[left] % 2 == 0)。
    • 从右向左遍历,找到第一个奇数(nums[right] % 2 != 0)。
  3. 交换元素

    • 如果找到了这样的偶数和奇数,就交换它们的位置。
    • 然后移动 leftright 指针,继续寻找下一个需要交换的元素。
  4. 终止条件

    • leftright 相遇或交错时,遍历结束,所有奇数都已经被移动到偶数前面。

这个算法的时间复杂度是O(n),因为我们只遍历了数组一次。辅助空间复杂度是O(1),因为我们只使用了几个额外的变量来存储指针和临时值。


荷兰围棋问题

在这里插入图片描述

荷兰国旗问题:设有一个仅由红、白、蓝三种颜色的条块组成的条块序列,存储在-个顺序表中,请编写一个时间复杂度为 O ( n ) O(n) O(n)的算法,使得这些条块按红、白、蓝 的顺序排好,即排成荷兰国旗图案。请完成算法实现:

typedef enum{RED,WHITE,BLUE} color;//设置枚举数组
void Flag Arrange(color a[]int n){...}

算法思想
顺序扫描线性表,将红色条块交换到线性表的最前面,蓝色条块交换到线性表的最后面。为此,设立三个指针,其中j工作指针,表示当前扫描的元素,i以前的元素全部为红色,k以后的元素全部为蓝色。根据j所指示元素的颜色,决定将其交换到序列的前部或尾部。初始时i=0,k=n-1。

j指针它扫描到红色块那么就是跟i指针所指的颜色块交换并且ij指针它同时要++
如果j扫描的是蓝色块那么我们就跟这个k指针所指的颜色块交换并且我k指针要减减也就k指针要前移
如果说j扫描的是白色块我不需要做任何的交换,直接就是j指针往前移动

typedef enum{RED,WHITE:,BLUE} color;
//设置枚举数组
void Flag Arrange(color a[],int n)
{
int i=0,j=0,k=n-1;
while(j<=k)
switch(a[j]){//判断条块的颜色
case RED:Swap(a[i],a[j]);i++;j++;break;
//红色,则和 i 交换
case WHITE:j++;break;
case B:Swap(a[j],a[k]);k--
//蓝色,则和k交换
//这里没有 1++语句以防止交换后 a[j]仍为蓝色的情况
}
}

顺序表交换元素效率更高

关键路径:从启动项目到完成该项目,时间开销至少需要…多少。

有向无环图,一定可以转化为一个上三角或下三角矩阵。但是需要调整顶点的编号。
如果要用上三角矩阵表示有向无环图的邻接矩阵,可以对图进行拓扑排序,按照拓扑排序序列,重新调整各个顶点的编号。这样可以确保,所有的弧都是从小编号顶点指向大编号顶点,从而也就保证了邻接矩阵可以转化为“上三角矩阵”


拓扑排序的树

在这里插入图片描述
请添加图片描述
1、拓扑排序和逆拓扑排序序列都可能不唯一;

2、若图中有环,则不存在拓扑排序序列或者逆拓扑排序序列;

逆拓扑排序

在这里插入图片描述
S t e p 1 Step 1 Step1:把各个操作数不重复地排成一排。
S t e p 2 S t e p 2 Step2:标出各个运算符的生效顺序(同级别之间任意)。
S t e p 3 S t e p 3 Step3:按顺序加入运算符,注意“分层”。(若某个运算符的执行要基于另一个运算符和操作数的执行结果来进行,则前一个运算符在后一个的“上一层”)
S t e p 4 S t e p 4 Step4:从底层向上逐层检查,看同层的运算符是否可以“合体”。
注意:在表达式的有向无环图表示中,不可能出现重复的操作数顶点

邻接表的存储

参考链接

#define MaxVertexNum 1007
typedef struct ArcNode {int adjvex;struct ArcNode* nextarc;
}ArcNode, * ArcList;
typedef struct VNode {int data;ArcNode* firstarc;
}VNode, AdjList[MaxVertexNum];
typedef struct {AdjList vertices;int vexnum, arcnum;
}ALGraph;

预定义、预处理和基本操作函数如下

int indegree[MaxVertexNum], print[MaxVertexNum];
//记录各点入度,记录拓扑排序序列inline void Init(ALGraph& G) {//预处理for (int i = 1; i <= G.vexnum; ++i) {ArcList h = (ArcList)malloc(sizeof(ArcList));h->adjvex = 0;h->nextarc = NULL;G.vertices[i].data = 0;G.vertices[i].firstarc = h;}memset(indegree, 0, sizeof(indegree));memset(print, 0, sizeof(print));return;
}inline void AG_Insert(ALGraph& G, int i, int j) {//头插法加入边ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = j;ArcNode* head = G.vertices[i].firstarc;ArcNode* tail = G.vertices[i].firstarc->nextarc;p->nextarc = tail;head->nextarc = p;return;
}

拓扑排序的实现。【静态数组模拟栈的方法】

inline bool Topologicalsort(ALGraph G) {int Sta[MaxVertexNum], top = 0, count = 0;//用静态数组模拟栈,top为栈顶指针,count为拓扑序列数组下表memset(Sta, 0, sizeof(Sta));int i;for (i = 1; i <= G.vexnum; ++i)if (!indegree[i])Sta[++top] = i;//将初始入度为0的顶点进栈while (top) {//当栈不空时i = Sta[top--];//栈顶元素出栈print[++count] = i;//输出顶点ifor (ArcNode* p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) {//将所有i指向的顶点入度减1,并将入度减为0的顶点压入栈Sta中int v = p->adjvex;if (!v)continue;if (!(--indegree[v]))Sta[++top] = v;//度为0则入栈p->adjvex = 0;}}if (count < G.vexnum)return false;//排序失败,图中存在回路else return true;//拓扑排序成功
}

DFS实现拓扑排序
对于一个有向无环图G,其任意结点u,v,它们之间的关系必然满足下列三种之一。

  1. 若u是v的祖先,则在调用DFS访问u之前,必然已经对v进行过DFS访问,即v的DFS访问顺序先于u。从而可考虑在DFS函数中设置一个时间标记,在DFS调用结束时,对各顶点即使。因此,祖先的结束时间必然大于子孙的结束时间。
  2. 若u是v的子孙,则v为u的祖先,按1中的思路,v的结束时间大于u的结束时间。
  3. 若u和v没有路径关系,则u和v在拓扑序列的关系任意。
    于是按结束时间从大到小排列,就可以得到一个拓扑排序序列。
int tim, finishtime[MaxVertexNum];
bool visited[MaxVertexNum];//访问标记数组inline void DFSTravere(ALGraph G) {memset(visited, false, sizeof(visited));//初始化memset(finishtime, 0, sizeof(finishtime));tim = 0;for (int i = 1; i <= G.vexnum; ++i)//从第一个顶点开始深搜if (!visited[i])DFS(G, i);return;
}inline void DFS(ALGraph G, int v) {visited[v] = true;for (ArcNode* p = G.vertices[v].firstarc->nextarc; p != NULL; p = p->nextarc) {int w = p->adjvex;//依次遍历当前顶点的邻边未访问的顶点if (!visited[w])DFS(G, w);}finishtime[v] = ++tim;//搜索深度越深,tim值越小//如果要输出逆拓扑排序序列,只需把这一行改为输出v即可return;
}

采用邻接表存储时,拓扑排序的时间复杂度为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(V+E),采用邻接矩阵存储时,拓扑排序的时间复杂度为 O ( ∣ V ∣ 2 ) O(∣V∣^2) O(V2)

  1. 入度为0的顶点,即没有前驱活动的或前驱活动都已经完成的顶点,工程可以从这个顶点所代表的活动开始或继续。
  2. 若一个顶点有多个直接后继,则拓扑排序的结果通常不唯一;但若各个顶点已经排在一个线性有序的序列中,每个顶点有唯一的前驱后继关系,则拓扑排序的结果是唯一的。
  3. 由于AOV网中各顶点的地位平等,每个顶点的编号是人为的,因此可以按拓扑排序的结果重新编号,生成的AOV网的新的邻接存储矩阵,这种邻接矩阵可以是三角矩阵;但对一般的图来说,若其邻接矩阵是三角矩阵,则存在拓扑序列;反之则不一定成立。

逆拓扑实现方法一

#define Maxsize 100
//拓扑排序
int Dedegree[Maxsize];         //存储当前顶点的出度
int print[Maxsize];           //记录拓扑序列
Stack<int> S;                //存储出度为0的顶点bool TopologicalSort(Graph G)
{InitStack(S);           //初始化栈for(int i=0;i<G.vexnum;i++){if(Dedegree[i]==0)     //度为0的顶点入栈 {push(S,i);}} int count=0;       //计数while(!IsEmpty(S)){pop(S,i);print[count++]=i;for(p=G.vertices[i].firstarc;p;p=p->nextarc)//将指向i的顶点的出度减1,并且将出度减为0的顶点压入栈中 {v=p->adjvex;if(!(--Dedegree[v])){push(S,v)}}if(count<G.vexnum)     //拓扑排序失败,说明有回路 {return false;}else{return true;}		} } 

逆拓扑实现方法二

 //DFS实现的逆拓扑排序bool visit[Maxnum];      //标记数组,防止顶点被多次访问 void DFSTraverse(Graph G){for(int i=0;i<G.vexnum;i++){visit[i]=false;}for(int i=0;i<G.vexnum;i++){if(!visit[i])DFS(G,i);}} void DFS(Graph G,int v){visit[v];visit[v]=true;for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,V,W))  //从顶点v出发,深度优先遍历G{if(!visit[w]);DFS(G,w);} cout<<v;           //输出顶点 } 

二叉树、二叉平衡树、图刷题笔记

在这里插入图片描述

三叉链表表示二叉树的空指针:n+2
二叉链表表示二叉树的空指针:n+1

在这里插入图片描述
三叉树的最小高度使用等比数列求和得到结果。

在这里插入图片描述
二叉树采用二叉链表,指针域有2n个,n个节点有n-1个指针,空指针2n-(n-1)=n+1
三叉树采用三叉链表,指针域有3n个,n个节点有n-1个指针,空指针3n-(n-1)=2n+1
四叉树采用四叉链表,指针域有4n个,n个节点有n-1个指针,空指针4n-(n-1)=3n+1
k叉树采用k叉链表,指针域有kn个,n个节点有n-1个指针,空指针kn-(n-1)=(k-1)n+1

在这里插入图片描述
二叉树采用顺序存储使用满二叉树的存储方法,因为需要随机访问,所以即使不保存数据的地方也是需要有的(满的访问方式)。

重要结论
除根结点外,其他每个结点都是某个结点的孩子,因此树中所有结点的度数加1等于结点数,也即所有结点的度数之和等于总结点数减1。这是一个重要的结论,做题时经常用到。

树的路径长度是指树根到每个结点的路径长的总和,根到每个结点的路径长度的最大值应是树的高度减1。注意与哈夫曼树的带权路径长度相区别。

树中结点数比边数多1

在这里插入图片描述
高度为h的满二叉树所含的树的个数一定是h

在这里插入图片描述
兄弟孩子表示法:左指针域为空 ,孩子结点个数

  1. 连通图可能是树,可能存在环
    有回路未必是连通的

若一个无向图有n个顶点和n-1条边,可以使它连通但没有环(即生成树),但若再加一条边,在不考虑重边的情形下,则必然会构成环。

  1. 强连通图是有向图,一定存在环
    无向连通图做一次深度优先搜索,可以访问到该连通图的所有顶点,B正确:有回路的无向图不一定是连通图,因为回路不一定包含图的所有结点,

若 E’中的边对应的顶点不是V’的元素,V’和{E’)无法构成图
无向图的极大连通子图称为连通分量
图的遍历要求每个结点只能被访问一次,且若图非连通,则从某一顶点出发无法访问到其他全部顶点

n个顶点,连通无向图边数至少为n-1,强连通有向图至少为n
在这里插入图片描述

强连通图:在图论中,如果一个有向图(Directed Graph)的每对顶点之间都存在双向可达的路径,即对于图中的任意两个顶点u和v,都存在从u到v的路径以及从v到u的路径,那么这个图被称为强连通图。一个有向图是强连通的,当且仅当图中存在一个回路,这个回路至少包含图中的每个节点一次。
强连通分量是【极大强连通子图】,任意两个顶点之间有方向相反的两条路径。由定义不难得出,若一个顶点只有出边或入边,则该顶点必定单独构成一个连通分量。
图中,顶点B只有出边,其他所有顶点都不可能有到顶点 B的路径,所以顶点 B单独构成一个强连通分量。在【顶点A、C、D、E中】,任意两个顶点之间都有方向相反的两条路径,所以可构成一个强连通分量。
在这里插入图片描述

连通图:连通图是指在一个无向图(Undirected Graph)中,任意两个顶点之间都存在至少一条路径使它们相连。这里的关键是“无向”和“至少一条路径”。连通性并不要求路径是双向的,也就是说,从一个顶点到另一个顶点可能存在路径,但从后者到前者不一定存在直接路径(尽管通过其他顶点可能仍然连通)。

在这里插入图片描述
一对,度为2*(n-1)

二叉排序树,不需要调整其为平衡:
在这里插入图片描述

二叉平衡树(AVL)需要记得的例子
二叉平衡树被删除叶子结点之后重新插入也有可能失衡调整
二叉平衡树被删除非叶子结点之后重新插入可能与被删除结点之前一样
注意二叉平衡树和二叉排序树的区别
在这里插入图片描述
在这里插入图片描述

平衡二叉树最少结点的公式:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过SSH远端免密登录执行脚本,修改最新5分钟生成文件权限

通过SSH远端免密登录执行脚本&#xff0c;修改最新5分钟生成文件权限 一、准备工作二、脚本内容三、使用脚本四、注意事项 在日常的系统管理中&#xff0c;经常需要对远程服务器上的文件进行操作。本文将介绍如何通过SSH远端免密登录&#xff0c;执行一个脚本来查找某目录下最新…

半导体材料ERP系统在生产计划管理方面的应用

在科技日新月异的今天&#xff0c;半导体材料作为信息技术的基石&#xff0c;其生产效率与质量管理直接关系到整个产业链的竞争力。为了精准把控生产流程&#xff0c;优化资源配置&#xff0c;半导体行业正积极引入高科技的ERP(企业资源计划)系统&#xff0c;特别是在生产计划管…

关于vue3中如何实现多个v-model的自定义组件

实现自定义组件<User v-model"userInfo" v-model:gender"gender"></User> User组件中更改数据可以同步更改父组件中的数据&#xff1a; 1 父组件&#xff1a; <User v-model"userInfo" v-model:gender"gender">&…

LabVIEW程序员可以从哪几个方面提升自己?有没有详细的路线图?

作为一名LabVIEW程序员&#xff0c;要在快速发展的技术领域保持竞争力并不断提升自己&#xff0c;需要从多个方面进行持续的学习和实践。下面我将为你详细说明LabVIEW程序员提升自己的几个关键方向&#xff0c;并给出具体的成长路线图。 1. 夯实基础&#xff1a;掌握LabVIEW的…

【D3.js in Action 3 精译_035】4.1 D3 中的坐标轴的创建(下篇):坐标轴与轴标签的具体实现

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

若依前后分离版集成积木报表嵌入菜单

今天主要是分享积木报表如何嵌入若依项目菜单&#xff0c;上一篇文件已经分享过若依集成积木报表&#xff0c;这里就不再多费口舌了&#xff0c;有需要的朋友可以移步上一篇文章查看&#xff1a;若依前后分离版集成积木报表-CSDN博客 1、首先是后端配置&#xff1a; 1.1…

【进阶OpenCV】 (11)--DNN板块--实现风格迁移

文章目录 DNN板块一、DNN特点二、DNN函数流程三、实现风格迁移1. 图像预处理2. 加载星空模型3. 输出处理 总结 DNN板块 DNN模块是 OpenCV 中专门用来实现 DNN(Deep Neural Networks,深度神经网络) 模块的相关功能&#xff0c;其作用是载入别的深度学习框架(如 TensorFlow、Caf…

KANO模型,用户需求与产品设计的必备技能!

在竞争日益激烈的市场中&#xff0c;了解客户需求并提供符合客户期望的产品和服务变得尤为重要。那么有没有一种方法可以作为参考呢&#xff1f;今天小编就带大家了解一下KANO模型。KANO模型&#xff08;Kano Model&#xff09;作为一种帮助企业识别和优先处理客户需求的工具&a…

Django操作数据库

Django操作数据库 1、ORM框架2、ORM-创建数据库3、ORM-连接数据库4、ORM-操作表4.1、类创建表4.2、修改表结构4.2.1、删除表结构4.2.2、新增表结构 5、ORM-增删改查5.1、新增数据5.2、删除数据5.3、查询数据5.4、更新数据 1、ORM框架 Django开发操作数据库很简单&#xff0c;内…

项目实战:Qt+OpenCV仿射变换工具v1.1.0(支持打开图片、输出棋盘角点、调整偏移点、导出变换后的图等等)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/143105881 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、Op…

如何解决JMeter响应数据乱码?

问题&#xff1a; 解决&#xff1a; 1、找到JMeter安装目录下的bin目录 2、 在bin目录下&#xff0c;打开" jmeter.properties "文件 3、搜索"sampleresult.default.encoding" 4、改成"sampleresult.default.encodingUTF-8"&#xff0c;去掉前面…

数字图像处理:图像分割应用

数字图像处理&#xff1a;图像分割应用 图像分割是图像处理中的一个关键步骤&#xff0c;其目的是将图像分成具有不同特征的区域&#xff0c;以便进一步的分析和处理。 1.1 阈值分割法 阈值分割法&#xff08;Thresholding&#xff09;是一种基于图像灰度级或颜色的分割方法&…

图片写入GPS经纬高信息

近期项目中需要往java平台传输图片&#xff0c;直接使用QNetworkAccessManager和QHttpMultipart类即可&#xff0c;其他博文中有分享。 主要是平台接口对所传输图片有要求&#xff1a;需要包含GPS信息&#xff08;经度、纬度、高度&#xff09;。 Qt无法直接实现&#xff0c;…

教育平台的创新设计:Spring Boot实现

3系统分析 3.1可行性分析 通过对本信息化在线教学平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本信息化在线教学平台采用Spring Boot框架&#xff0c;JA…

【D3.js in Action 3 精译_037】4.1 DIY 实战:D3 源码分析之——d3.timeFormat() 函数

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

Axure重要元件三——中继器修改数据

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;中继器修改数据 主要内容&#xff1a;显示编辑内容、表格赋值、修改数据 应用场景&#xff1a;更新行、表单数据行修改 案例展示&#xff1a; 正文…

前端算法合集-2(含面试题-美团一面)

主要考察的就是数组扁平化,由浅入深吧 ①利用tostring()和split() let arr [1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]] let newarrarr.toString().split(,) let numarrnewarr.map((item)>{itemNumber(item)return item }) console.log(numarr) ②利用…

AndroidStudio移动开发:使用Service播放音乐【步骤】

目录 一、创建新application 二、准备音乐文件 三、创建项目和布局&#xff08;如果需要交互界面的话&#xff0c;这里简单假设一个基本布局&#xff09; 四、创建MusicService类 五、在MainActivity中启动和控制Service&#xff08;也可以另外创建MusicActivity类&#x…

MoeCTF 2024 ---Misc方向WP

安全杂项 signin 题目描述&#xff1a; xdsec的小伙伴们和参赛者来上课&#xff0c;碰巧这一天签到系统坏了&#xff0c;作为老师的你&#xff0c;要帮他们 教师代签。 特殊提醒&#xff1a;luo同学今天好像在宿舍打游戏&#xff0c;不想来上课&#xff0c;这是严重的缺勤行为…

【数据分享】全国人口-人口年龄结构和抚养比(1990-2021年)

数据介绍 一级标题指标名称单位指标解释人口年末总人口万人年末人口数指每年12月31日24时的人口数。年度统计的全国人口总数内未包括香港、澳门特别行政区和台湾省以及海外华侨人数。1981年及以前人口数据为户籍统计数&#xff1b;1982、1990、2000、2010、2020年数据为当年人口…