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

【数据结构】(Python)差分数组。差分数组与树状数组结合

差分数组:

  • 基于原数组构造的辅助数组。
  • 用于区间修改、单点查询。区间修改的时间复杂度O(1)。单点查询的时间复杂度O(n)。
  • 差分数组的元素:第一个元素等于原数组第一个元素,从第二个元素开始是原数组对应下标的元素与前一个元素的差(即原数组相邻元素的差)。
  • 区间修改:通过修改差分数组中区间的两端点,可快速地修改原数组中整个区间的值。具体操作:修改差分数组中起始下标的元素,恢复结束下标的后一个元素。
  • 单点查询:通过差分数组查询原数组中的元素。具体操作:差分数组中从开头到对应下标元素的累和(前缀和)。
  • 注:① 差分与前缀和互为逆运算(差分数组是原数组的差分,原数组是差分数组的前缀和)② 本文原数组为a,差分数组为d,下标均从0开始。
  • 补充:二维差分数组,类似一维差分数组,注意行和列。
  • 补充:差分数组结合树状数组,可提高效率,也可实现区间修改、区间查询

 


差分数组的元素:

  • 差分数组的第一个元素(下标0):原数组的第一个元素(下标0)。即d[0]=a[0]。
  • 差分数组的下标i 的元素:原数组的下标i 的元素与前一个元素的差。即d[i]=a[i]-a[i-1]。
# a为原数组,d为差分数组
n = len(a)
d = [0] * n        # 差分数组初始化
d[0] = a[0]
for i in range(1, n):d[i] = a[i] - a[i - 1]

aa097780b3194d5cabbb07b91a0cb283.png

 


区间修改:区间[l,r]

通过修改差分数组中区间的两端点,可快速修改原数组中整个区间的值。

  • 目标:原数组下标l到下标r都修改。例如:区间[l,r]的元素都+val,即a[l]+val,a[l+1]+val,...,a[r]+val。
  • 具体操作:修改差分数组中区间两端点的值,即差分数组下标l修改、下标r+1恢复。例如:d[l]+val,d[r+1]-val。

此处,区间修改由update函数实现。参数:l为区间起始(左侧)下标,r为区间结束(右侧)下标,val为值(例如:增加的值)。

def update(l:int, r:int, val:int):"""区间修改。l为区间起始(左侧)下标,r 为区间结束(右侧)下标,val为值"""d[l] += vald[r + 1] -= val

91f6cba6118542bb9c807b4546aefb01.png

 


单点查询(前缀和):

通过差分数组,查询原数组中的元素。

  • 方法一:前缀和。原数组下标i 的元素为差分数组从下标0到下标i 的元素累和。即a[i]=d[0]+d[1]+...+d[i]。
  • 方法二:原数组下标i 的元素为原数组下标i-1 的元素加上差分数组下标i 的元素。即a[i]=a[i-1]+d[i]。
  • 注:原数组第一个元素等于差分数组第一个元素,即a[0]=d[0]。

此处,单点查询由query函数实现。参数:i为下标。

# 方法一:前缀和
def query(i:int):"""单点查询。i为下标,ans为合计"""ans = 0while i >= 0:ans += d[i]i -= 1return ans# 方法二
a[0] = b[0]
# n为数组长度
for i in range(1, n):a[i] = a[i - 1] + d[i]

620ffe09f9654241abaca72afb893f96.png

 


补充:二维差分数组:

注:为了便于二维差分数组的理解,此处,二维原数组第一行(行下标0)和第一列(列下标0)的元素均为0。对应二维差分数组的第一行(行下标0)和第一列(列下标0)的元素也均为0。

1、二维差分数组的元素:

# a为二维原数组,d为二维差分数组
n = len(a)            # 矩阵行数
m = len(a[0])         # 矩阵列数
for i in range(1, n):for j in range(1, m):d[i][j] = a[i][j] - a[i - 1][j] - a[i][j - 1] + a[i - 1][j - 1]

4190b28bb74c4c23b96749da3004f4a8.png

 

2、二维差分数组的区间修改:

通过修改差分数组矩阵端点的值,修改原数组整个矩阵区间的值。

def update(i1:int, j1:int, i2:int, j2:int, val:int)"""(矩阵)区间修改。(i1,j1)为矩阵起始位置,(i2,j2)为矩阵结束位置"""d[i1][j1] += vald[i2 + 1][j1] -= vald[i1][j2 + 1] -= vald[i2 + 1][j2 + 1] += val

6ce594639ac94ce0897c9308523af62e.png

 

3、二维差分数组的单点查询(前缀和):

通过差分数组,获取原数组中的元素。

  • 方法一:原数组(i, j)的值为从差分数组开头位置(0, 0)到对应位置(i, j)的所有元素的总和。即a[i][j]=d[0][0]+d[0][1]+...+d[0][j]+d[1][0]+d[1][1]+...+d[1][j]+...+d[i][0]+d[i][1]+...+d[i][j]。
  • 方法二:原数组(i, j)的值为原数组前一行(i-1,j)和原数组前一列(i, j-1)与差分数组中(i, j)的总和。但因原数组(i-1, j)和原数组(i, j-1)两个元素均加上了原数组(i-1, j-1)的值,需减除多加的一次。即a[i][j]=a[i- 1][j] + a[i][j - 1] - a[i - 1][j - 1] + d[i][j]。
