数据结构OJ实验8-赫夫曼树编码及应用

news2024/11/26 23:41:18

A. DS二叉树--赫夫曼树的构建与编码

题目描述

给定n个权值,根据这些权值构造huffman树,并进行huffman编码

大家参考课本算法6.12为主,注意数组访问是从位置1开始

要求:赫夫曼的构建中,默认左孩子权值不大于右孩子权值

输入

第一行先输入n,表示有n个权值,即有n个叶子

第二行输入n个权值,权值全是小于1万的正整数

输出

逐行输出每个权值对应的编码,格式如下:权值-编码
即每行先输出1个权值,再输出一个短划线,再输出对应编码

接着下一行输出下一个权值和编码,以此类推

样例查看模式 

正常显示查看格式

输入样例1 

5
15 4 4 3 2

输出样例1

15-1
4-010
4-011
3-001
2-000

AC代码
#include<iostream>
using namespace std;
struct Hatnode
{
    int parent, left, right, weight;
    string code;
    int data;
    Hatnode()
    {
        parent = 0;
        left = 0;
        right = 0;
    }
};
class Hatree
{
    Hatnode* root;
    int num;
public:
    Hatree(int n = 0)
    {
        num = n;
        root = new Hatnode[2 * n];
        for (int i = 1; i <= n; i++)
        {
            root[i].data = i;
            cin >> root[i].weight;
        }
    }
    void selectMin(int len, int& p1, int& p2)
    {
        int min1, min2;
        min1 = min2 = 10000;
        p1 = p2 = 0;
        for (int i = 1; i < len; i++)
        {
            if (root[i].parent == 0)
            {
                if (root[i].weight < min1)
                {
                    min2 = min1;
                    p2 = p1;
                    min1 = root[i].weight;
                    p1 = i;
                }
                else if (root[i].weight < min2)
                {
                    min2 = root[i].weight;
                    p2 = i;
                }
            }
        }
    }
    void createtree()
    {
        int p1 = 0, p2 = 0;
        for (int i = num + 1; i < 2 * num; i++)
        {
            selectMin(i, p1, p2);
            root[i].left = p1;
            root[i].right = p2;
            root[p1].parent = root[p2].parent = i;
            root[i].weight = root[p1].weight + root[p2].weight;
        }
    }
    void hacode()
    {
        for (int i = 1; i <= num; i++)
        {
            for (int c = i, f = root[i].parent; f != 0; c = f, f = root[f].parent)
            {
                if (root[f].left == c)
                {
                    (root + i)->code = '0' + (root + i)->code;
                }
                else
                {
                    (root + i)->code = '1' + (root + i)->code;
                }
            }
        }
    }
    void Code()
    {
        for (int i = 1; i <= num; i++)
        {
            cout << (root + i)->weight << "-" << (root + i)->code << endl;
        }
    }
};
int main()
{
    int n;
    cin >> n;
    Hatree tree(n);
    tree.createtree();
    tree.hacode();
    tree.Code();
    return 0;
}

B. DS二叉树--赫夫曼树解码

题目描述

已知赫夫曼编码算法和程序,在此基础上进行赫夫曼解码

可以增加一个函数:int  Decode(const string codestr, char txtstr[]);//输入编码串codestr,输出解码串txtstr

该方法如果解码成功则返回1,解码失败则返回-1,本程序增加宏定义ok表示1,error表示-1

赫夫曼解码算法如下:

定义指针p指向赫夫曼树结点,指针i指向编码串,定义ch逐个读取编码串的字符

初始操作包括读入编码串str,设置p指向根结点,i为0表示指向串首,执行以下循环:

1)取编码串的第i个字符放入ch

2)如果ch是字符0,则p跳转到左孩子;如果ch是字符1,则p跳转到右孩子;如果ch非0非1,表示编码串有错误,报错退出

3)如果p指的结点是叶子,输出解码字符,p跳回根结点,i++,跳步骤1

4)如果p指的结点不是叶子且i未到编码串末尾,i++,跳步骤1

5)如果p指的结点不是叶子且i到达编码串末尾,报错退出

当i到达编码串末尾,解码结束。

输入

