当前位置: 首页 > news >正文

【算法设计与分析zxd】第7章 贪心法

贪心算法的设计技术

• 每一步的判断都是一个当前最优的抉择,这个抉择计算设计的好坏,决定了算法的成败。
• 多步判断过程,最终的判断序列对应于问题的最优解
• 适用于 能够 部最优达到全局最优的优化问题 【比如 求最短哈密顿回路的问题,就不是】

• 需要对具体的贪心算法的正确性进行必要的证明

用贪心法 求问题的解

【例7-1】

学生有n项活动申请使用某一个会议室,每项活动都有一个开始时间和一个结束时间。任何两个活动都不能同时使用这个会议室。问如何安排这些活动,使得被安排活动的数量达到最多?

问题分析

设活动编号的集合为A={1,2,…,n},第i项活动的起始时间为si,
结束时间为e i 。满足s i ≥e j 或s j ≥e i,i≠j,称为活动相容
A的两两相容的最大活动子集S
 方法1:按活动开始时间优先【更早的开始活动,也许能安排更多的活动】,例
A={1,2,3},s 1 =0, e 1 =17, s 2 =3,e 2 =5,s 3 =8,e 3 =15
 方法2:按占用时间由短到长来选择,也许可能安排更多的活动,
例A={1,2,3},s 1 =0, e 1 =8, s 2 =7,e 2 =10,s 3 =9,s e =15
 方法3:按结束时间从小到大选择,也许可以安排更多的活动。

命题:

活动是按结束时间从小到大进行排序的,即有
e 1 ≤e 2 ≤e 3 …≤e n ,贪心算法选择到第k步,有k项活动被选择,
生成一个选择序列i 1 ,i 2 , …,i k (按策略必有i 1 =1),
那么,最优解S必然包含i 1 ,i 2 , …,i k
【全局最优包含局部最优】
证明:设A中的活动都是按照结束的时间递增的顺序排列的,
S是A的最优解且S={i 1 ,i 2 , …,i m }。
(1) 当k=1时,需证明活动1被包含在最优解S中,即i 1 =1。
假设 i 1 ≠1,那么用活动1去替换i 1 ,得到S’,有S’=(S-{i 1 } ) ∪{1},
因为活动1结束时间比i 1活动结束得更早,因此,其和i 2 , …,i m活动均相容,又由于S与S’数量相同,
所以,S’也是A的最优解。 命题成立。
(2)假设对于任意整数k,命题正确。
若前k步顺序选择的活动 为i 1 ,i 2 , …,i k ,那么存在一个最优解S={i 1 ,i 2 , …,i k }∪B。
如果令S’是S中剩下的与{i 1 ,i 2 , …,ik}相容的活动,S’\subsetS  

 那么B是S’的一个最优解。若不然,假如S’有解B’,B’>B,那么用B’替换B以后得到解{i1 ,i2 , …,ik}∪B’,将比S的活动更多,这与S是最优解矛题得证。

对比(1)的证明,算法第一步选择结时间最早的活动总是导致一个最优解,故对子
问题S’存在一个最优解B*={ i k+1 , …}。由于B*与B都是S’的最优解,因而B*=B。于是
S’={ i 1 ,i 2 , …,i k }∪B*={ i 1 ,i 2 , …,i k , i k+1 }∪(B-{ i k+1 })
S’与S的活动数目一样多,也是一个最优解,而且恰好包含了算法前k+1步选择的
活动。则命题得证。
1.排序2.相容性判定

计算模型

(1)存储结构:
struct Active{startTime s;//开始时间endTime e;//结束时间selectflag f;//选标识 
}A[n];

(2)计算:
活动i 与 活动j 相容 -> A[ i ].s >= A[ j ].e 或 A[ j ].s >= A[ i ].e

用归并排序 或 其他任何高效的排序算法完成 以a[i].e的从小到大 的排序,形成排序A[1].e≤A[2].e ≤…≤A[n].e

【例7-2】数列极差。

给定含有n个正整数的数列a,做如下两步操作:
(1)每一次删除其中的两个数a i 和a j ;
(2)在数列中加入一个数a i ×a j +1
循环执行步骤(1)(2)直到集合中只剩下一个元素为止。 【每种选择顺序会有不同的剩余的数】
设计 算法求得数列中剩余的数为最大值max和最小值min,
则该数列的极差为M=max-min。