def query(i:int, j:int, a:list):"""查询原数组的值。i为行下标,j为列下标,a为原数组"""return a[i- 1][j] + a[i][j - 1] - a[i - 1][j - 1] + d[i][j]

ec55ebd36cdb4392a00eaad833e6b2b9.png

 


案例:【力扣】

(难度:中等)1109. 航班预订统计

c84fb0f693ef4ddd84ce5ce515164496.png

【Python3】设置差分数组(元素都为0),使用差分数组修改航班区间两端点进行修改整个区间,再计算差分数组的前缀和。

注意:航班编号从1开始,差分数组下标从0开始。

class Solution:def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:# 差分数组d = [0] * nfor l, r, val in bookings:d[l - 1] += valif r < n:d[r] -= val# 计算差分数组的前缀和res = [0] * nres[0] = d[0]for i in range(1, n):res[i] = res[i - 1] + d[i]return res

可以在差分数组的基础上直接计算前缀和,无需额外占用内存空间开辟新数组。

class Solution:def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:# 差分数组d = [0] * nfor l, r, val in bookings:d[l - 1] += valif r < n:d[r] -= val# 在差分数组的基础上,直接计算前缀和for i in range(1, n):d[i] += d[i - 1]return d

注:差分数组结合树状数组,可提高效率。题解详见本文“差分数组和树状数组的结合”中的案例。

 

(难度:困难)1526. 形成目标数组的子数组最少增加次数

cb7a8842a6dc4551a9fefda8fc9c0e82.png

【Python3】

解题思路:反向思考,使用差分数组将目标数组的所有元素都变为0。差分数组中的元素都变为0,则对应目标数组的元素也都为0。(因目标数组中的元素是差分数组中元素的前缀和)

  • 根据提示,已知目标数组的元素都为正数,则其差分数组的合计(即目标数组中最后一个元素)一定为正数。
  • 差分数组的第一个元素(即目标数组的第一个元素)也一定为正数。差分数组的其他元素值(差分值)若为负数,则其左侧必定有差分值为正数。
  • 区间修改时,修改差分数组中区间起始下标的值和恢复区间结束下标后一个的值。本题中差分数组的区间起始下标的值减1,区间结束下标后一个的值加1。

本题,统计操作次数即为统计差分值为正数的总和。

  • 若差分值是正数,正数是多少 就操作多少次(每次减1),最终变为0。
  • 若差分值为负数,则其左侧的正数差分值减1的同时 其会加1,最终变为0,无需统计操作次数。
  • 若正数差分值的合计比负数差分值的合计多,则多的正数差分值减1时,虚拟的(不存在)下标n的值加1。
  • 因差分数组的合计为正数,则不存在负数差分值的合计比正数差分值的合计多。

3acae12812c442ac94ffd371737202cd.png

class Solution:def minNumberOperations(self, target: List[int]) -> int:n = len(target)# 差分数组d = [0] * n       # 差分数组初始化d[0] = target[0]for i in range(1, n):d[i] = target[i] - target[i - 1]# 统计操作次数(统计差分值为正数的总和)ans = 0# 遍历差分数组for i in range(n):# 差分值为正数,则为该元素变为0的操作次数ans += max(d[i], 0)return ans

(简化) 可以不额外占用内存开辟差分数组。可以遍历目标数组时,依次计算对应的差分值,并判断且统计操作次数。时间复杂度O(n),空间复杂度O(1)。

class Solution:def minNumberOperations(self, target: List[int]) -> int:n = len(target)# ans统计操作次数,初始为目标数组第一个元素值ans = target[0]# 从下标1开始遍历目标数组,获取对应下标的差分值for i in range(1, n):# 差分值为正数,则为该元素变为0的操作次数ans += max(target[i] - target[i - 1], 0)return ans

 


差分数组和树状数组的结合:

差分数组中,区间修改的时间复杂度为O(1),但单点查询的时间复杂度O(n)。为提高查询的效率,结合树状数组,时间复杂度为O(logn)。

  1. 原数组a通过差分获得差分数组d。
  2. 通过树状数组t的单点修改(树状数组维护)来维护差分数组d。
  3. 使用差分数组的区间修改,而差分数组的区间两端点的修改都通过树状数组的单点修改来完成。
  4. 使用树状数组的单点查询(前缀和)获得差分数组的前缀和即原数组中的元素,以此实现差分数组的单点查询。
  5. 补充:若再额外维护一个数组e,可使用树状数组的单点查询(前缀和)获取原数组的前缀和,实现区间查询。
  6. 注意:原数组a、差分数组d、数组e的下标从0开始,树状数组下标从1开始。

 1、差分数组(初始化,维护差分数组的元素)

# 差分数组初始化
n = len(a)
d = [0] * n
# 维护差分数组的元素
d[0] = a[0]
for i in range(1, n):d[i] = a[i] - a[i - 1]