第一行先输入n,表示有n个叶子

第二行输入n个权值,权值全是小于1万的正整数
第三行输入n个字母,表示与权值对应的字符
第四行输入k,表示要输入k个编码串
第五行起输入k个编码串

输出

每行输出解码后的字符串,如果解码失败直接输出字符串“error”,不要输出部分解码结果

样例查看模式 

正常显示查看格式

输入样例1 

5
15 4 4 3 2
A B C D E
3
11111
10100001001
00000101100

输出样例1

AAAAA
ABEAD
error

AC代码
#include<iostream>
using namespace std;
struct Hatnode
{
    int parent, left, right, weight;
    string code;
    char data;
    Hatnode()
    {
        parent = 0;
        left = 0;
        right = 0;
    }
};
class Hatree
{
    Hatnode* root;
    int num;
public:
    Hatree(int n = 0)
    {
        num = n;
        root = new Hatnode[2 * n];
        for (int i = 1; i <= n; i++)
        {
            cin >> root[i].weight;
        }
        for (int i = 1; i <= n; i++)
        {
            cin >> root[i].data;
        }
    }
    void selectMin(int len, int& p1, int& p2)
    {
        int min1, min2;
        min1 = min2 = 10000;
        p1 = p2 = 0;
        for (int i = 1; i < len; i++)
        {
            if (root[i].parent == 0)
            {
                if (root[i].weight < min1)
                {
                    min2 = min1;
                    p2 = p1;
                    min1 = root[i].weight;
                    p1 = i;
                }
                else if (root[i].weight < min2)
                {
                    min2 = root[i].weight;
                    p2 = i;
                }
            }
        }
    }
    void createtree()
    {
        int p1 = 0, p2 = 0;
        for (int i = num + 1; i < 2 * num; i++)
        {
            selectMin(i, p1, p2);
            root[i].left = p1;
            root[i].right = p2;
            root[p1].parent = root[p2].parent = i;
            root[i].weight = root[p1].weight + root[p2].weight;
        }
    }
    void hacode()
    {
        for (int i = 1; i <= num; i++)
        {
            for (int c = i, f = root[i].parent; f != 0; c = f, f = root[f].parent)
            {
                if (root[f].left == c)
                {
                    (root + i)->code = '0' + (root + i)->code;
                }
                else
                {
                    (root + i)->code = '1' + (root + i)->code;
                }
            }
        }
    }
    int  Decode(const string s, string& ans)
    {
        int ed = 2 * num - 1;
        int st = ed;
        bool flag = 1;
        for (int i = 0; i < s.size(); i++)
        {
            if (s[i] == '0')
            {
                st = root[st].left;
            }
            else if (s[i] == '1')
            {
                st = root[st].right;
            }
            else
            {
                return -1;
            }
            if (root[st].left == 0 && root[st].right == 0)
            {
                ans += root[st].data;
                st = ed;
                flag = 1;
            }
            else
            {
                flag = 0;
            }
        }
        if (!flag)
        {
            return-1;
        }
        return 1;
    }
};
int main()
{
    int n;
    cin >> n;
    Hatree tree(n);
    tree.createtree();
    tree.hacode();
    cin >> n;
    while (n--)
    {
        string s;
        cin >> s;
        string res;
        if (tree.Decode(s, res) == -1)
        {
            cout << "error" << endl;
        }
        else
        {
            cout << res << endl;
        }
    }
    return 0;
}

C. DS树--带权路径和

题目描述

二叉树的创建使用含空树表示的先序遍历序列,计算一棵二叉树的带权路径总和,即求赫夫曼树的带权路径和。

已知一棵二叉树的叶子权值,该二叉树的带权路径和WPL等于叶子权值乘于根节点到叶子的分支数,然后求总和。

如下图中,叶子都用大写字母表示,权值对应为:A-7,B-6,C-2,D-3

树的带权路径和 = 7*1 + 6*2 + 2*3 + 3*3 = 34

输入

第一行输入一个整数t,表示有t个二叉树

第二行输入一棵二叉树的先序遍历结果,空树用字符‘0’表示,注意输入全是英文字母和0,其中大写字母表示叶子

