【redis】set和zset常用命令
set 无序集合类型
sadd 和 smembers
SADD:将一个或者多个元素添加到set中。注意,重复的元素无法添加到set中。
语法:SADD key member [member]
把集合中的元素,叫做member,就像hash类型中,叫做field类似.
返回值表示本次操作,添加成功了几个元素.
时间复杂度:O(1)
SMEMBERS:获取一个set中的所有元素,注意,元素间的顺序是无序的。
语法:SMEMBERS key
返回值:所有元素的列表。
时间复杂度:0(N)
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> type key
set
127.0.0.1:6379> sadd key2 1 1 2 3 4
(integer) 4
127.0.0.1:6379> smembers key
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> smembers key2
1) "1"
2) "2"
3) "3"
4) "4"
sismember 和 scard
SISMEMBER:判断一个元素在不在set中。
语法:SISMEMBER key member
时间复杂度:0(1)
返回值:1表示元素在set中。0表示元素不在set中或者key不存在。
scard:获取一个set的基数(cardinality),即set中的元素个数。
语法:SCARD key
127.0.0.1:6379> sismember key 1
(integer) 1
127.0.0.1:6379> sismember key 100
(integer) 0
127.0.0.1:6379> scard key
(integer) 4
127.0.0.1:6379> scard key2
(integer) 4
spop和srandmember
spop:使用spop删除元素的时候其实是随机删除.
SPOP key [count]
返回值:取出的元素。
srandmember:随机获取集合中的元素
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> spop key
"3"
127.0.0.1:6379> spop key
"2"
127.0.0.1:6379> spop key
"4"
127.0.0.1:6379> spop key
"1"
-- 再次创建一个
127.0.0.1:6379> sadd key2 1 2 3 4
(integer) 4
127.0.0.1:6379> spop key2
"1"
127.0.0.1:6379> spop key2
"2"
127.0.0.1:6379> spop key2
"3"
127.0.0.1:6379> spop key2
"4"
-- 随机获取集合元素
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> srandmember key
"1"
127.0.0.1:6379> srandmember key
"4"
127.0.0.1:6379> srandmember key
"3"
-- 随机获取多个元素
127.0.0.1:6379> srandmember key 2
1) "3"
2) "2"
smove和srem
语法:SMOVE source destination member
smove含义:把member从source上删除,再插入到destination中
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 5 6 7 8
(integer) 4
127.0.0.1:6379> smove key key2 1
(integer) 1
127.0.0.1:6379> SMEMBERS key
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> SMEMBERS key2
1) "1"
2) "5"
3) "6"
4) "7"
5) "8"
-- 给key里再添加一个1,再次把这个1移动给key2
-- 针对上述的情况,smove不会视为出错。
-- 也会按照删除-插入进行执行
127.0.0.1:6379> sadd key 1
(integer) 1
127.0.0.1:6379> smove key key2 1
(integer) 1
127.0.0.1:6379> SMEMBERS key
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> SMEMBERS key2
1) "1"
2) "5"
3) "6"
4) "7"
5) "8"
-- 如果要移动的元素在source中不存在。
-- 此时就会返回0表示移动失败了。
127.0.0.1:6379> SMOVE key key2 100
(integer) 0
srem:可以一次删除一个member,也可以一次删除多个membeer .
语法:返回值表示删除成功的元素个数。
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> srem key 1
(integer) 1
127.0.0.1:6379> srem key 3 4
(integer) 2
127.0.0.1:6379> SMEMBERS key
1) "2"
集合间的操作
交集:sinter和sinterstore
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> SINTER key key2
1) "3"
2) "4"
-- SINTERSTORE 把交集放到集合中
127.0.0.1:6379> SINTERSTORE key3 key key2
(integer) 2
127.0.0.1:6379> SMEMBERS key3
1) "3"
2) "4"
并集:sunion,sunionstore
127.0.0.1:6379> sunion key key2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> SUNIONSTORE key4 key key2
(integer) 6
127.0.0.1:6379> SMEMBERS key4
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
差集:sdiff,sdiffstore
127.0.0.1:6379> SDIFF key key2
1) "1"
2) "2"
127.0.0.1:6379> SDIFF key2 key
1) "5"
2) "6"
127.0.0.1:6379> SDIFFSTORE key5 key key2
(integer) 2
127.0.0.1:6379> SMEMBERS key5
1) "1"
2) "2"
127.0.0.1:6379> SDIFFSTORE key6 key2 key
(integer) 2
127.0.0.1:6379> SMEMBERS key6
1) "5"
2) "6"
set类型的编码
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> OBJECT encoding key
"intset"
127.0.0.1:6379> sadd key hello
(integer) 1
127.0.0.1:6379> OBJECT encoding key
"hashtable"
zset 有序集合
zadd和zrange
zadd:往有序集合中,添加元素和分数。
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member…]
member和score称为是一个"pair"。注意:添加的时候,既要添加元素,又要添加分数
有序集合:分数相同,再按照元素自身字符串的字典序来排列。分数不同,仍然按照分数来排。
XX:仅仅用于更新已经存在的元素,不会添加新元素。
NX:仅用于添加新元素,不会更新已经存在的元素。
CH:默认情况下,ZADD返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
INCR:此时命令类似ZINCRBY的效果,将元素的分数加上上指定的分数。此时只能指定一个元素和分数。之前Hash,Set, List很多时候,添加一个元素,都是O(1)。此处,Zset则是logN。由于zset是有序结构,要求新增的元素,要放到合适的位置上(找位置)。
zrange查看有序集合中的元素详情了。类似于Irange,可以指定一对下标构成的区间。
时间复杂度:O(log(N)+M),start-stop区间的元素个数。此处要根据下标找到边界值。start对应的位置,接下来就需要遍历了。
-- 添加集合
127.0.0.1:6379> zadd key 99 吕布 98 赵云 96 典韦 95 关羽
(integer) 4
127.0.0.1:6379> zrange key 0 -1
关羽
典韦
赵云
吕布
127.0.0.1:6379> zrange key 0 -1 withscores
关羽
95
典韦
96
赵云
98
吕布
99
127.0.0.1:6379> zadd key 97 赵云
0
127.0.0.1:6379> zrange key 0 -1 withscores
关羽
95
典韦
96
赵云
97
吕布
99
-- 如果修改的分数,影响到了之前的顺序,就会自动的移动元素位置,保持原有的升序顺序不变
127.0.0.1:6379> zadd key 10 吕布
0
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
关羽
95
典韦
96
赵云
97
nx和XX
-- nx 仅用于添加新元素,不会更新已经存在的元素。
127.0.0.1:6379> zadd key nx 94 张飞
1
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
94
关羽
95
典韦
96
赵云
97
127.0.0.1:6379> zadd key nx 92 张飞
0
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
94
关羽
95
典韦
96
赵云
97
-- XX: 仅仅用于更新已经存在的元素,不会添加新元素。
127.0.0.1:6379> zadd key XX 92 张飞
0
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
92
关羽
95
典韦
96
赵云
97
127.0.0.1:6379> zadd key XX 90 马超
0
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
92
关羽
95
典韦
96
赵云
97
-- zadd在默认情况下,返回值就是新增成功的元素个数.
-- 指定这个选项之后,就会还包含本次更新的元素的个数。
127.0.0.1:6379> zadd key CH 90 张飞
1
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
90
关羽
95
典韦
96
赵云
97
-- INCR:此时命令类似ZINCRBY的效果,将元素的分数加上上指定的分数。此时只能指定一个元素和分数。
127.0.0.1:6379> zadd key incr 4 张飞
94
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
94
关羽
95
典韦
96
赵云
97
zcard,zcount
zcard :获取一个zset的基数(cardinality),即zset中的元素个数。
语法:ZCARD key
zcount:返回分数在min和max之间的元素个数,默认情况下,min[max都是包含的,可以通过(排除
ZCOUNT key min max
zcount的时间复杂度O(logN)。
min和max是可以写成浮点数(zset分数本身就是浮点数)
在浮点数中,存在两个特殊的数值:
- inf:无穷大.
- -inf:负无穷大.
zset中分数也是支持使用 inf和-inf作为max和min的
-- 有序集合中元素的个数
127.0.0.1:6379> zcard key
5
-- 集合分数区间中的元素的个数
127.0.0.1:6379> zcount key 95 97
3
127.0.0.1:6379> zcount key (95 97
2
127.0.0.1:6379> zcount key (95 (97
1
127.0.0.1:6379> zcount key -inf inf
5
zrevrange,zrangebyscore
ZREVRANGE:reverse ==> 逆序。按照分数降序进行遍历并打印。
语法:ZREVRANGE key start stop [WITHSCORES]此处的区间,两个参数的顺序是不需要变的
zrangebyscore:按照分数来找元素的.相当于和刚才的zcount类似
这个命令可能在6.2.0之后废弃,并且功能合并到ZRANGE中。
时间复杂度:O(logN + M)
127.0.0.1:6379> ZREVRANGE key 0 -1 withscores
赵云
97
典韦
96
关羽
95
张飞
94
吕布
10
127.0.0.1:6379> ZRANGEBYSCORE key 95 97
关羽
典韦
赵云
127.0.0.1:6379> ZRANGEBYSCORE key 95 97 withscores
关羽
95
典韦
96
赵云
97
zpopmax
zpopmax : 删除并返回分数最高的count个元素。
返回值就是被删除的元素(包括member和score).
如果存在多个元素,分数相同,同时为最大值,zpopmax删的时候,仍然只删除其中一个元素。分数虽然是主要因素。如果分数相同会按照member字符串的字典序决定先后
O(log(N) * M):M : count要删除的元素个数。N是有序集合的元素个数.
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
94
关羽
95
典韦
96
赵云
97
127.0.0.1:6379> zpopmax key
赵云
97
127.0.0.1:6379> zpopmax key 2
典韦
96
关羽
95
-- 再次插入两个有序集合元素
127.0.0.1:6379> zadd key 96 关羽 96 典韦
2
127.0.0.1:6379> zpopmax key
典韦
96
bzpopmax
bzpopmax:ZPOPMAX的阻塞版本。
语法:BZPOPMAX key [key …] timeout
阻塞也是在有序集合为空的时候触发阻塞.阻塞到有其他客户端插入元素
timeout表示超时时间,最多阻塞多久。单位是s,支持小数形式。写作0.1就是100ms。
如果有序集合中已经有了元素了,直接就能返回不会阻塞了。
用法和blpop,brpop的用法一样。都可以同时阻塞多个key。
-- 客户端1
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
(integer) 3
-- 客户端2
-- 获取如果有序集合中有元素就获取,无元素就阻塞
127.0.0.1:6379> BZPOPMAX key 600
1) "key"
2) "wangwu"
3) "30"
127.0.0.1:6379> BZPOPMAX key 600
1) "key"
2) "lisi"
3) "20"
127.0.0.1:6379> BZPOPMAX key 600
1) "key"
2) "zhangsan"
3) "10"
127.0.0.1:6379> BZPOPMAX key 600
-- 客户端1
127.0.0.1:6379> zadd key 40 zhaoliu 50 zhangqi 60 laoba
(integer) 3
-- 客户端2
-- 客户端1,增加元素后。BZPOPMAX获取元素
127.0.0.1:6379> BZPOPMAX key 600
1) "key"
2) "laoba"
3) "60"
(115.58s)
zpopmin和bzpopmin
zpopmin : 删除有序集合中,最小的元素。
时间复杂度O(logN*M)
此处的zpopmin和上面的zpopmax的逻辑是一致的(同一个函数实现的)
虽然redis的有序集合记录了开头的元素,但是删除的时候使用的是通用的删除函数。导致出现了重新查找的过程。
bzpopmin:阻塞版本的zpopmin
语法:BZPOPMIN key [key …] timeout
用法和BZPOPMAX一样的。时间复杂度,也是O(logN)。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
3
127.0.0.1:6379> zrange key 0 -1 withscores
zhangsan
10
lisi
20
wangwu
30
127.0.0.1:6379> zpopmin key
zhangsan
10
127.0.0.1:6379> zpopmin key 2
lisi
20
wangwu
30
-- 客户端1
-- 没有元素进行阻塞等待
127.0.0.1:6379> BZPOPMIN key 600
-- 客户端2
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
(integer) 3
-- 客户端1
-- 集合中有元素就立刻取出
-- 有元素后,获取元素不会阻塞等待
127.0.0.1:6379> BZPOPMIN key 600
1) "key"
2) "zhangsan"
3) "10"
(89.55s)
127.0.0.1:6379> BZPOPMIN key 600
1) "key"
2) "lisi"
3) "20"
127.0.0.1:6379> BZPOPMIN key 600
1) "key"
2) "wangwu"
3) "30"
zrank,zrevrank,zscore
zrank:返回指定元素的排名,升序。
语法:ZRANK key member
时间复杂度O(logN)
zrank得到的下标,是从前往后算的(升序)
zrevrank:也是获取到member的下标。但是是反着算的。rev => reverse
语法:ZREVRANK key member
时间复杂度O(logN)
zscore:返回指定元素的分数。
语法:ZSCORE key member
时间复杂度:0(1)
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu
(integer) 4
127.0.0.1:6379> zrank key lisi
(integer) 1
127.0.0.1:6379> zrank key wangwu
(integer) 2
127.0.0.1:6379> zrank key aaa
(nil)
127.0.0.1:6379> zrevrank key lisi
(integer) 2
127.0.0.1:6379> zrevrank key wangwu
(integer) 1
127.0.0.1:6379> zrevrank key zhaoliu
(integer) 0
127.0.0.1:6379> zscore key zhangsan
"10"
127.0.0.1:6379> zscore key lisi
"20"
zrem,zremrangebyrank,zremrangebyscore
zrem:删除指定的元素。
语法:ZREM key member [member …]
O(logN * M):参数中member的个数。N是整个有序集合中元素个数。
zremrangebyrank:按照排序,升序删除指定范围(下标)的元素,左闭右闭。
语法:ZREMRANGEBYRANK key start stop
时间复杂度:O(logN + M) ,N整个有序集合的元素个数。M是start-stop区间中元素个数。此处查找位置,只需要进行一次(不需要重复进行)
zremrangebyscore:按照分数删除指定范围的元素,左闭右闭。
语法:ZREMRANGEBYSCORE key min max
时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu
(integer) 4
127.0.0.1:6379> ZRANGE key 0 -1 withscores
1) "zhangsan"
2) "10"
3) "lisi"
4) "20"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "40"
127.0.0.1:6379> zrem key zhangsan
(integer) 1
127.0.0.1:6379> zrem key lisi wangwu
(integer) 2
-- ZREMRANGEBYRANK
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu
(integer) 4
127.0.0.1:6379> ZREMRANGEBYRANK key 1 2
(integer) 2
127.0.0.1:6379> zrange key 0 -1
1) "zhangsan"
2) "zhaoliu"
-- ZREMRANGEBYSCORE
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu
(integer) 4
127.0.0.1:6379> ZREMRANGEBYSCORE key 20 30
(integer) 2
127.0.0.1:6379> zrange key 0 -1
1) "zhangsan"
2) "zhaoliu"
zincrby
zincrby:为指定的元素的关联分数添加指定的分数值。
语法:ZINCRBY key increment member
不光会修改分数内容。也能同时移动元素位置.保持整个有序集合仍然是升序的。
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu
(integer) 4
127.0.0.1:6379> ZINCRBY key 15 zhangsan
"25"
127.0.0.1:6379> zrange key 0 -1 withscores
1) "lisi"
2) "20"
3) "zhangsan"
4) "25"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "40"
127.0.0.1:6379> ZINCRBY key -15 zhangsan
"10"
127.0.0.1:6379> zrange key 0 -1 withscores
1) "zhangsan"
2) "10"
3) "lisi"
4) "20"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "40"
127.0.0.1:6379> ZINCRBY key 0.5 zhangsan
"10.5"
127.0.0.1:6379> zrange key 0 -1 withscores
1) "zhangsan"
2) "10.5"
3) "lisi"
4) "20"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "40"
集合间的操作
交集:zinterstore
zinterstore:求有序集合的交集,结果放到第三张表中
语法:ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight] [weight …]] [AGGREGATE <SUM |MIN | MAX>]
numkeys:整数,描述了后续有几个key参与交集运算
WEIGHTS:权重
AGGREGATE:要把结果存储到哪个key,对应的zset中。
时间复杂度:O(NK)+O(Mlog(M))N是输入的有序集合中,最小的有序集合的元素个数;K是输入了几个有序集合;M是最终结果的有序集合的元素个数.
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
(integer) 3
127.0.0.1:6379> zadd key2 15 zhangsan 25 lisi 35 zhaoliu
(integer) 3
127.0.0.1:6379> ZINTERSTORE key3 2 key key2
(integer) 2
127.0.0.1:6379> ZRANGE key3 0 -1 withscores
1) "zhangsan"
2) "25"
3) "lisi"
4) "45"
-- WEIGHTS 权重交集
127.0.0.1:6379> ZINTERSTORE key4 2 key key2 weights 2 3
(integer) 2
127.0.0.1:6379> zrange key4 0 -1 withscores
1) "zhangsan"
2) "65"
3) "lisi"
4) "115"
-- AGGREGATE:最大数交集
127.0.0.1:6379> ZINTERSTORE key5 2 key key2 AGGREGATE max
(integer) 2
127.0.0.1:6379> zrange key5 0 -1 withscores
1) "zhangsan"
2) "15"
3) "lisi"
4) "25"
-- AGGREGATE:最小数交集
127.0.0.1:6379> ZINTERSTORE key6 2 key key2 AGGREGATE min
(integer) 2
127.0.0.1:6379> zrange key6 0 -1 withscores
1) "zhangsan"
2) "10"
3) "lisi"
4) "20"
并集:zunionstore
zunionstore:求有序结合的并集
语法:ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight] [weight …]] [AGGREGATE <SUM | MIN | MAX>]
zunionstore用法和zinterstore基本一致.
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
(integer) 3
127.0.0.1:6379> zadd key2 15 zhangsan 25 lisi 35 zhaoliu
(integer) 3
127.0.0.1:6379> ZUNIONSTORE key3 2 key key2
(integer) 4
127.0.0.1:6379> zrange key3 0 -1 withscores
1) "zhangsan"
2) "25"
3) "wangwu"
4) "30"
5) "zhaoliu"
6) "35"
7) "lisi"
8) "45"
-- 根据权重求交集
127.0.0.1:6379> ZUNIONSTORE key4 2 key key2 weights 0.5 0.5
(integer) 4
127.0.0.1:6379> zrange key4 0 -1 withscores
1) "zhangsan"
2) "12.5"
3) "wangwu"
4) "15"
5) "zhaoliu"
6) "17.5"
7) "lisi"
8) "22.5"
--
127.0.0.1:6379> ZUNIONSTORE key5 2 key key2 aggregate min
(integer) 4
127.0.0.1:6379> zrange key5 0 -1 withscores
1) "zhangsan"
2) "10"
3) "lisi"
4) "20"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "35"
127.0.0.1:6379> ZUNIONSTORE key6 2 key key2 aggregate max
(integer) 4
127.0.0.1:6379> zrange key6 0 -1 withscores
1) "zhangsan"
2) "15"
3) "lisi"
4) "25"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "35"
数据类型
如果有序集合中的元素个数较少,或者单个元素体积较小。使用ziplist来存储。
如果当前元素个数比较多,或者单个元素体积非常大。使用skiplist来存储了。
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
(integer) 3
127.0.0.1:6379> object encoding key
"ziplist"
127.0.0.1:6379> zadd key 40 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
(integer) 1
127.0.0.1:6379> object encoding key
"skiplist"
相关文章:

【redis】set和zset常用命令
set 无序集合类型 sadd 和 smembers SADD:将一个或者多个元素添加到set中。注意,重复的元素无法添加到set中。 语法:SADD key member [member] 把集合中的元素,叫做member,就像hash类型中,叫做field类似. 返回值表示本次操作,添加成功了几个元素. 时间复…...

【面试题-006】java中的垃圾回算法有哪些?
Java中的垃圾回收(Garbage Collection,简称GC)是指自动内存管理的一种机制,用于回收不再使用的对象占用的内存。Java中的垃圾回收算法主要有以下几种: 标记-清除(Mark-Sweep)算法: …...

最小时间差
首先可以想到,可以计算出任意两个时间之间的差值,然后比较出最小的,不过这种蛮力方法时间复杂度是O(n^2)。而先将时间列表排序,再计算相邻两个时间的差值,就只需要计算n个差值,而排序阶段时间复杂度通常为O…...

动态SQL IF语句
IF语句学习 第一种写法(标准) 我们先来看以下标准写法: select * from .. <where> <if test""> and ....... <if test""> and ....... <where> 我们用了一个where标签 , 内嵌if语句 第二种写法: 这是第二种写法:不用where标…...

961题库 北航计算机 操作系统 附答案 选择题形式
有题目和答案,没有解析,不懂的题问大模型即可,无偿分享。 第1组 习题 计算机系统的组成包括( ) A、程序和数据 B、处理器和内存 C、计算机硬件和计算机软件 D、处理器、存储器和外围设备 财务软件是一种ÿ…...