2、树状数组(初始化,维护树状数组的元素)

  • 树状数组下标从1开始,为方便操作,树状数组长度n+1(下标0存在但不使用)。
  • 差分数组下标 i,树状数组下标 i+1。
  • 使用树状数组维护差分数组,此时参数val为差分数组的元素。
  • 即树状数组维护差分数组update(i+1,d[i])。
# 树状数组
n = len(a)
t = [0] * (n + 1)         # 树状数组初始化,下标从1开始(为方便操作,下标0存在但不使用)# 树状数组的单点修改(使用树状数组维护差分数组,因此,val为差分数组的元素)
def update(i:int, val:int):"""树状数组中的单点修改(树状数组维护)"""while i <= n:t[i] += vali += i & -i        # lowbit函数:i & -i,此处未单独设置函数# 实际维护执行
for i in range(n):update(i + 1, d[i])    # 树状数组下标从1开始

3、差分数组的区间修改(通过树状数组的单点修改完成)

差分数组的区间修改,只需修改差分数组中的区间两端点。而此处,区间两端点则都通过树状数组的单点修改完成。

注意下标。

# 差分数组的区间修改:(区间[l,r],修改值val)
# 此处区间为树状数组对应的下标,而差分数组对应区间为[l-1, r-1]
update(l, val)
update(r + 1, -val)

  4、树状数组的前缀和(获取原数组中的元素)

通过树状数组的前缀和(区间查询,区间[1,i])来获得差分数组的前缀和,而差分数组的前缀和为原数组中的元素。

以此实现差分数组的单点查询。

  • 差分数组下标 i,树状数组下标 i+1。
# 树状数组的前缀和(区间查询,区间[1,i])
def query(i:int):"""树状数组中计算前缀和"""ans = 0while i > 0:ans += t[i]i -= i & -i            # lowbit函数:i & -i,此处未单独设置函数return ans# 实际查询执行
a[i] = query(i + 1)            # 查询原数组中下标i的值

 案例:【力扣】

(难度:中等)1109. 航班预订统计

c84fb0f693ef4ddd84ce5ce515164496.png

【Python3】差分数组和树状数组结合。即使用树状数组维护差分数组,使用差分数组的区间修改来快速修改整个区间的元素(通过树状数组的单点修改完成),再通过树状数组计算前缀和。

# 类BIT(即树状数组)
class BIT:def __init__(self, n:int):self.n = nself.t = [0] * ndef update(self, i:int, val:int):"""单点修改"""while i < self.n:self.t[i] += vali += i & -i           # lowbit函数:i & -i。此处未单独设置函数 def query(self, i:int):"""前缀和"""ans = 0while i > 0:ans += self.t[i]i -= i & -i           # lowbit函数:i & -i。此处未单独设置函数return ansclass Solution:def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:# 使用树状数组维护差分数组(初始元素都为0)bitree = BIT(n + 1)# 差分数组的区间修改(使用树状数组的单点修改完成)for l, r, val in bookings:# 修改差分数组的区间起始的元素bitree.update(l, val)# 恢复区间结束的下一个元素。若区间结束元素是差分数组的最后一个元素,则无需恢复if r < n: bitree.update(r + 1, -val)# 差分数组的前缀和res = [0] * nfor i in range(n):res[i] = bitree.query(i + 1)return res

 

补充:5、额外维护数组e(可获取原数组的前缀和)

使用两个树状数组分别维护差分数组和数组e,可实现区间修改、单点查询、区间查询。

3d67fb5f76c6460eb101e6b359da5d88.png

  1. 原数组a通过差分获得差分数组d,并初始化数组e。
  2. 使用树状数组分别维护差分数组d和数组e。
  3. 区间修改,差分数组的区间两端点的修改都通过树状数组的单点修改来完成。同时数组e的区间也要做相应修改。
  4. 使用树状数组的单点查询(前缀和)获得差分数组的前缀和即原数组中的元素,以此实现单点查询。
  5. 使用树状数组的单点查询(前缀和)获得原数组的前缀和,以此实现区间查询。

因:原数组的前缀和:s[i] = a[0] + a[1] +...+ a[i]

        差分数组的前缀和(原数组的元素):a[i] = d[0] + d[1] +...+ d[i]

因此:s[i] = a[0] + a[1] +...+ a[i]

                 = d[0] + (d[0] + d[1]) + ...+ (d[0] + d[1] +...+ d[i])

                 = (i+1)* (d[0] + d[1] +...+ d[i]) - (0 * d[0] + 1 * d[1] + ...+ i * d[i])

                 = eq?%28i%20&plus;%201%29%20*%20%5Csum%20d%5Bi%5D%20-%20%5Csum%20i%20*%20d%5Bi%5D

其中,eq?%5Csum%20d%5Bi%5D为差分数组的前缀和,则维护额外的数组e(元素为 i * d[i]),获取数组e的前缀和。

注意:原数组a和差分数组d和数组e下标从0开始。而树状数组下标从1开始,注意实际对应下标。

 (5-1)差分数组d和数组e的初始化,以及维护差分数组元素