第三行先输入n表示有n个叶子,接着输入n个数据表示n个叶子的权值,权值的顺序和前面输入的大写字母顺序对应

以此类推输入下一棵二叉树

输出

输出每一棵二叉树的带权路径和

样例查看模式 

正常显示查看格式

输入样例1 

2
xA00tB00zC00D00
4 7 6 2 3
ab0C00D00
2 10 20

输出样例1

34
40

AC代码
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
struct node
{
	node* l;
	node* r;
	char data;
	int weight;//权重
	int depth;//记录层数
	node(char d, node* ll = NULL, node* rr = NULL)
	{
		data = d;
		l = ll;
		r = rr;
	}
};
class tree
{
	node* root;
	//再建树中赋值层数
	void Create(node*& n,int dep=0)
	{
		char ch;
		cin >> ch;
		if (ch == '0')
		{
			n = NULL;
			return;
		}
		n = new node(ch);
		n->depth = dep;
		Create(n->l,dep+1);
		Create(n->r,dep+1);//加一操作
	}
	void inweight(node* n)
	{
		if (!n)return;
		//只有叶子有权值
		if (!n->l && !n->r)
		{
			cin >> n->weight;
		}
		inweight(n->l);
		inweight(n->r);
	}
	void Delete(node* n)
	{
		if (!n)
		{
			delete n;
			return;
		}
		Delete(n->l);
		Delete(n->r);
		delete n;
	}
	void Pre(node* n)
	{
		if (!n)return;
		cout << n->data;
		Pre(n->l);
		Pre(n->r);
	}
	void Mid(node* n)
	{
		if (!n)return;
		Mid(n->l);
		cout << n->data;
		Mid(n->r);
	}
	void Pos(node* n)
	{
		if (!n)return;
		Pos(n->l);
		Pos(n->r);
		cout << n->data;
	}
	void Child(node* n)
	{
		if (!n)return;
		if (!n->l && !n->r)
		{
			cout << n->data << " ";
		}
		Child(n->l);
		Child(n->r);
	}
	void Fath(node* n)
	{
		if (!n)return;
		Fath(n->l);
		Fath(n->r);
		if (n->l && !(n->l->l) && !(n->l->r))
		{
			cout << n->data << " ";
		}
		if (n->r && !(n->r->l) && !(n->r->r))
		{
			cout << n->data << " ";
		}
	}
	int high(node* n)
	{
		if (!n)return 0;
		int lefth = high(n->l);
		int righth = high(n->r);
		return max(lefth, righth) + 1;
	}
public:
	tree()
	{
		root = NULL;
	}
	void createtree()
	{
		Create(root);
	}
	~tree()
	{
		Delete(root);
	}
	void preorder()
	{
		Pre(root);
		cout << endl;
	}
	void midorder()
	{
		Mid(root);
		cout << endl;
	}
	void posorder()
	{
		Pos(root);
		cout << endl;
	}
	void child()
	{
		Child(root);
		cout << endl;
	}
	void father()
	{
		Fath(root);
		cout << endl;
	}
	void lerorder()
	{
		queue<node*>q;
		q.push(root);
		while (!q.empty())
		{
			auto t = q.front();
			q.pop();
			if (!t)continue;
			cout << t->data;
			q.push(t->l);
			q.push(t->r);
		}
		cout << endl;
	}
	void gethigh()
	{
		cout << high(root) << endl;
	}
	void input_weight()
	{
		int n;
		cin >> n;
		inweight(root);
	}
    //计算带权路径和
	int count_path()
	{
		//使用栈计算
		int ans = 0;
		stack<node*>s;//s存结点
		s.push(root);
		while (!s.empty())
		{
			node* cur = s.top();
			s.pop();
			if (!cur)continue;
			s.push(cur->l);
			s.push(cur->r);
			//到叶子了
			if (!cur->l && !cur->r)
			{
				ans += cur->depth * cur->weight;
			}
		}
		return ans;
	}
};
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		tree tt;
		tt.createtree();
		tt.input_weight();
		cout << tt.count_path() << endl;
	}
	return 0;
}

D. DS树--二叉树之最大路径

题目描述

