备战秋招——算法与数据结构(15)

1. shell脚本统计文件中单词的个数

方法一:
(1)cat file|sed ‘s/[,.:;/!?]/ /g’|awk ‘{for(i=1;i<=NF;i++)array[KaTeX parse error: Expected 'EOF', got '}' at position 6: i]++;}̲ END{for(i in a…i]++;}
END{for(i in array) print i,array[i]}’
#(1)和(2)效果一致。

方法二:
(1)awk ‘BEGIN{RS="[,.:;/!?]"}{for(i=1;i<=NF;i++)array[$i]++;}
END{for(i in array) print i,array[i]}’ file

2. redis的对象类型有哪些,底层的数据结构。(主要是有序列表的底层实现)

Redis的五大数据类型也称五大数据对象;前面介绍过6大数据结构,Redis并没有直 接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统 redisObject;这个对象系统包含了五大数据对象,字符串对象(string)、列表对象 (list)、哈希对象(hash)、集合(set)对象和有序集合对象(zset);而这五大 对象的底层数据编码可以用命令OBJECT ENCODING来进行查看。
1.字符串对象(string):字符串对象底层数据结构实现为简单动态字符串(SDS)和直接 存储,但其编码方式 可以是int、raw或者embstr,区别在于内存结构的不同。
2.列表对象(list):列表对象的编码可以是ziplist和linkedlist。
3.哈希对象(hash):哈希对象的编码可以是ziplist和hashtable。
4.集合对象(set):集合对象的编码可以是intset和hashtable。
5.有序集合对象(zset):有序集合的编码可以是ziplist和skiplist。
(1)ziplist编码
ziplist编码的有序集合对象底层实现是压缩列表,其结构与哈希对象类似,不同的是 两个紧密相连的压缩列表节点,第一个保存元素的成员,第二个保存元素的分值,而且 分值小的靠近表头,大的靠近表尾。

(2)skiplist编码
skiplist编码的有序集合对象底层实现是跳跃表和字典两种;
每个跳跃表节点都保存一个集合元素,并按分值从小到大排列;节点的object属性保 存了元素的成员,score属性保存分值;
字典的每个键值对保存一个集合元素,字典的键保存元素的成员,字典的值保存分值。

skiplist编码同时使用跳跃表和字典实现的原因
跳跃表优点是有序,但是查询分值复杂度为O(logn);字典查询分值复杂度为O(1) , 但是无序,所以结合连个结构的有点进行实现。
虽然采用两个结构但是集合的元素成员和分值是共享的,两种结构通过指针指向同一地 址,不会浪费内存。
有序集合编码转换:
有序集合对象使用ziplist编码需要满足两个条件:一是所有元素长度小于64字节; 二是元素个数小于128个;不满足任意一条件将使用skiplist编码。
以上两个条件可以在Redis配置文件中修改zset-max-ziplist-entries选项和 zset-max-ziplist-value选项。
在这里插入图片描述
需要完整版一线互联网大厂面试题以及关于c++ Linux后台服务器开发的一些知识点分享:Linux,Nginx,MySQL,Redis,P2P,K8S,Docker,TCP/IP,协程,DPDK,webrtc,音视频等等视频。
vx关注零声学院公众号领取!
在这里插入图片描述

3. linux下IPC有哪些

①匿名管道(PIPE)和有名管道(FIFO):最简单
②信号(SIGNAL):系统的开销最小
③共享映射区(MMAP):可以在无血缘关系的进程间通信
④本地套接字(SOCKET):最稳定(但是比较复杂)

4. vector内存增长方式

vector的实现通常会分配比新的空间需求更大的内存空间。容器预留这些空间作为备 用,从而用来保存更多新的元素。这样,就不需要每次添加新的元素都重新分配容器的 内存空间了。
在插入新元素时,若遇到已分配容量不足的情况,会自动拓展容量大小,而这个拓展容 量的过程为:
开辟另外一块更大的内存空间,该空间大小通常为原空间大小的两倍(理论分析上是 1.5最好,但从时间和空间上综合考虑,一般取2);
将原内存空间中的数据拷贝到新开辟的内存空间中;
析构原内存空间的数据,释放原内存空间,并调整各种指针指向新内存空间。
vector类型提供了一些成员函数,允许我们与它的现实中内存分配部分互动。
c.capacity() 不重新分配内存空间的话,c可以保存多少元素
c.reserve(n) 分配至少能容纳n个元素的内存空间
c.shrink_to_fit() 将capacity()减少为size()相同大小,size()为vector已经保存元素个数。

猜你喜欢

转载自blog.csdn.net/lingshengxueyuan/article/details/107980939
今日推荐