C++文件流结构体序列化,并查集,LRU缓存

Posted on 2023-05-26 16:56  玄灵镜  阅读(79)  评论(0编辑  收藏  举报

c语言中的文件操作中用fprintf将数据写入到文件中,用fscanf将文件读入内存中,而c++中也有ostream和istream作为键盘流输入,屏幕流输出,对于文件也有ofstream/istream来进行相关的操作.

如图:

图中表示将一个结构体的的数据输入到文件中,并从文件中读取数据,并用得到的数据初始化一个新的结构体,并打印输出。

并查集:

并查集本身可以理解为一片森林,但是这个森林起初所有的树都只有一个根节点,它可以用来查找是否各个元素是否在一个集合中,也可以用于集合之间的合并。

它的底层是一个数组,但是每个数组元素可以抽象的想象成一棵棵树,他的规则是根节点的元素值为整棵树中节点总个数的复数,而非根节点中存着它的双亲结点的下表,所以在用的时候可以将集合中的数据映射成数组的下标,之后做集合的运算处理。

 上图是一个包含简单功能的并查集,主要有两个成员函数,一个是找到根节点的函数,一个是合并两个集合。现在就用这两个并查集解决一个leetcode的题。

有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。

返回矩阵中 省份 的数量。

 

示例 1:


输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2
示例 2:


输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3
 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-provinces
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这个题中的每个城市可以理解为并查集中每个孤立的单元,我们实例化一个并查集,将其中的每一个城市放入并查集中,遍历这个矩阵,如果某个位置为1就联合这两个城市,最后遍历统计一下并查集中的根结点个数就是省份数量了。代码如图:

 LRU缓存:

平时在网页看视频时,可以看到加载进度条又一片灰色地带,可以知道这些是已经缓存好的,放在内存中,这样可以保障网络波动时流畅的看影视作品。

因为内存空间总是有限的,所以当新缓存进来时,那些旧的不怎么太用的数据就要被删除,他的机制是若空间没满就入数据,若满了就出最不用的数据,当使用数据时更新数据序列。leetcode上有一道题要求实现lru的同时时间复杂度为O(1).

所以他的成员变量有容量,一个用于存数据的list和一个用于要求时间复杂度的以哈希表为底层的unordered_map,为什么使用list而不是vector因为list的增删查改块.

首先成员变量结构:map的第二个参数为list的迭代器,这样可以list直接删除不需要迭代,而哈希表的查找可以认为时间复杂度为o(1),所以整体时间复杂度就是o(1)了.

具体结构如下:

 

请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

 

示例:

输入
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1); // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1); // 返回 -1 (未找到)
lRUCache.get(3); // 返回 3
lRUCache.get(4); // 返回 4
 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lru-cache
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 

Copyright © 2024 玄灵镜
Powered by .NET 8.0 on Kubernetes