给定一颗二叉树的逻辑结构(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构

二叉树的每个结点都有一个权值,从根结点到每个叶子结点将形成一条路径,每条路径的权值等于路径上所有结点的权值和。编程求出二叉树的最大路径权值。如下图所示,共有4个叶子即有4条路径,

路径1权值=5 + 4 + 11 + 7 = 27路径2权值=5 + 4 + 11 + 2 = 22

路径3权值=5 + 8 + 13 = 26路径4权值=5 + 8 + 4 + 1 = 18

可计算出最大路径权值是27。

该树输入的先序遍历结果为ABCD00E000FG00H0I00,各结点权值为:

A-5,B-4,C-11,D-7,E-2,F-8,G-13,H-4,I-1

输入

第一行输入一个整数t,表示有t个测试数据

第二行输入一棵二叉树的先序遍历,每个结点用字母表示

第三行先输入n表示二叉树的结点数量,然后输入每个结点的权值,权值顺序与前面结点输入顺序对应

以此类推输入下一棵二叉树

输出

每行输出每棵二叉树的最大路径权值,如果最大路径权值有重复,只输出1个

样例查看模式 
正常显示

输入样例1 

AB0C00D00
4 5 3 2 6
ABCD00E000FG00H0I00
9 5 4 11 7 2 8 13 4 1

输出样例1

11
27
AC代码
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
struct node
{
	node* l;
	node* r;
	char data;
	int weight;//权重
	int depth;//记录层数
	node(char d, node* ll = NULL, node* rr = NULL)
	{
		data = d;
		l = ll;
		r = rr;
	}
};
class tree
{
	node* root;
	//再建树中赋值层数
	void Create(node*& n,int dep=0)
	{
		char ch;
		cin >> ch;
		if (ch == '0')
		{
			n = NULL;
			return;
		}
		n = new node(ch);
		n->depth = dep;
		Create(n->l,dep+1);
		Create(n->r,dep+1);//加一操作
	}
	void inweight(node* n)
	{
		if (!n)return;
		//只要是结点都有权值
		cin >> n->weight;
		inweight(n->l);
		inweight(n->r);
	}
	void Delete(node* n)
	{
		if (!n)
		{
			delete n;
			return;
		}
		Delete(n->l);
		Delete(n->r);
		delete n;
	}
	void Pre(node* n)
	{
		if (!n)return;
		cout << n->data;
		Pre(n->l);
		Pre(n->r);
	}
	void Mid(node* n)
	{
		if (!n)return;
		Mid(n->l);
		cout << n->data;
		Mid(n->r);
	}
	void Pos(node* n)
	{
		if (!n)return;
		Pos(n->l);
		Pos(n->r);
		cout << n->data;
	}
	void Child(node* n)
	{
		if (!n)return;
		if (!n->l && !n->r)
		{
			cout << n->data << " ";
		}
		Child(n->l);
		Child(n->r);
	}
	void Fath(node* n)
	{
		if (!n)return;
		Fath(n->l);
		Fath(n->r);
		if (n->l && !(n->l->l) && !(n->l->r))
		{
			cout << n->data << " ";
		}
		if (n->r && !(n->r->l) && !(n->r->r))
		{
			cout << n->data << " ";
		}
	}
	int high(node* n)
	{
		if (!n)return 0;
		int lefth = high(n->l);
		int righth = high(n->r);
		return max(lefth, righth) + 1;
	}
	//最大路径为根节点到叶子的一条路径,路径的权值等于路径上所有结点的权值和
	int maxpath(node* n)
	{
		if (!n)return 0;
		int left_maxpath = maxpath(n->l);
		int right_maxpath = maxpath(n->r);
		return n->weight + max(left_maxpath, right_maxpath);
	}
public:
	tree()
	{
		root = NULL;
	}
	void createtree()
	{
		Create(root);
	}
	~tree()
	{
		Delete(root);
	}
	void preorder()
	{
		Pre(root);
		cout << endl;
	}
	void midorder()
	{
		Mid(root);
		cout << endl;
	}
	void posorder()
	{
		Pos(root);
		cout << endl;
	}
	void child()
	{
		Child(root);
		cout << endl;
	}
	void father()
	{
		Fath(root);
		cout << endl;
	}
	void lerorder()
	{
		queue<node*>q;
		q.push(root);
		while (!q.empty())
		{
			auto t = q.front();
			q.pop();
			if (!t)continue;
			cout << t->data;
			q.push(t->l);
			q.push(t->r);
		}
		cout << endl;
	}
	void gethigh()
	{
		cout << high(root) << endl;
	}
	void input_weight()
	{
		int n;
		cin >> n;
		inweight(root);
	}
    //计算带权路径和
	int count_path()
	{
		//使用栈计算
		int ans = 0;
		stack<node*>s;//s存结点
		s.push(root);
		while (!s.empty())
		{
			node* cur = s.top();
			s.pop();
			if (!cur)continue;
			s.push(cur->l);
			s.push(cur->r);
			//到叶子了
			if (!cur->l && !cur->r)
			{
				ans += cur->depth * cur->weight;
			}
		}
		return ans;
	}
	int max_path()
	{
		return maxpath(root);
	}
};
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		tree tt;
		tt.createtree();
		tt.input_weight();
		cout << tt.max_path() << endl;
	}
	return 0;
}

