Question List in March, 2023
1、工作记录
工作内容不对外公开。
2、日常积累
2.1 LINUX 清除缓存
#linux
清除缓存:
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
# 它们所表示的含义为:
# echo 1 表示清除pagecache。
# echo 2 表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。
# slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
# echo 3 表示清除pagecache和slab分配器中的缓存对象。
(2)清除磁盘空间:
# 列出磁盘空间现状
df -h
# 列出目录下的各文件夹的大小
du -ah --max-depth=1/
(3)命令行计算器:
bc
VSCode 设置终端显示行数
Setttings: Terminal > Integrated:Scrollback 设置显示行数
2.2 线段树
#线段树
线段树又称区间树,是一种基于分治思想的二叉树结构,每个节点代表一段区间,和按照利用二进制性质划分区间的树状数组相比,线段树是一种更加通用的数据结构。线段树的每个节点代表一个区间,叶子节点代表输入序列中的单个元素,非叶子节点代表输入序列中的一些元素的区间。
线段树的主要应用是解决区间查询问题,例如区间最小值、区间最大值、区间和等问题。线段树可以在
\(O(\log n)\)
的时间内应答这些查询。在下面的示例代码中,我们定义了一个 SegmentTreeNode
结构体,表示线段树的节点。在 build 函数中,我们递归地构建线段树。在
query 函数中,我们递归地查询区间和。
#include <iostream>
#include <vector>
using namespace std;
// 线段树节点
struct SegmentTreeNode {
int start, end;
int sum;
SegmentTreeNode *left, *right;
SegmentTreeNode(int start, int end) {
this->start = start;
this->end = end;
this->sum = 0;
this->left = nullptr;
this->right = nullptr;
}
};
// 构建线段树
SegmentTreeNode* build(vector<int>& nums, int start, int end) {
if (start > end) {
return nullptr;
}
SegmentTreeNode* root = new SegmentTreeNode(start, end);
if (start == end) {
root->sum = nums[start];
} else {
int mid = start + (end - start) / 2;
root->left = build(nums, start, mid);
root->right = build(nums, mid + 1, end);
root->sum = root->left->sum + root->right->sum;
}
return root;
}
// 区间查询
int query(SegmentTreeNode* root, int start, int end) {
if (root == nullptr) {
return 0;
}
if (root->start == start && root->end == end) {
return root->sum;
}
int mid = root->start + (root->end - root->start) / 2;
if (end <= mid) {
return query(root->left, start, end);
} else if (start > mid) {
return query(root->right, start, end);
} else {
return query(root->left, start, mid) + query(root->right, mid + 1, end);
}
}
int main() {
vector<int> nums = {1, 3, 5, 7, 9, 11};
SegmentTreeNode* root = build(nums, 0, nums.size() - 1);
cout << query(root, 0, 2) << endl; // 输出9
cout << query(root, 2, 5) << endl; // 输出32
return 0;
}
2.3 C++ 基础
#cplusplus
C++11 引入了 tuple
元组容器,它是一个固定大小的不同类型值的集合,是一种快速而低质(quick
and dirty)的容器,可以用于函数返回多个返回值。通过
std::get<i>(tuple) 可以访问 tuple 中的第 i
个元素,也可以使用 std::tuple_size<decltype(tuple)>::value 来获取
tuple 的大小。以下是一个 tuple 的例子:
#include <iostream>
#include <tuple>
#include <string>
int main() {
std::tuple<int, std::string, double> myTuple(1, "hello", 3.14);
std::cout << std::get<0>(myTuple) << std::endl; // 1
std::cout << std::get<1>(myTuple) << std::endl; // hello
std::cout << std::get<2>(myTuple) << std::endl; // 3.14
std::cout << std::tuple_size<decltype(myTuple)>::value << std::endl; // 3
return 0;
}
2.4 VSCode
#vscode-误删
误删文件恢复
在vscode界面,按住Ctrl+shift+p打开命令面板,找到本地历史记录;
点击本地历史记录,会将刚才删除的文件给列出来,点击文件即可查看对该文件的操作记录,选中想要的记录,会打开该文件代码,复制出来即可。
参考文献
CSDN 博客. 清理linux系统内存缓存[EB/OL].
CSDN 博客. 图解R树的原理及相关操作[EB/OL].
知乎. 走近std::tuple,揭秘C++元组的底层实原理[EB/OL].
博客园. 12种数据量纲化处理方式[EB/OL].
AcWing. 处理区间的数据结构总结[EB/OL].
GIS 开发者. 空间拓扑关系详解[EB/OL].
简书. 判断点在线段上的投影点是否在线段内[EB/OL].
CSDN 博客. VSCode恢复被误删的文件(巧用本地历史记录)[EB/OL].