SylixOS 版本与 RealEvo-IDE 版本对应关系说明
SylixOS 版本与 RealEvo-IDE 版本对应关系说明 SylixOS 版本IDE 版本发布日期1.4.13.1.52017/01/171.5.23.5.12017/10/121.7.13.8.32018/06/221.8.33.9.52018/10/081.9.9-103.9.102020/01/021.11.63.10.22020/05/131.11.73.10.x2020/06/121.12.93.11.02020/09/111.12.11&#…...

linux命令:调试必备工具dmesg
在服务器上进行芯片调试时,我们会遇到各种各样的问题,很多问题与操作系统相关。此时就需要了解操作系统发生了哪些事件。 dmesg 是linux系统中用来打印或控制内核缓冲区内容的命令。这个环形缓冲区记录了系统启动以来发生的各种事件消息,包括…...

第三届大湾区算力大会丨暴雨开启数字未来新篇
5月30-31日,韶关市迎来主题为“算启新篇智创未来”的第三届粤港澳大湾区(广东)算力产业大会暨第二届中国算力网大会,活动由广东省人民政府主办,广东省政数局、韶关市人民政府共同承办。暴雨信息作为算力产业发展的重要构建者受邀赴会…...

SPWM载波调制方式-三电平杂记1
方法一: P2 O1 N0 方法二:双载波直接发波 方法三:负轴载波和调制波往上抬升1,得到使用同一个载波 在正半周在P和O切换,在下半轴式O和N切换...