E. DS二叉树—二叉树镜面反转

题目描述

假设二叉树用二叉链表存储,用含空子树遍历的先序序列结果创建。空子树用字符#表示

输入二叉树的先序序列,请你先创建二叉树,并对树做个镜面反转,再输出反转后的二叉树的先序遍历、中序遍历、后序遍历和层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。

--程序要求--

程序中不允许使用STL库等第三方对象或函数实现本题的要求

输入

测试次数t

每组测试数据是一个二叉树的先序遍历序列,#表示空树

输出

对每棵二叉树,输出镜面反转后的先序、中序、后序和层次遍历序列。如果空树,输出四个NULL(后面不加空格,每个NULL独自一行,中间没有空行)。如下:

NULL

NULL

NULL

NULL

样例查看模式 

正常显示查看格式

输入样例1 

3
41#32###65##7##
AB#C##D##
AB##C##

输出样例1

4 6 7 5 1 3 2 
7 6 5 4 3 2 1 
7 5 6 2 3 1 4 
4 6 1 7 5 3 2 
A D B C 
D A C B 
D C B A 
A D B C 
A C B 
C A B 
C B A 
A C B 

AC代码
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
struct node
{
	node* l;
	node* r;
	char data;
	node(char d, node* ll = NULL, node* rr = NULL)
	{
		data = d;
		l = ll;
		r = rr;
	}
};
class tree
{
	node* root;
	void Create(node*& n)
	{
		char ch;
		cin >> ch;
		if (ch == '#')
		{
			n = NULL;
			return;
		}
		n = new node(ch);
		//只需修改这里,交换左右孩子即可
		Create(n->r);
		Create(n->l);
	}
	void Delete(node* n)
	{
		if (!n)
		{
			delete n;
			return;
		}
		Delete(n->l);
		Delete(n->r);
		delete n;
	}
	void Pre(node* n)
	{
		if (!n)return;
		cout << n->data<<" ";
		Pre(n->l);
		Pre(n->r);
	}
	void Mid(node* n)
	{
		if (!n)return;
		Mid(n->l);
		cout << n->data<<" ";
		Mid(n->r);
	}
	void Pos(node* n)
	{
		if (!n)return;
		Pos(n->l);
		Pos(n->r);
		cout << n->data<<" ";
	}
	void Child(node* n)
	{
		if (!n)return;
		if (!n->l && !n->r)
		{
			cout << n->data << " ";
		}
		Child(n->l);
		Child(n->r);
	}
	void Fath(node* n)
	{
		if (!n)return;
		Fath(n->l);
		Fath(n->r);
		if (n->l && !(n->l->l) && !(n->l->r))
		{
			cout << n->data << " ";
		}
		if (n->r && !(n->r->l) && !(n->r->r))
		{
			cout << n->data << " ";
		}
	}
	int high(node* n)
	{
		if (!n)return 0;
		int lefth = high(n->l);
		int righth = high(n->r);
		return max(lefth, righth) + 1;
	}
public:
	tree()
	{
		root = NULL;
	}
	void createtree()
	{
		Create(root);
	}
	~tree()
	{
		Delete(root);
	}
	void preorder()
	{
		Pre(root);
		cout << endl;
	}
	void midorder()
	{
		Mid(root);
		cout << endl;
	}
	void posorder()
	{
		Pos(root);
		cout << endl;
	}
	void child()
	{
		Child(root);
		cout << endl;
	}
	void father()
	{
		Fath(root);
		cout << endl;
	}
	void lerorder()
	{
		queue<node*>q;
		q.push(root);
		while (!q.empty())
		{
			auto t = q.front();
			q.pop();
			if (!t)continue;
			cout << t->data<<" ";
			q.push(t->l);
			q.push(t->r);
		}
		cout << endl;
	}
	void gethigh()
	{
		cout << high(root) << endl;
	}
};
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		tree tt;
		tt.createtree();
		tt.preorder();
		tt.midorder();
		tt.posorder();
		tt.lerorder();
	}
	return 0;
}

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

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