问题分析

实例:设a={5,6,7},那么,它将有三种组织方式:
(5*6+1)*7+1=218;
(5*7+1)*6+1=217;
(6*7+1)*5+1=216。
两个最小的数相乘,结果最大。

命题:

当一个数列中含有n(n>2)数时,该数列按数列极差法
最大数值的方法为:每次选择数列中最小的两个数进行相乘加 1
最小数值为:每次从数列中选择两个最大的数相乘加1

证明:

(1) 当k=3时,

数列a={a1 , a2 , a3},不妨令a1< a2< a3 ,这样

可以设a 2 = a 1 +k 1 (k 1 >0);a 3 = a 1 +k 1 +k 2 (k 1 ,k 2 >0)。那么这三个数的
三种组合方式为:
(a 1 * a 2 +1)* a 3 +1
= a 1 * a 1 * a 1 +(2*k 1 +k 2 ) *a 1 * a 1 +(k 1 *(k 1 +k 2 )+1)*a 1 +k 1 +k 2 +1
(a 1 * a 3 +1)* a 2 +1
= a 1 * a 1 * a 1 +(2*k 1 +k 2 ) *a 1 * a 1 +(k 1 *(k 1 +k 2 )+1)*a 1 +k 1 +1
(a 2 * a 3 +1)* a 1 +1
= a 1 * a 1 * a 1 +(2*k 1 +k 2 ) *a 1 * a 1 +(k 1 *(k 1 +k 2 )+1)*a 1 +1
比较上述三式的同类项,可知命题成立

——思考:

A={a1,a2},B={b1,b2,b3}, 设[A]=[a1 a2]=a1*a2+1 一种值
在运算中{B}={b1,b2,b3}表示三个 顺序 ,即[b1 b2 b3], [b1 b3 b2], [b2 b3 b1],
若有A<a3<B<a4, 试比较 [[A],a3,{B},a4]与 [[A],a4,{B},a3]

猜测:[[A],a3,{B},a4] > [[A],a4,{B},a3]


因为a3<a4 ,设a4=a3+k , a3=a4-k
[[A],a3,{B},a4]
=[  [A] ,a4-k ,{B} ,a4   ]
= [ [A]*(a4-k)+1 , {B},a4 ]
=[   [ A,a4]-[A]*k ,{B},a4    ]  ——(1)

B={b1,b2,b3} 取任意一个次序
[[A],a3,{B},a4]  ——代入(1)式
=[   [A,a4]-[A]*k ,{ b1, b2,b3,b4},a4    ] 
=[   [A,a4]-[A]*k ,b1, {b2,b3,b4},a4    ] 
= [   ( [A,a4]-[A]*k )*b1+1 , {b2,b3,b4},a4  ]
=[ [A,a4,b1] -[A]*k*b1 , {b2,b3,b4},a4 ]
=.....
= [ [A,a4,b1,b2,b3]-[A]*k*b1*b2*b3 ,a4   ]
=[ [A,a4,b1,b2,b3] *a4 -[A]*k*b1*b2*b3*a4 +1]
=[ [A,a4,b1,b2,b3] *a4 +1 -[A]*k*b1*b2*b3*a4 ]

从结果倒推,找[[A],a4,{B},a3] 形式
aj=ai+k ,a4=a3+k ,
[[A],a3,{B},a4]  
=[ [A,a4,b1,b2,b3] *a4 +1 -[A]*k*b1*b2*b3*a4 ] (上文,代入a4=a3+k)
=[ [A,a4,b1,b2,b3] *(a3+k) +1 -[A]*k*b1*b2*b3*a4 ]
=[ [A,a4,b1,b2,b3] *a3+[A,a4,b1,b2,b3]*k +1 -[A]*k*b1*b2*b3*a4 ]
=[ [A,a4,b1,b2,b3,a3]+[A,a4,b1,b2,b3]*k -[A]*k*b1*b2*b3*a4 ]
=[ [A,a4,b1,b2,b3,a3]+k*( [A,a4,b1,b2,b3] -[A]*b1*b2*b3*a4 ) ]


