Question List in March, 2023

1、工作记录

工作内容不对外公开。

2、日常积累

2.1 LINUX 清除缓存

#linux

  1. 清除缓存:

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
  1. 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-误删

误删文件恢复

  1. 在vscode界面,按住Ctrl+shift+p打开命令面板,找到本地历史记录;

  2. 点击本地历史记录,会将刚才删除的文件给列出来,点击文件即可查看对该文件的操作记录,选中想要的记录,会打开该文件代码,复制出来即可。

参考文献

  1. CSDN 博客. 清理linux系统内存缓存[EB/OL].

  2. CSDN 博客. 图解R树的原理及相关操作[EB/OL].

  3. 知乎. 走近std::tuple,揭秘C++元组的底层实原理[EB/OL].

  4. 博客园. 12种数据量纲化处理方式[EB/OL].

  5. AcWing. 处理区间的数据结构总结[EB/OL].

  6. GIS 开发者. 空间拓扑关系详解[EB/OL].

  7. 简书. 判断点在线段上的投影点是否在线段内[EB/OL].

  8. CSDN 博客. VSCode恢复被误删的文件(巧用本地历史记录)[EB/OL].