# 差分数组d和数组e初始化,a为原数组
n = len(a)
d = [0] * n
e = [0] * n# 维护差分数组元素
d[0] = a[0]
for i in range(1, n):d[i] = a[i] - a[i - 1]

(5-2)两个树状数组的初始化,以及使用树状数组维护差分数组d和数组e

  • 两个树状数组分别用于维护差分数组(元素d[i])和数组e(元素 i * d[i])。
  • 差分数组和数组e下标 i,树状数组下标 i+1。
# 两个树状数组初始化
n = len(a)
t1 = [0] * (n + 1)         # 用于维护差分数组d
t2 = [0] * (n + 1)         # 用于维护数组edef update(i:int, val:int, t:list):"""树状数组中的单点修改(树状数组维护)"""while i <= n:             # 此处,树状数组的长度为n+1,最后一个元素下标为nt[i] += val           # t为树状数组i += i & -i           # lowbit函数:i & -i,此处未单独设置函数# 实际维护执行
# 差分数组和数组e的下标都从0开始,树状数组下标从1开始
for i in range(n):update(i + 1, d[i], t1)                # 维护差分数组dupdate(i + 1, d[i] * i, t2)            # 维护数组e

(5-3)差分数组的区间修改(使用树状数组的单点修改完成)

  • 树状数组区间[l,r],树状数组修改下标 l 和下标 r+1。
  • 即差分数组和数组e对应区间[l-1, r-1],差分数组和数组e中对应修改 下标 l-1 和下标 r。
  • 注意:数组e的元素为d[i]*i。差分数组修改的同时,数组e也修改,且数组e的修改值需乘以对应下标 i 。
# 差分数组的区间修改(使用树状数组的单点修改完成),区间[l,r]
# 树状数组下标从1开始,原数组和差分数组和数组e下标从0开始。
# 此处区间为树状数组对应的下标,而差分数组和数组e对应区间为[l-1, r-1]
update(l, val, t1)
update(r + 1, -val, t1)
update(l, val * (l - 1), t2)       # 树状数组下标为l,而数组e对应下标为l-1
update(r + 1, -val * r, t2)        # 树状数组下标为r+1,而数组e对应下标为r

 (5-4)前缀和(获取原数组中的元素,以及获取原数组的前缀和)

  1. 通过树状数组获取差分数组的前缀和,差分数组的前缀和为原数组中的元素,即a[i] = d[0]+d[1]+...+d[i]。
  2. 通过树状数组获取原数组的前缀和,即eq?s%5Bi%5D%20%3D eq?%28i%20&plus;%201%29%20*%20%5Csum%20d%5Bi%5D%20-%20%5Csum%20i%20*%20d%5Bi%5D,此公式 i 从0开始。
  3. 原数组下标 i,树状数组下标 i+1。
def query(i:int, t:list):"""树状数组中计算前缀和"""ans = 0while i > 0:ans += t[i]           # t为树状数组i -= i & -i           # lowbit函数:i & -i,此处未单独设置函数return ans# 树状数组下标从1开始,原数组和差分数组和数组e下标从0开始
# 实际获取原数组的值
for i in range(n):a[i] = query(i + 1, t1)# 实际获取原数组的前缀和
for i in range(n):s[i] = (i + 1) * query(i + 1, t1) - query(i + 1, t2)

 (5-5)区间和(获取原数组的区间和)

获取原数组的区间[l,r]的元素和,即s[l,r]=s[r]-s[l-1]。

因树状数组下标从1开始,原数组下标从0开始。对应树状数组的区间为[l+1,r+1]。

def range_query(l:int, r:int):"""获取原数组的区间[l,r]的元素和,s[l,r]=s[r]-s[l-1]"""# 原数组下标从0开始,树状数组下标从1开始。树状数组对应区间[l+1,r+1]return (r + 1) * query(r + 1, t1) - query(r + 1, t2) - (l * query(l, t1) - query(l, t2))

 具体的树状数组知识点:树状数组

 

【Python】代码示例:

注:原数组a、差分数组d、数组e的下标从0开始,树状数组下标从1开始。