= [ [A,a4,B,a3+k] +1 - [A]*k*b1*b2*b3*a4 ]
=[ [A,a4,B] *(a3+k)+1 - [A]*k*b1*b2*b3*a4 ]
=[ [A,a4,B] *a3+1+[A,a4,B] *k - [A]*k*b1*b2*b3*a4  ]
=[   [A,a4,B,a3] + [A,a4,B] *k - [A]*k*b1*b2*b3*a4         ]
= [   [A,a4,B,a3] +  k* ( [A,a4,B] - [A]*b1*b2*b3*a4 )        ]
只需比较  [A,a4,B] - [A]*b1*b2*b3*a4  与0
( [A]*a4 +1 )*B+1 -[A]*b1*b2*b3*a4
=展开或者非常显然 >0

因此[[A],a3,{B},a4] >  [[A],a4,{B},a3]

设A={a1,a2...an} 
[A,ai] 
= [{a1,a2,...an} ,ai ]
=[a1,a2,a3...an,ai]
=[ a1*a2+1,a3...an,ai]
=[ ((a1*a2)+1 )*a3+1,....an,ai]
=[ [A],ai ]

(2)假设k=n时命题成立。

即在运算过程中,每次取序列中两个最小值进行运算,最后得到的值为序列的极大值。
令[a i a j ]= a i *a j +1,则数列a的最大极值  {a n}max=[ a1 a2…an
为了证明k=n+1成立,我们需要先证明一个引理。

——引理

设有数列集合A和B,正整数a i , a j ,且有A<a i < a j <B,
其中,B={b 1 , b 2 , …b m },{B}表示B中元素的任意组合序列,
则有[ [A] , a i , {B}, a ]> [ [A], a j , {B}, a ]。

引理证明:第一个表达式 用第二个表达的出来,比较差别

∵ai< aj,∵不妨设aj = ai +k, ai = aj – k // (k>0)

ai = aj – k

[[A], ai, {B}, aj]
= [[A], aj – k, {B}, aj]
= [[A]*(aj – k)+1, {B}, aj]
= [[A]*aj –[A]*k+1, {B}, aj] = [ [A]*aj+1 – [A]*k, {B}, aj]
=[ [A, aj] –[A]*k, {B}, aj]

将B={b1 , b2 , …bm }代入上式,并取B的[任意]一个次序

[[A], ai, B, aj] 
= [[A, aj] –[A]*k, b1 ,{ b2 , …bm}, aj]
= [([A, aj] –[A]*k)*b1 +1,{ b2 , …bm}, aj]
=[ [A, aj] *b1 –[A]*k*b1 +1,{ b2 , …bm}, aj]
= [ [A, aj,b1 ] –[A]*k*b1 ,{ b2 , …bm}, aj]
= [ [A, aj,b1 ,b2 ,…bm] –[A]*k*b1 * b2 *…*bm, aj]
= [ ([A, aj,b1 ,b2 ,…bm]–[A]*k*b1 * b2 *…*bm) * aj +1]
= [ [A, aj,b1 ,b2 ,…bm] * aj–[A]*k*b1 * b2 *…*bm* aj +1]

代入aj = ai +k,B= b1,b2,…bm
[[A], ai, B, aj] 
= [ [A, aj, B] * (ai+k)+1 –[A]*k*b1* b2*…*bm* aj]
= [ [A, aj, B] * ai+1+[A, aj, B] *k –[A]*k*b1* b2*…*bm* aj]
= [ [A, aj, B, ai] +[A, aj, B] *k –[A]*k*b1* b2*…*bm* aj]
= [ [A, aj, B, ai] + k * ([A, aj, B] –[A]*b1* b2*…*bm* aj)]
//证明+的这个  k * ([A, aj, B] –[A]*b1* b2*…*bm* aj)]>0

依据B次序的任意性,可得
[[A], a i ,{B}, a j ] = [ [A, a j , {B}, a i ] + k * ([A, a j , B] –[A]*b 1 * b 2 *…*b m * a j )]
因为[A, a j]=[A]* aj +1,所以[A, a j, B] >[A]*b1 * b2 *…*bm* a j ,//[ A aj B ]= ( [ A ]*aj +1 )*B+1 =[ A ] * aj*B +B +1
则必定有  [[A], a i ,{B}, a j ] > [A, a j , {B}, a i ]
∴引理成立。
引理推广
[{A}, a i ,{B}, a j ] > [{A}, a j , {B}, a i ] 当 [{A}]<a i < a j <[{B}]
A的任意顺序 

引理:[ [A] , ai, {B}, a]> [ [A], aj, {B}, a]。

根据计算可以得出  [A , ai ] = [  [A], ai ]

但是[ai,A] != [ai,[A] ]

比如[ai ,a1,a2]= (ai*a1+1)*a2+1 =ai*a1*a2+ai*a1+a2+1

[ai,[A]]=ai*(a1*a2+1)=ai*a1*a2+ai

【引理】 设有数列集合A和B,正整数a i , a j ,且有[A]<a i < a j <[{B}],
其中,B={b 1 , b 2 , …b m },{B}表示B中元素的任意组合序列,则
有[[A], a i , {B}, a j ]> [[A], a j , {B}, a i ]。
可以数字1~4为例,根据引理必有
[[1, 2, 3], 4] > [[1, 2, 4], 3] > [[1, 3, 4], 2] > [[2, 3, 4], 1] //两项同样适用
求证:新加入一个元素 按照数列里最小值优先组合的规则,仍可以得到最大值。
证:前n个步骤得到数列A的第n阶段极大值[A n ]

依据 任意性可知,加入一个新元素  按数列元素最小值优先组合的规则,仍可以得到最大值。则k=n+1时命题成立

计算模型

(1)存储 用数组a[n]来数列
(2)计算
取最小值和第二小值: v min =min{a[n]}, v mins =min{{a[n]}-{v min }}
取最大值和第二大值: v max =max{a[n]}, v maxs =max{{a[n]}-{v max }}
极大值计算:a[v min ]=a[ v min ]*a[ v mins ]+1 //这里vmin是下标
极小值计算:a[v max ]=a[v max ]*a[v maxs ]+1
用最后一个元素覆盖a[ v mins ]或a[v max

代码:

#include<bits/stdc++.h>
using namespace std;
//堆排序 -完全二叉树 
/*01   23  4 5 6 
*/void show(int a[],int n)
{for(int i=0;i<n;i++){cout<<a[i]<<"\t";}cout<<endl<<endl;
}void min_h(int a[],int start,int end)
{//建立父节点指针和子节点指针int f=start;///父节点 int c=f*2+1;//左孩子 int t;//用于交换的临时变量 while(c<=end)//若子节点指针在范围内,进行比较 {//找到最小值的下标 if(c+1<=end && a[c]>a[c+1])//右孩子在范围中,左孩子>右孩子 {c++;}//选中左右孩纸中较小值 //如果父节点 < 子节点 //此时 父<右<左 调整完成 if(a[f]<a[c])return;else//交换 父>右 左>右 ,右是最小的 换到父节点上去 {t=a[f];a[f]=a[c];a[c]=t;f=c;c=f*2+1;}}
}
void min(int a[],int n)
{//初始化 i从最后一个父节点开始调整for(int i=n/2-1;i>=0;i--){min_h(a,i,n-1);} for(int i=n-1;i>0;i--){swap(a[0],a[i]);min_h(a,0,i-1);}
}
int cal(int a[], int n)
{int v1=0,v2=1;while (n > 2){show(a,n);min(a, n);//maxa[v1] = a[v1] * a[v2] + 1;a[v2] = a[n-1];//下次还需排序,因此不用在意顺序,直接将最后一个向前移动n = n - 1;//数目--}//此时n==2return a[0] * a[1] + 1;
}
int main()
{int n = 4;int a[4] = { 8,2,1,3 };cout<<"最大极差:" << cal(a, n);return 0;
}

【例7-3】最优装载。

有一批集装箱准备装上轮船,编号依次 为1, 2, …, n,其中集装箱i的重量是w i,i=1, 2,…, n。已知轮船最 多装载量是C,每个集装箱的重量w i≤C,且对集装箱无体积限 制,设计算法求如何选择能够使得装上的集装箱个数最多。

问题分析

 贪心策略:轻者优先

算法设计与描述

算法分析

输入:(1)问题输入规模为n
输出:

(2)选择集装箱是主要工作,时间渐进复杂度T(n)=n

(3)排序最快的时间复杂度T(n)=O(nlogn)

(4)上述(2)(3)是并列执行的,按照第2章的定理2.2可知时间渐进复杂度T(n)=O(nlogn)

t[]数组存放集装箱的原始编号。通过t 找到x 下标变量

【例7-4】键盘输入

键盘输入一个高精度的正整数N,去掉其中任意
S个数字后剩下的数字按原左右次序将组成一个新的正整
数。对给于定的N和S,寻找一种方案使得剩下的数字组成
的新数最小。
输出:包括所去掉数字的位置和组成的新正整数
问题分析
(1) 高位的数字尽量小
(2) 删除策略(贪心):删除高位较大的数字,相邻
两位比较若高位比低位大则删除高位。
(3) 枚举归纳,如当s=3时,输入如下符串:
n1=“1 2 4 3 5 8 6 3”
n2=“2 3 1 1 8 3 1”
n3=“1 2 3 4 5 6 7”
n4=“1 2 0 0 8 3”
=》
n1=“1 2 3 5 3”
n2=“2 1 1 1”        应该是1131 需要回溯,只需向上回溯一位
n3=“1 2 3 4 5 6 7”     应该直接划掉后三个    没删除, 有木有 
n4=“1 0 0 3”        没删够, 有木有
(4) 物理删除:覆盖已删除的字符,字符串长度改变。

计算模型

(1)存储 a[]存储字数N,data[]记录删除的元素在原
数字中位置;存在一位回溯的操作,设置变量j1来记
住上一次删除的位置。//因为删除,本身位置就变了,不记住,无法找到位置
(2)计算 删除a[i]=a[i+1],n=n-1。i为数列下标 记录删除位置 //i是几,就删除几次
data[i]=j+i, j1=j, if j≥j1        //不是回溯
data[i] =data[i-1]-1, if j<j1        //回溯位
其中,i为删除次数,j为数列下标
1.删除高位里的大值
2.回溯一位
3.末尾剩几个砍几个
4.高位0

代码:

#include<bits/stdc++.h>
using namespace std;int n = 6;//长度
int s = 3;//要删除的数字个数
char a[] = { '1','2','0','0','8','3' };//数字 
int data[3] = { 0 };//记录删除的元素在原数字中的位置 void show(char a[])
{for(int i=0;i<strlen(a);i++)cout<<a[i]<<'\t';cout<<endl;
}
void del(char a[], int b, int k)//删除,物理覆盖 
{for (int i = b; i < strlen(a); i++){a[i] = a[i + k];}
}
void delD(char a[], int s)
{int i = 0, j = 0, j1 = -1;//存在回溯 int len = strlen(a);//截止到\owhile (i < s && j < strlen(a)){show(a);while (a[j] <= a[j + 1])//一直是前面小 {j++;}//前面大于后面if (j < strlen(a)){//删除a[j]del(a, j, 1);//删除次数 i  if (j >= j1)data[i] = j + i;//删除的第i个元素,在原数组中的位置是j+i else data[i] = data[i - 1] - 1;//回溯,回溯到上一个删除位置 的前一个位置 //j1 = j;i++;j--;if (j < 0)j = 0;}}//显示的时候高位的0不显示 while (a[0] == '0' && strlen(a))		del(a, 0, 1);}int main()
{delD(a, s);cout<<"位置"<<endl;for(int i=0;i<s;i++){cout<<data[i]<<"\t";}cout<<endl<<"新整数";for (int i = 0; i < n-s; i++)cout << a[i];return 0;
}

近似贪心问题

局部最优 达不到 全局最优

相关文章:

【算法设计与分析zxd】第7章 贪心法

贪心算法的设计技术 • 每一步的判断都是一个当前最优的抉择&#xff0c;这个抉择计算设计的好坏&#xff0c;决定了算法的成败。 • 多步判断过程&#xff0c;最终的判断序列对应于问题的最优解 • 适用于 能够 由 局部最优达到全局最优的优化问题 【比如 求最短哈密顿回路的…...

CCF CSP认证 历年题目自练Day35

题目一 试题编号&#xff1a; 202305-1 试题名称&#xff1a; 重复局面 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任意一方提出和棋。 问题…...

应用crash时发送广播及信息

一、环境 高通865 Android 10 二、情景 应用崩溃时&#xff0c;将奔溃信息以广播的形式发送 二、代码位置 frameworks/base/core/java/com/android/internal/os/RuntimeInit.java private static class KillApplicationHandler implements Thread.UncaughtExceptionHandle…...

【亲测可用】图像目标识别入门-利用笔记本电脑摄像头识别人脸标记出来采用深度学习模型实现

更高的精度和准确性&#xff0c;可以考虑使用基于深度学习的人脸检测和识别方法&#xff0c;例如基于人脸特征的人脸检测器和具有高识别率的人脸识别模型。下面是使用基于深度学习的人脸检测和识别方法的代码示例&#xff1a; 首先&#xff0c;安装必要的库和模型&#xff1a;…...

数字孪生技术:煤矿运输的未来革命

煤矿是我国能源工业的重要支柱&#xff0c;然而&#xff0c;煤矿运输过程中一直存在着诸多问题&#xff0c;如安全隐患、能源浪费、效率低下等&#xff0c;这不仅对煤矿行业的可持续发展构成威胁&#xff0c;也对环境造成负面影响。因此&#xff0c;数字孪生技术应运而生&#…...

一些bug总结

今天被几个小问题和bug折磨了一天&#xff0c;来总结一下… 权限问题 用vscode连接服务器&#xff0c;如果是在root用户连接的情况下新建的文件/文件夹&#xff0c;然后切换到别的用户的时候去写的代码 可能会遇到各种问题 解决方案是更改文件或文件夹的所有权。这可以通过使用…...

第三章 内存管理 九、基本分段存储管理方式

目录 一、概括 二、什么是分段 三、段表 四、地址转换 五、分段和分页的对比 六、总结 一、概括 基本分段存储管理方式是一种操作系统的内存管理方式&#xff0c;采用这种方式&#xff0c;将进程所需的内存分成若干个段&#xff0c;每个段都可以单独进行管理和保护。 具…...

轻重链剖分+启发式合并专题

Codeforces-741D(Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths) 一棵根为1 的树&#xff0c;每条边上有一个字符&#xff08;a-v共22种&#xff09;。 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串。 求每个子树中…...

IRC/ML:金融智能风控—信贷风控场景简介、两大场景(贷款场景+信用卡场景)、信用卡评分模型设计、反欺诈检测技术的简介、案例应用之详细攻略

IRC/ML:金融智能风控—信贷风控场景简介、两大场景(贷款场景+信用卡场景)、信用卡评分模型设计、反欺诈检测技术的简介、案例应用之详细攻略 目录 信贷风控简介 信贷风控两大场景...

【学习笔记】RabbitMQ01:基础概念认识以及快速部署

参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 一、认识RabbitMQ1.1 消息中间件&#xff08;MQ Message Queue 消息队列1.2 主流的消息中间件1.3 MQ的应用场景1.3.1 异步处理1.3.2 系统解耦1.3.3 流量削峰1.3.4 日志处理 二、RabbitMQ运行环境搭建…...

Java数据结构之第二十章、手撕平衡AVL树

目录 一、二叉平衡树 1.1二叉搜索树回顾以及性能分析 1.1.1二叉搜索树的概念 1.2二叉搜索树的查找 1.3二叉树查询性能分析 二、AVL树 2.1AVL树的概念 2.2AVL树节点的定义 2.3AVL树的插入 2.4AVL树的旋转 2.4.1新节点插入较高左子树的左侧---右单旋 2.4.2新节点插入较…...

SQL 在PostgreSQL中使用SQL将多行连接成数组

在本文中&#xff0c;我们将介绍如何使用SQL语言在PostgreSQL数据库中将多行数据连接成一个数组。在开发和分析应用程序时&#xff0c;我们经常需要将数据库中的多个行合并为一个&#xff0c;以便更方便地进行处理和分析。PostgreSQL提供了一种名为ARRAY_AGG的聚合函数&#xf…...

Ajax技术实现前端开发

一、原生AJAX 1.1AJAX 简介 AJAX 全称为Asynchronous JavaScript And XML,就是异步的JS 和XML。 通过AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。 AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。 1.2XML 简介 XML 可扩…...

WebMail:网页注册成功发送邮件

1.特别注意 isELIgnored"false" 如果没有这个El表达式无法识别 2.pre work pox.xml <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>…...

Electron之集成vue+vite开发桌面程序

在electron中集成vue开发桌面程序 使用我们之前创建的electron项目 创建vue 项目 命令行进入electron根目录 执行下面命令 npm create vitelatest vue -- --template vue这样就创建了一个vue项目&#xff0c;文件名是vue&#xff0c;命令行进入vue下&#xff0c;执行下面命…...

pycharm社区版创建Django项目的一种方式

pycharm社区版创建Django项目 pycharm创建New project安装django&#xff0c;如果安装过可略过安装完成后查看安装情况生成Django项目需要的文件这里注意生成语句后面的 . 不可以省略 生成文件后&#xff0c;框架搭建完成&#xff0c;配置启动我这里在配置完后&#xff0c;报了…...

Python configparser模块使用教程

文章目录 .ini 拓展名文件简介.ini 文件格式1. 节2. 参数3. 注解 configparser 模块简介configparser 模块的初始化和读取获取 ini 中所有 section获取 section 下的 key获取 section 下的 value获取指点section的所用配置信息修改某个key&#xff0c;如果不存在则会出创建检查…...

Kotlin + 协程 + Room 结合使用

文章目录 前言集成Room结合协程的使用总结 一、前言, 现在kotlin 是趋势&#xff0c;那必然就要用到协程&#xff0c;还有就是随着jetpack 的发力&#xff0c;带来了很多好用的库&#xff0c;比如今天提到Room&#xff0c;是一个类似greenDao的数据库。它不但支持kotlin协程…...

网工记背命令(6)----链路聚合配置

目录 1.配置手工负载分担模式链路聚合 2.配置LACP模式的链路聚合 3.HUAWEI设备与C厂商设备对接 链路聚合&#xff08;Link Aggregation&#xff09;是将多条物理链路捆绑在一起成为一条逻辑链路&#xff0c;从而增加链路带 宽的技术。 常用配置命令 1、执行命令 interface …...

使用 Service 把前端连接到后端

使用 Service 把前端连接到后端 如何创建前端&#xff08;Frontend&#xff09;微服务和后端&#xff08;Backend&#xff09;微服务。后端微服务是一个 hello 欢迎程序。 前端通过 nginx 和一个 Kubernetes 服务暴露后端所提供的服务。 使用部署对象&#xff08;Deployment ob…...

vue 如何优化首页的加载速度?vue 首页白屏是什么问题引起的?如何解决呢?

vue 如何优化首页的加载速度&#xff1f; 路由懒加载ui框架按需加载gzip压缩 vue首页白屏是什么问题引起的 第一种&#xff0c;打包后文件引用路径不对&#xff0c;导致找不到文件报错白屏 解决办法&#xff1a;修改一下config下面的index.js中bulid模块导出的路径。因为in…...

Android平台GB28181设备接入模块之SmartGBD

大牛直播SDK研发的Android平台GB28181设备接入SDK&#xff08;SmartGBD&#xff09;&#xff0c;可实现不具备国标音视频能力的 Android终端&#xff0c;通过平台注册接入到现有的GB/T28181—2016服务&#xff0c;可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育…...

JVM第十三讲:调试排错 - JVM 调优参数

调试排错 - JVM 调优参数 本文是JVM第十三讲&#xff0c;调试排错 - JVM 调优参数。对JVM涉及的常见的调优参数和垃圾回收参数进行阐述。 文章目录 调试排错 - JVM 调优参数1、Jvm参数2、垃圾回收 问题1&#xff1a;线上ECS治理问题2&#xff1a;白龙马线上服务机JVM参数配置&a…...

Android Gradle权威指南读书笔记

第一章 Gradle入门 生成Gradle Wrapper 命令&#xff1a;gradle wrapper --gradle-version 版本号自定义Gradle Wrapper task wrapper(type : Wrapper) { gradleVersion 2.4 archiveBase GRADLE USER HOME archivePath wrapper/dists distributionBase GRADLE USER HOME …...

顺子日期(蓝桥杯)

文章目录 顺子日期问题描述答案&#xff1a;14字符串解题CC语言指针C语言函数 数组解题 顺子日期 问题描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小明特别喜欢顺子。顺子指的就是连续的三个数字&#xff1a;123、…...

攻防世界web篇-unserialize3

得出php代码残篇 将代码补全后再在线php运行工具中进行运行 在浏览器输入后得到下面的界面 这里需要将O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;} 改为 O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}...

微信小程序 onLoad和onShow的区别

在微信小程序中&#xff0c;onLoad() 和 onShow() 是两个常用的生命周期函数&#xff0c;用于监听页面的加载和显示事件。这两个函数的区别如下&#xff1a; 触发时机 onLoad() 函数只会在页面加载时触发一次&#xff0c;而 onShow() 函数每次页面显示时都会被触发。因此&#…...

elementui select组件下拉框底部增加自定义按钮

elementui select组件下拉框底部增加自定义按钮 el-select组件的visible-change 事件&#xff08;下拉框出现/隐藏时触发&#xff09; <el-selectref"select":value"value"placeholder"请选择"visible-change"visibleChange">&…...

深入理解闭包:原理、应用与最佳实践

1、 什么是闭包&#xff1f; 如果一个函数内部定义了另一个函数&#xff0c;并且内部函数引用了外部函数的变量&#xff0c;那么内部函数就形成了一个闭包。 def outer_function(x):# 外部函数接受一个参数 x 是自由变量# seed 也是一个自由变量seed 10def inner_function(y…...

[NSSCTF 2nd]Math

原题py&#xff1a; from secret import flag from Crypto.Util.number import * import gmpy2length len(flag) flag1 flag[:length//2] flag2 flag[length//2:] e 65537m1 bytes_to_long(flag1) p getPrime(512) q getPrime(512) n p*q phi (p-1)*(q-1) d gmpy2.i…...

做ppt模板网站/百度百科入口

http://rcv.kaist.ac.kr/~ail/...

网站备案转移/百度seo高级优化

Ubuntu16.04安装搜狗输入法及快捷区域截图 更新软件列表及软件 官方提供的ubuntu16.04硬盘映像中部分软件列表及软件不是最新的&#xff0c;因此安装好Ubuntu后首先应该更新软件列表及软件。 更新软件列表 sudo apt-get update更新软件 sudo apt-get upgrade安装搜狗输入法…...

专业的河南网站建设公司/搜狗站长管理平台

Hive 常用函数备忘 1.转换函数 cast (value as type) , 显式的将一个类型的数据转化为另一种类型的数据, 若不能进行转化则返回 null 值. select cast(salary as char(1));返回一个char类型的salary, 若不能进行转化则返回null值.2.条件判断函数 case [...] when ... then …...

wordpress程序版本/怎么推广游戏代理赚钱

文章目录0 效果1 实现1.1 创建名称和位置1.2 关联信号和槽函数1.3 编写事件0 效果 开始&#xff1a; 中间步骤 结束&#xff1a; 1 实现 1.1 创建名称和位置 在ui设计界面新建需要的菜单名称 1.2 关联信号和槽函数 找到对象的名称 在类的构造函数中编写函数&#x…...

沈阳 网站建设/网站网页设计

前言&#xff1a;打脸了&#xff0c;前脚刚说过要跟Servlet正式告别。结果最近的面试被问到了同一个Servlet可不可以被映射到多个URL上&#xff0c;也就是如何用一个Servlet实现多个功能。 前置知识&#xff1a; Servlet容器如何处理请求资源路径&#xff1f; 1、这个地址 ht…...

整人关不掉的网站怎么做/外贸营销型网站设计

calendar是与日历相关的模块&#xff0c;calendar模块文件里定义了很多类型&#xff0c;主要有Calendar&#xff0c;TextCalendar以及HTMLCalendar类型。其中&#xff0c;Calendar是TextCalendar与HTMLCalendar的基类。该模块文件还对外提供了很多方法&#xff0c;例如&#xf…...