// 定义文件系统目录树的数据结构
enum FileType {
Directory,
File(String), // 文件名及扩展名
}
struct FileNode {
name: String,
file_type: FileType,
children: Vec<FileNode>,
}
// 查找所有.txt文件路径的函数
fn find_txt_files(root: &FileNode) -> Vec<String> {
let mut paths = Vec::new();
match root.file_type {
FileType::File(ref file_name) if file_name.ends_with(".txt") => {
paths.push(root.name.clone());
},
FileType::Directory => {
for child in &root.children {
paths.extend(find_txt_files(child));
}
},
_ => {}
}
paths
}
fn main() {
// 构建一个简单的文件系统目录树示例
let file1 = FileNode {
name: "file1.txt".to_string(),
file_type: FileType::File("file1.txt".to_string()),
children: Vec::new(),
};
let file2 = FileNode {
name: "file2.txt".to_string(),
file_type: FileType::File("file2.txt".to_string()),
children: Vec::new(),
};
let sub_dir = FileNode {
name: "sub_dir".to_string(),
file_type: FileType::Directory,
children: vec![file1, file2],
};
let root = FileNode {
name: "root".to_string(),
file_type: FileType::Directory,
children: vec![sub_dir],
};
let txt_files = find_txt_files(&root);
println!("{:?}", txt_files);
}
性能优化
- 减少不必要的递归:在大规模数据结构中,递归调用会带来栈空间的开销。可以考虑将递归转换为迭代,使用栈来模拟递归过程,这样可以避免栈溢出问题。例如,使用
std::collections::VecDeque
作为栈来实现深度优先搜索(DFS)。
- 剪枝优化:在模式匹配过程中,如果某个分支明显不会包含
.txt
文件,可以提前终止该分支的搜索。例如,如果某个目录节点下没有任何文件(通过判断children
是否为空),则可以直接跳过该节点的子树。
- 缓存中间结果:如果某些子树的搜索结果会被多次使用,可以考虑缓存这些结果。但要注意缓存的更新和管理,避免数据不一致。
- 并行处理:对于大规模数据结构,可以考虑并行处理不同的子树。Rust提供了
rayon
等库来实现并行迭代,将搜索任务分配到多个线程中执行,提高整体性能。