# 类BIT(即树状数组)
class BIT:def __init__(self, n):self.n = nself.t = [0] * ndef update(self, i, val):"""单点修改(树状数组维护)"""while i < self.n:           # 此处,树状数组的长度为n,最后一个元素下标为n-1self.t[i] += vali += i & -idef query(self, i):"""前缀和,区间[1,i]"""ans = 0while i > 0:ans += self.t[i]i -= i & -ireturn ans# 主程序
def main():a = [5,2,6,1,7,9]n = len(a)# 打印原数组的元素print(f"原数组:                ", end="")for i in range(n):print(a[i], end="    ")print()# 差分数组dd = [0] * nd[0] = a[0]for i in range(1, n):d[i] = a[i] - a[i - 1]# 打印差分数组的元素print(f"差分数组:              ", end="")for i in range(n):print(d[i], end="    ")print()# 数组e(元素:d[i] * i)e = [0] * n# 使用树状数组维护差分数组d和数组et1 = BIT(n + 1)t2 = BIT(n + 1)for i in range(n):t1.update(i + 1, d[i])t2.update(i + 1, d[i] * i)# 假设:原数组区间[1,3]都加10,修改差分数组的树状数组和数组e的树状数组# 树状数组对应区间[2,4]t1.update(2, 10)            # (差分数组)修改区间起始下标的元素t1.update(5, -10)           # (差分数组)修改区间结束下标的后一个元素t2.update(2, 10 * 1)        # (数组e)修改区间起始下标的元素t2.update(5, -10 * 4)       # (数组e)修改区间结束下标的后一个元素# 打印修改后原数组中所有元素(即差分数组的前缀和)print(f"修改后差分数组的前缀和:", end="")for i in range(n):a[i] = t1.query(i + 1)print(a[i], end="    ")print()# 获取原数组中下标2的元素print(f"原数组中下标2的元素:{a[2]}")# 打印修改后数组e的前缀和print(f"修改后数组e的前缀和:   ", end="")for i in range(n):e[i] = t2.query(i + 1)print(e[i], end="    ")print()# 获取原数组中下标2的前缀和print(f"修改后原数组的前缀和:  ", end="")s = [0] * n                # 记录原数组的前缀和for i in range(n):s[i] = (i + 1) * t1.query(i + 1) - t2.query(i + 1)print(s[i], end="    ")print()print(f"原数组中下标2的前缀和:{s[2]}")# 获取原数组中区间和,区间[2,5]rq = s[5] - s[1]print(f"原数组中区间和,区间[2,5]:{rq}")# 主程序执行
main()

执行结果如下:

73766bef162e4c3982e0c572248702e3.png

 

 

 

 

相关文章:

【数据结构】(Python)差分数组。差分数组与树状数组结合

差分数组&#xff1a; 基于原数组构造的辅助数组。用于区间修改、单点查询。区间修改的时间复杂度O(1)。单点查询的时间复杂度O(n)。差分数组的元素&#xff1a;第一个元素等于原数组第一个元素&#xff0c;从第二个元素开始是原数组对应下标的元素与前一个元素的差&#xff0…...

基于zynq在linux下的HDMI实战

ZYNQ系列文章目录 第一章&#xff1a;基于zynq在linux下的phy调试记录 第二章&#xff1a;qemu制作ubuntu文件系统 第三章&#xff1a;基于zynq在linux下的AXI-CAN实战 第四章&#xff1a;基于zynq在linux下的HDMI实战 文章目录 ZYNQ系列文章目录前言一、vivado中HDMI的配置1.…...

HT-HaiBOX边缘计算盒 智慧工厂方案,智慧医疗方案,智慧加油站方案,智慧安防方案,智慧城市方案;方案定制开发

背景介绍 在当今数字化时代&#xff0c;各个行业对于智能化视频监控设备的需求日益增长。无论是安防监控&#xff0c;还是智慧工厂、智慧城市等领域&#xff0c;都需要高效、智能的设备来保障安全和提高生产效率。然而&#xff0c;传统的视频监控设备存在诸多痛点&#xff1a;…...

【JMeter详解】

JMeter详解 Apache JMeter 是一个开源的、100%纯Java应用程序&#xff0c;设计用于负载测试和性能测量。它最初是为测试Web应用程序而设计的&#xff0c;但后来扩展到其他测试功能。JMeter可以用来对静态和动态资源&#xff08;如静态文件、Servlets、Perl脚本、Java对象、数据…...

《PHP Switch》

《PHP Switch》 介绍 PHP 是一种广泛使用的服务器端编程语言&#xff0c;而 switch 语句是 PHP 中用于基于不同条件执行不同代码块的关键字。在本篇文章中&#xff0c;我们将详细介绍 PHP 中的 switch 语句&#xff0c;包括其语法、用法、以及在实际编程中的应用场景。 语法…...

如何确保涡度通量观测数据的准确性?涡度通量光敏感性分析、温度敏感性分析、数据风浪区分析等

确保涡度通量观测数据的准确性&#xff0c;可以采取以下几个步骤&#xff1a; 1.数据预处理&#xff1a;在进行数据分析之前&#xff0c;需要对原始的高频涡度通量数据进行预处理&#xff0c;包括剔除异常值和进行数据缺失插补。异常值剔除可以通过设定合理的阈值来识别并剔除数…...

linux自动化批量分发SSH密钥同时批量测试SSH连接教程(包含自动化脚本代码)

1、检查端口 检查分发对象22端口是否打开 nmap -p22 ip地址如果要批量检查端口可以参考我写的这篇文章&#xff1a;linux自动化一键批量检查主机端口 2、命令行分发密钥原理 Linux分发密钥原理主要涉及SSH&#xff08;Secure Shell&#xff09;协议&#xff0c;该协议用于…...

C++ 设计模式:命令模式(Command Pattern)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 访问者模式 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求封装成一个对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或记录请求日志…...

Flink源码解析之:Flink On Yarn模式任务提交部署过程解析

Flink源码解析之&#xff1a;Flink On Yarn模式任务提交部署过程解析 一、Flink on Yarn部署模式概述 Apache Hadoop YARN 在许多数据处理框架中都很流行。 Flink 服务提交给 YARN 的 ResourceManager&#xff0c;后者会在 YARN NodeManagers 管理的机器上生成容器。 Flink 将…...