相关文章

webRTC实时通信demo

参考文档&#xff1a; https://www.jianshu.com/p/f439ce5cc0be https://www.w3cschool.cn/socket demo流程示意图&#xff08;用户A向用户B推送视频&#xff09;&#xff1a; #mermaid-svg-0KZaDQ5DBl28zjmZ {font-family:"trebuchet ms",verdana,arial,sans-seri…

JavaWeb——前端之HTMLCSS

学习视频链接&#xff1a;https://www.bilibili.com/video/BV1m84y1w7Tb/?spm_id_from333.999.0.0 一、Web开发 1. 概述 能通过浏览器访问的网站 2. Web网站的开发模式——主流是前后端分离 二、前端Web开发 1. 初识 前端编写的代码通过浏览器进行解析和渲染得到我们看到…

elasticsearch+Kibana

什么是es(elasticsearch) Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;它构建在Apache Lucene搜索引擎库之上。它提供了一个分布式多用户能力的实时搜索和分析引擎&#xff0c;能够处理大规模的数据。Elasticsearch被广泛用于构建全文搜索、日志分析、实时应用…

灸哥问答:软件架构在软件研发中的作用

软件架构在软件开发中扮演着至关重要的角色。我们在软件研发的过程中&#xff0c;类比于建造一座公寓楼&#xff0c;而软件架构就像是盖楼之前的设计图纸&#xff0c;如果没有设计图纸就直接盖楼&#xff0c;可想而知带来的后果是什么。我对软件架构的作用表现总结如下&#xf…

iOS问题记录 - iOS 17通过NSUserDefaults设置UserAgent无效(续)

文章目录 前言开发环境问题描述问题分析1. 准备源码2. 定位源码3. 对比源码4. 分析总结 解决方案补充内容1. UserAgent的组成2. UserAgent的设置优先级 最后 前言 在上篇文章中对该问题做了一些判断和猜测&#xff0c;并给出了解决方案。不过&#xff0c;美中不足的是没有进一…

十四:爬虫-Redis基础

1、背景 随着互联网大数据时代的来临&#xff0c;传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的压力&#xff0c;来解决系统性能上的瓶颈。 2、redis是什么 Redis 全称 Remote Dictio…

C/C++面向对象(OOP)编程-回调函数详解(回调函数、C/C++异步回调、函数指针)

本文主要介绍回调函数的使用&#xff0c;包括函数指针、异步回调编程、主要通过详细的例子来指导在异步编程和事件编程中如何使用回调函数来实现。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;C/C精进之路 &…

【Spring实战】16 Profile

文章目录 1. 定义2. 使用2.1 定义 Profile2.2 激活 Profile 3. 演示3.1 properties文件3.2 打印日志3.3 启动服务&验证3.4 修改 active3.5 重启服务&验证 4. 应用场景4.1 数据库配置4.2 日志配置 5. 代码详细总结 Spring 框架提供了一种强大的机制&#xff0c;允许在不…

图像分割实战-系列教程9:U2NET显著性检测实战1

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 U2NET显著性检测实战1 1、任务概述