常见攻击类型整理
文章目录 网络攻击web攻击XSS攻击存储型XSS反射型XSSDOM型XSS CSRF攻击SQL注入攻击文件上传漏洞业务逻辑漏洞越权访问水平越权垂直越权 密码找回验证码漏洞 信息泄露暴力破解远程命令执行(RCE)xxe注入反序列化文件包含本地文件包含(LFI&#…...

R语言探索与分析-美国房价及其影响因素分析
一、选题背景 以多元线性回归统计模型为基础,用R语言对美国部分地区房价数据进行建模预测,进而探究提高多元回 归线性模型精度的方法。先对数据进行探索性预处理,随后设置虚拟变量并建模得出预测结果,再使用方差膨胀因子对 多重共…...

Android14 WMS-窗口添加流程(一)-Client端
窗口布局在onCreate方法中通过setContentView(R.layout.xxx)加载,但窗口的显示并不是在wm_on_create_called中, 而是在wm_on_resume_called后,也就是说应用onResume时此窗口是不可见的,真正可见是当此window窗口的mDrawState变化状态从NO_SUR…...

【人工智能】第二部分:ChatGPT的架构设计和训练过程
人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...

Informer
I n f o r m e r Informer Informer 摘要: 长序列时间序列的预测 i n f o r m e r informer informer优点: P r o b s p a r e Probspare Probspare自关注机制,在时间复杂度和内存使用方面达到 O ( N l o g N ) O(NlogN) O(NlogN),在序列依…...

12岁学什么编程机构好:深入剖析与全面指导
12岁学什么编程机构好:深入剖析与全面指导 在数字化时代,编程已成为一项必备技能。对于12岁的孩子来说,选择一个合适的编程机构至关重要。然而,市场上的编程机构众多,如何选择成为了一个难题。本文将从四个方面、五个…...

Day60 柱状图中最大的矩形
84 柱状图中最大的矩形 题目链接:84. 柱状图中最大的矩形 - 力扣(LeetCode) 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的…...

typescript --object对象类型
ts中的object const obj new Object()Object 这里的Object是Object类型,而不是JavaScript内置的Object构造函数。 这里的Object是一种类型,而Object()构造函数表示一个值。 Object()构造函数的ts代码 interface ObjectConstructor{readonly prototyp…...

如何使用python将多个EXCEL表进行合并
在Python中,你可以使用pandas库来轻松地将多个Excel表格合并。以下是一个基本的步骤指南和示例代码,说明如何合并多个Excel文件到一个单独的DataFrame中: 步骤 安装pandas和openpyxl(如果你正在处理.xlsx文件)。导入…...

【前端每日基础】day35——HTML5离线存储
HTML5引入了一些新的特性和API来增强Web应用的功能,其中之一就是离线存储。离线存储允许Web应用在没有网络连接的情况下仍能正常运行。以下是HTML5离线存储的主要技术和详细介绍: Web Storage (LocalStorage 和 SessionStorage) LocalStorage 概述&…...

动态规划算法:背包问题
背包问题概述 背包问题 (Knapsack problem) 是⼀种组合优化的 NP完全问题 。 问题可以描述为:给定⼀组物品,每种物品都有⾃⼰的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最⾼。 根据物品的个…...

新版idea配置git步骤及项目导入
目录 git安装 下载 打开git Bash 配置全局用户名及邮箱 查看已经配置的用户名和邮箱 在IDEA中设置Git 问题解决 项目导入 前言-与正文无关 生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中࿰…...

赶紧收藏!2024 年最常见 20道 Kafka面试题(一)
一、Kafka都有哪些特点? Kafka是一个分布式流处理平台,它被设计用于高吞吐量的数据管道和流处理。以下是Kafka的一些主要特点: 高吞吐量、低延迟:Kafka每秒可以处理数十万条消息,延迟可以低至几毫秒。这是通过优化数据…...

unsigned char*和const char*的一些问题
1.可以返回字符串常量,但是不能返回char buf[BUF_SIZE] char* get_str(){char* str "hello world";return str; }char* get_str(){char str[32] {0};strcpy(str, "hello world");return str; }//err 2.联合体不能用指针,也…...

前端知识1-4:性能优化进阶
性能优化进阶 Navigation Timing API navigationStart / end 表示从上一个文档卸载结束时 > 如果没有上一个文档,这个值和fetchStart相等 unloadEventStart / end 标识前一个网页unload的时间点 redirectStart / end 第一个http重定向发生和结束的时间 fetch…...

ios 新安装app收不到fcm推送
🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…...

汽美汽修店管理系统会员小程序的作用是什么
汽车后市场汽美汽修赛道同样存在着大量商家,连锁品牌店或个人小店等,门店扎堆且区域覆盖面积广,当然每天车来车往也有不少生意。 随着线上化程度加深和商家不断拓展市场的需要,传统运营模式可能难以满足现状,尤其是年…...

远程自动锁定平面
目录 Ubuntu 系统上 方法一:使用 SSH 重新连接 方法二:解锁当前会话 方法三:通过 SSH 解锁会话 方法四:禁用自动锁屏(如果合适) windows系统 方法三:修改组策略设置 Ubuntu 系统上 远程…...

鸿蒙Ability Kit(程序框架服务)【UIAbility组件与UI的数据同步】
UIAbility组件与UI的数据同步 基于当前的应用模型,可以通过以下几种方式来实现UIAbility组件与UI之间的数据同步。 [使用EventHub进行数据通信]:在基类Context中提供了EventHub对象,可以通过发布订阅方式来实现事件的传递。在事件传递前&am…...

一个完整的springboot项目,我们还需要做什么
文章目录 一 从0创建Srpingboot项目1.1 启动springboot项目1.2 导入必要的依赖 二、还缺什么2.1 统一异常捕获2.2 统一MVC返回2.3 数据分层2.4 连接数据库模块2.5 放置常量和工具类2.6 基础controller、基础entity、query查询类2.7 为了方便处理异常,一般还可以入参…...

QT-界面居中管理
问题:为什么不能对checkbox直接居中,LineEdit可以 复选框是一个固定大小的控件,不适合填满整个单元格,而相比之下QLineEdit是一个可变大小的控件 关于居中: lineEdit:lineEdit -> setAlignment(QT::Al…...