C++算法20例

1、求两个数的最大公约数 int gcd(int a, int b) { 2 return b 0 ? a : gcd(b, a % b); 3} 2、判断素数 bool isPrime(int n) {if (n < 1) return false; for (int i 2; i * i < n; i) {if (n % i 0) return false;}return true; } 3、冒泡排序 void bubbleSort…...

雷军:科技传奇的逐梦之旅

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

python版本的Selenium的下载及chrome环境搭建和简单使用

针对Python版本的Selenium下载及Chrome环境搭建和使用&#xff0c;以下将详细阐述具体步骤&#xff1a; 一、Python版本的Selenium下载 安装Python环境&#xff1a; 确保系统上已经安装了Python 3.8及以上版本。可以从[Python官方网站]下载并安装最新版本的Python&#xff0c;…...

linux tar 文件解压压缩

文件压缩和解压 tar -c: 建立压缩档案 -x&#xff1a;解压 -t&#xff1a;查看内容 -r&#xff1a;向压缩归档文件末尾追加文件 -u&#xff1a;更新原压缩包中的文件 -z&#xff1a;有gzip属性的 -j&#xff1a;有bz2属性的 -v&#xff1a;显示所有过程 -O&#xff1a;…...

Razzashi Raptor

拉扎什迅猛龙 Razzashi Raptor 2024.12.24 无论是工作、游戏&#xff0c;除了坚持&#xff0c;还需要一点运气&#xff0c;2024年跨年啦。 World of Warcraft [CLASSIC]80猎人[Grandel][祖尔格拉布][血领主曼多基尔][拉扎什迅猛龙]20241231跨年回报_哔哩哔哩bilibili_魔兽 Ra…...

Fetch处理大模型流式数据请求与解析

为什么有的大模型可以一次返回多个 data&#xff1f; Server-Sent Events (SSE)&#xff1a;允许服务器连续发送多个 data: 行&#xff0c;每个代表一个独立的数据块。 流式响应&#xff1a;大模型服务通常以流式响应方式返回数据&#xff0c;提高响应速度。 批量处理&#x…...

【网络安全实验室】脚本关实战详情

难道向上攀爬的那条路&#xff0c;不是比站在顶峰更让人热血澎湃吗 1.key又又找不到了 点击链接&#xff0c;burp抓包&#xff0c;发送到重放模块&#xff0c;点击go 得到key 2.快速口算 python3脚本 得到key 3.这个题目是空的 试了一圈最后发现是 4.怎么就是不弹出key呢…...

怎么配置每一次重启服务器后,自动启动Tocmat

前言 宝子们&#xff0c;今天来给大家详细讲讲服务器如何配置每次重启后自动启动 Tomcat&#xff0c;让你的服务器应用始终保持在线状态&#xff0c;高效运行&#xff01; windows版本 在 Windows 系统下&#xff0c;有两种常用的方法可以实现这个目标。 第一种方法是利用服…...

《机器学习》——利用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法介绍下载OpenCV库实验内容实验结果完整代码手写数字传入模型训练 KNN算法介绍 一、KNN算法的基本要素 K值的选择&#xff1a;K值代表选择与新测试样本距离最近的前K个训练样本数&#xff0c;通常K是不大于20的整数。K值的选择对算法结果有重要影响&#xff0c…...

D3.js

d3是用于数据可视化 可用于处理数据、创建图表、实现动画效果和交互功能应用场景: 数据可视&#xff1a;将复杂的数据以图表的形式展示出来&#xff0c;便于用户理解和分析。交互式图&#xff1a;支持事件处理和动画效果&#xff0c;提升用户体验。仪表盘和报&#xff1a;广泛…...

Windows onnxruntime编译openvino

理论上来说&#xff0c;可以直接访问 ONNXRuntime Releases 下载 dll 文件&#xff0c;然后从官方文档中下载缺少的头文件以直接调用&#xff0c;但我没有尝试过。 1. 下载 OpenVINO 包 从官网下载 OpenVINO 的安装包并放置在 C:\Program Files (x86) 路径下&#xff0c;例如…...

Python中的sqlite3模块:SQLite数据库接口详解

Python中的sqlite3模块&#xff1a;SQLite数据库接口详解 主要功能sqlite3.connect(database)connection.cursor()cursor.execute(sql)connection.commit()cursor.fetchall()connection.close() 使用示例执行结果总结 在Python中&#xff0c;sqlite3模块提供了一个与SQLite数据…...

Unity功能模块一对话系统(4)实现个性文本标签

本期我们将了解如何在TMPro中自定义我们的标签样式&#xff0c;并实现两种有趣的效果。 一.需求描述 1.定义<float>格式的标签&#xff0c;实现标签处延迟打印功能 2.定义<r" "></r>格式的标签&#xff0c;实现标签区间内文本片段的注释显示功能…...

Vue.js前端框架教程15:Vue父子组件之间的通信ref、emits