第7课 利用FFmpeg将摄像头画面与麦克风数据合成后推送到rtmp服务器

上节课我们已经拿到了摄像头数据和麦克风数据&#xff0c;这节课我们来看一下如何将二者合并起来推送到rtmp服务器。推送音视频合成流到rtmp服务器地址的流程如下&#xff1a; 1.创建输出流 //初始化输出流上下文 avformat_alloc_output_context2(&outFormatCtx, NULL, &…

Java EE Servlet之Cookie 和 Session

文章目录 1. Cookie 和 Session1.1 Cookie1.2 理解会话机制 (Session)1.2.1 核心方法 2. 用户登录2.1 准备工作2.2 登录页面2.3 写一个 Servlet 处理上述登录请求2.4 实现登录后的主页 3. 总结 1. Cookie 和 Session 1.1 Cookie cookie 是 http 请求 header 中的一个属性 浏…

AI 工具探索(二)

我参加了 奇想星球 与 Datawhale 举办的 【AI办公 X 财务】第一期&#xff0c;现在这是第二次打卡&#xff0c;也即自由探索&#xff0c;我选择 Modelscope 的 Agent 探索&#xff0c;并用gpts创作助理对比&#xff01; 最近想学学小红书的运营方法&#xff0c;选择了 小红书I…

【微服务】1.虚拟机配置

创建虚拟机选经典&#xff0c;其他配置同其他讲解文档 特殊注意 如果要自己设置IP地址&#xff0c;修改/etc/sysconfig/network-scripts/ 编辑ifcfg-ens33需改ip地址 #开机加载网络配置启动网络服务 ONBOOT"yes" #分配ip的协议 none static :不自动分配&#xff0c…

axios的使用及说明

目录 1.说明 2.直接使用 3.封装使用 4.注意 1.说明 官网&#xff1a;Axios 实例 | Axios中文文档 | Axios中文网 Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使…

FL Studio 21最新版本for mac 21.2.2.3740中文解锁版2024最新图文安装教程

FL Studio 21最新版本for mac 21.2.0.3740中文解锁版是最新强大的音乐制作工具。它可以与所有类型的音乐一起创作出令人惊叹的音乐。它提供了一个非常简单且用户友好的集成开发环境&#xff08;IDE&#xff09;来工作。这个完整的音乐工作站是由比利时公司 Image-Line 开发的。…

redis容灾的方案设计

背景 今年各个大厂的机房事故频繁&#xff0c;其中关键组件Redis是重灾区&#xff0c;本文就来看下怎么做Redis的多机房容灾 Redis多机房容灾方案 1.首先最最直观的是直接利用Redis内部的主从数据同步来进行灾备&#xff0c;但是由于Redis内部的主从实现对机房间的网络延迟等…

2024 React 后台系统 搭建学习看这一篇就够了(1)

年初&#xff0c;自己想写一篇关于 React 实战后台项目的 课程文章&#xff0c;也算是对自己 2023的前端学习做一个系统性总结&#xff0c;方便后续查阅&#xff0c;也方便自己浏览&#xff0c;还能增加自己的文笔 网上很多平台都不太稳定&#xff0c;所以用了阿里的语雀&…

声明式导航传参详情

1 动态路由传参 路由规则path ->/article/:aid 导航链接 <router-link to"/article/1">查看第一篇文章</router-link> 组件获取参数: this.$route.params.aid 如果想要所有的值&#xff0c;就用this. $route. params 注意&#xff1a;这两个必须匹配…

实战入门 K8s剩下三个模块

1.Label Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识&#xff0c;用来对它们进行区分和选择。 Label的特点&#xff1a; 一个Label会以key/value键值对的形式附加到各种对象上&#xff0c;如Node、Pod、Service等等 一个资源对象可以定义任意数量…

信创之国产浪潮电脑+统信UOS Linux操作系统体验10:visual studio code中调试C++程序

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 老猿在CSDN的《信创之国产浪潮电脑统信UOS操作系统体验2&#xff1a;安装visual studio code和cmake搭建C开发环镜》介绍了在国产浪潮电脑统信UOS操作系统中安装visual studio code和cmake搭建C开…