文章目录 1. 属性传递(Props)2. 事件监听( Emits)3. `ref` 引用4. `provide` 和 `inject`5. 插槽(Slots)在 Vue 3 中,父子组件之间的通信可以通过多种方式实现,包括属性传递、事件监听、插槽以及 ref 和 provide/inject。以下是这些通信方式的详解: 1. 属性传递(Pro…...

Python 实现 冒泡排序算法示例

冒泡排序算法示例 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地遍历要排序的列表&#xff0c;比较相邻的元素&#xff0c;并交换它们的位置&#xff0c;如果它们的顺序错误。这个过程会重复进行&#xff0c;直到没有需要交换的元素为止&#x…...

《机器学习》--线性回归模型详解

线性回归模型是机器学习中的一种重要算法&#xff0c;以下是对其的详细解释&#xff1a; 一、定义与原理 线性回归&#xff08;Linear Regression&#xff09;是利用数理统计中回归分析&#xff0c;来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。线性回归…...

Django项目部署到服务器

文章目录 django项目部署到服务器在服务器上安装Django和依赖&#xff1a;项目代码上传配置数据库收集静态文件配置Web服务器配置Gunicorn&#xff08;WSGI服务器&#xff09;启动/停止/重载systemd服务。 django项目部署到服务器 在服务器上安装Django和依赖&#xff1a; su…...

CSDN编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

如何免费解锁 IPhone 网络

您是否担心 iPhone 上的网络锁定&#xff1f;如果您的 iPhone 被锁定到特定运营商&#xff0c;解锁它可以连接到不同的运营商。好吧&#xff0c;我们为您准备了一份指南。 iPhone运营商免费解锁将是小菜一碟。在我们的解锁运营商 iphone 免费指南中。我们为您提供了一份简介&am…...

Trimble天宝X9三维扫描仪为建筑外墙检测提供了全新的解决方案【沪敖3D】

随着城市化进程的快速推进&#xff0c;城市高层建筑不断增多&#xff0c;对建筑质量的要求也在不断提高。建筑外墙检测&#xff0c;如平整度和垂直度检测&#xff0c;是衡量建筑质量的重要指标之一。传统人工检测方法不仅操作繁琐、效率低下&#xff0c;还难以全面反映墙体的真…...

微服务のGeteWay

目录 概念&#xff1a; 三大核心&#xff1a; 工作流程&#xff1a; 9527网关如何做路由映射&#xff1a; GetWay高级特性&#xff1a; 按服务名动态路由服务&#xff1a; 断言Route Predicate Factories &#xff1a; 获取当前时区时间&#xff1a; After Route &…...

Golang 中 Goroutine 的调度

Golang 中 Goroutine 的调度 Golang 中的 Goroutine 是一种轻量级的线程&#xff0c;由 Go 运行时&#xff08;runtime&#xff09;自动管理。Goroutine 的调度基于 M:N 模型&#xff0c;即多个 Goroutine 可以映射到多个操作系统线程上执行。以下是详细的调度过程和策略&…...

MyBatis使用的设计模式

目录 1. 工厂模式&#xff08;Factory Pattern&#xff09; 2. 单例模式&#xff08;Singleton Pattern&#xff09; 3. 代理模式&#xff08;Proxy Pattern&#xff09; 4. 装饰器模式&#xff08;Decorator Pattern&#xff09; 5. 观察者模式&#xff08;Observer Patt…...

淺談Cocos2djs逆向

前言 簡單聊一下cocos2djs手遊的逆向&#xff0c;有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念&#xff1a; Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio&#xff0c;區別是前者是cocos2djs專用的開發工具&#xff0c;後者則是coco…...

选择器(结构伪类选择器,伪元素选择器),PxCook软件,盒子模型

结构为类选择器 伪元素选择器 PxCook 盒子模型 (内外边距&#xff0c;边框&#xff09; 内外边距合并&#xff0c;塌陷问题 元素溢出 圆角 阴影: 模糊半径&#xff1a;越大越模糊&#xff0c;也就是越柔和 案例一&#xff1a;产品卡片 <!DOCTYPE html> <html lang&q…...

CentOS 7系统 OpenSSH和OpenSSL版本升级指南

文章目录 CentOS 7系统 OpenSSH和OpenSSL版本升级指南环境说明当前系统版本当前组件版本 现存安全漏洞升级目标版本升级准备工作OpenSSL升级步骤1. 下载和解压2. 编译安装3. 配置环境 OpenSSH升级步骤1. 下载和解压2. 编译安装3. 创建systemd服务配置4. 更新SSH配置文件5. 设置…...

使用 Comparable 和 Comparator 接口对集合排序

使用 Comparable 和 Comparator 接口对集合排序&#xff1a; 1. 使用 Comparable 接口&#xff1a; 当你希望一个类的对象能够按照某种自然顺序进行排序时&#xff0c;可以实现 Comparable 接口 并重写 compareTo() 方法。 实现步骤&#xff1a; 1.1 实现 Comparable<T&g…...

最新常见的图数据库对比,选型,架构,性能对比

图数据库排名 地址&#xff1a;https://db-engines.com/en/ranking/graphdbms 知识图谱查询语言 SPARQL、Cypher、Gremlin、PGQL 和 G-CORE 语法 / 语义 / 特性 SPARQL Cypher Gremlin PGQL G-CORE 图模式匹配查询 语法 CGP CGP CGP(无可选)1 CGP CGP 语义 子…...

混合合并两个pdf文件

混合两个pdf 1、在线免费交替和混合奇数和偶数PDF页面2、有什么软件把两个 PDF 交叉合并&#xff1f;3、pdfsam本地合并 如何Google翻译的原文和译文合并&#xff0c;&#xff08;沉浸式翻译效果相对较好&#xff09; 1、在线免费交替和混合奇数和偶数PDF页面 https://deftpd…...

OpenCV-Python实战(9)——滤波降噪

一、均值滤波器 cv2.blur() img cv2.blur(src*,ksize*,anchor*,borderType*)img&#xff1a;目标图像。 src&#xff1a;原始图像。 ksize&#xff1a;滤波核大小&#xff0c;&#xff08;width&#xff0c;height&#xff09;。 anchor&#xff1a;滤波核锚点&#xff0c…...

uniapp——微信小程序读取bin文件,解析文件的数据内容(三)

微信小程序读取bin文件内容 读取用户选择bin文件&#xff0c;并解析数据内容&#xff0c;分包发送给蓝牙设备&#xff1b; 文章目录 微信小程序读取bin文件内容读取文件读取内容返回格式 API文档&#xff1a; getFileSystemManager 关于App端读取bin文件&#xff0c;请查看&…...

Python 中常用的算法

1. 排序算法 用于将数据按特定顺序排列。 冒泡排序&#xff08;Bubble Sort&#xff09;选择排序&#xff08;Selection Sort&#xff09;插入排序&#xff08;Insertion Sort&#xff09;快速排序&#xff08;Quick Sort&#xff09;归并排序&#xff08;Merge Sort&#xf…...

xadmin后台首页增加一个导入数据按钮

xadmin后台首页增加一个导入数据按钮 效果 流程 1、在添加小组件中添加一个html页面 2、写入html代码 3、在urls.py添加导入数据路由 4、在views.py中添加响应函数html代码 <!DOCTYPE html> <html lang...

Kubernetes: NetworkPolicy 的实践应用

一、Network Policy 是什么,在云原生领域有和作用 Network Policy 是 Kubernetes 官方提出来的一种网络策略的规范&#xff0c;用户通过编写符合对应规范的规则来控制 k8s 集群内 L3 和 L4 层的网络流量。 NetworkPolicy 主要的功能就是实现在云原生领域的容器网络管控它给用…...

计算机体系结构期末复习3:GPU架构及控制流问题

目录 一、GPU设计思路 1.简化流水线、增加核数 2.单指令多线程&#xff08;SIMT&#xff09; 3.同时驻留大量线程 4.总思路&#xff1a;多线程单指令多线程 二、GPU的控制流问题 1.什么是控制流问题 2.怎么应对分支分歧 一、GPU设计思路 1.简化流水线、增加核数 2.单指…...

excel怎么删除右边无限列(亲测有效)

excel怎么删除右边无限列&#xff08;亲测有效&#xff09; 网上很多只用第1步的&#xff0c;删除了根本没用&#xff0c;还是存在&#xff0c;但是隐藏后取消隐藏却是可以的。 找到右边要删除的列的第一个空白列&#xff0c;选中整个列按“ctrlshift>(向右的小箭头)”&am…...

ChatGPT-4助力学术论文提升文章逻辑、优化句式与扩充内容等应用技巧解析。附提示词案例

目录 1.扩写&#xff08;expansion/paraphrasing&#xff09; 2.优化&#xff08;optimization&#xff09; 3.缩写&#xff08;optimization&#xff09; 4.提取关键词&#xff08;keyword extraction&#xff09; 5.短语转换&#xff08;phrase transformation&#xff…...

C++和OpenGL实现3D游戏编程【连载19】——着色器光照初步(平行光和光照贴图)(附源码)

1、本节要实现的内容 我们在前期的教程中,讨论了在即时渲染模式下的光照内容。但在我们后期使用着色器的核心模式下,会经常在着色器中使光照,我们这里就讨论一下着色器光照效果,以及光照贴图效果,同时这里知识会为后期的更多光照效果做一些铺垫。本节我们首先讨论冯氏光照…...

html+css网页制作 美食 美食网5个页面

htmlcss网页制作 美食 美食网5个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xff0…...

Mac 12.1安装tiger-vnc问题-routines:CRYPTO_internal:bad key length

背景&#xff1a;因为某些原因需要从本地mac连接远程linxu桌面查看一些内容&#xff0c;必须使用桌面查看&#xff0c;所以ssh无法满足&#xff0c;所以决定安装vnc客户端。 问题&#xff1a; 在mac上通过 brew install tiger-vnc命令安装, 但是报错如下&#xff1a; > D…...

遥感图像车辆检测-目标检测数据集

遥感图像车辆检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接: https://pan.baidu.com/s/1XVlRTVWpXZFi6ZL_Xcs7Rg?pwdaa6g 提取码: aa6g 数据集信息介绍&#xff1a; 共有 1035 张图像和一一对应的标注文件 标注文件格式提供了…...