扩展Nachos的文件系统
实验任务
尝试多级目录(目录树)的设计与实现方法。
拓展(选做):目前Nachos文件系统仅仅实现了单级目录结构,只有一个根目录。可以尝试采用目录树对文件进行管理。
设计思路
整体思路
在数据结构课设中,实现过带父结点指针的兄弟链表所实现的目录树,但是阅读Nachos代码,发现目录节点是DirectoryEntry并且在一开始初始化目录的时候,是以数组的形式初始化的,这样就不好进行像链表那样的动态新建目录或者文件的操作,也没法像链表一样索引关联节点。但是可以使用模拟指针的思想,以下标作为索引值,来找到某个文件/目录的父目录、左孩子、以及兄弟结点,从而能够遍历整颗树。
按照上面的思路进行编程发现,不需要那么强的拓展功能,所以不采用兄弟链表作为数据结构了,而是采用带模拟指针的多叉树数据结构 来实现目录树和多级目录,并且使用graphviz+dot 可视化目录树。
修改DirectoryEntry
首先修改DirectoryEntry,加入两个模拟指针以及孩子数的记录如下
class DirectoryEntry {
public:
bool inUse; // Is this directory entry in use?
int sector; // Location on disk to find the
// FileHeader for this file
char name[FileNameMaxLen + 1]; // Text name for file, with +1 for
// the trailing '\0'
int parent; // father dir 's index
int Child_Num; // dir's child num
int children[MaxDirChildNUm]; // dir's children
// bool filetype; // 0文件 1目录
};
Directory 的构造函数
在Directory 的构造函数中,设置0目录项是根目录Root,初始化的相关信息。他的父节点为-1,即没有,且children全为-1,即未分配。
Directory::Directory(int size)
{
table = new DirectoryEntry[size];
tableSize = size;
for (int i = 0; i < tableSize; i++){
table[i].inUse = FALSE;
// update
table[i].Child_Num = 0;
table[i].parent = 0;
for(int j = 0; j < MaxDirChildNUm; j ++){
table[i].children[j] = -1;
}
}
// set table[0] as root
table[0].parent = -1;
table[0].inUse = TRUE;
}
Directory::Add
阅读代码发现,在目录中,真正在cp命令时发挥作用的是FindIndex 以及 Add函数,首先修改Add函数
思路:
看文件是否存在
分割路径(因为可能是多级目录路径)
找到要添加的节点的父节点
加入新节点并且更新新节点信息
更新父节点信息
代码
bool
Directory::Add(char *name, int newSector)
{
// My Code
// 1. Judge whether file is alread exists
if (FindIndex(name) != -1)
return FALSE;
// 2. Split the path
string copy_name = name;
// Split it from the last file
// For example: dir1/dir2/dir3/file cut into:
int cutpos = -1;
// Seek Cut Position
for(int i=0;i 0){
// Limit 100 level
char cstrParentName[1000];
strcpy(cstrParentName , ParentDir.c_str());
ParentDirId = FindIndex(cstrParentName);
}
// 4. Add new node in DirTable, and add info into Table Tree
for(int i=1;i
修改FindIndex
修改FindIndex函数使其能够正确根据多级路径查找目录表项
思路
代码
int
Directory::FindIndex(char *name)
{
// origin code
/*
for (int i = 0; i < tableSize; i++)
if (table[i].inUse && !strncmp(table[i].name, name, FileNameMaxLen))
return i;
return -1; // name not in directory
*/
// My updated code
// List();
// 1. Check whether there is dir or file from root
if(table[0].Child_Num <= 0){
printf("No dir or file from root\n");
return -1;
}
// 2. Split the multi path
vector PathTable = SplitPath(name);
// 3. Find the first root dir ForExample : dir1/dir2/dir3/txt
// We need to find dir1 firstly
// to scan
string scandir = PathTable[0];
// index of the first dir
int firstDirIndex = -1;
for(int i = 0; i < table[0].Child_Num; i ++){
int index = table[0].children[i];
// judge inuse
if(!table[index].inUse)
continue;
// judge Name Equal
bool issame = JudgeNameEqual(scandir,index,table);
if(issame){
firstDirIndex = index;
break;
}
}
// check valid
if(firstDirIndex == -1)
return -1;
// 4. From up to bottom scan the Tree and match
// To find final parent dir
// maybe just one dir
if(PathTable.size() == 1)
return firstDirIndex;
// multi dir
// and parent Id is the parent of target file (which means target dir)
int parentId = firstDirIndex;
// scan multi dir to match name
for(int i = 1; i < PathTable.size(); i ++){
// find flag
bool isfind = FALSE;
// scan this level's child to match
for(int j = 0; j < table[parentId].Child_Num; j++){
// In this level, current scan ID
int currentId = table[parentId].children[j];
// check inuse
if(!table[currentId].inUse)
continue;
// check name
bool issame = JudgeNameEqual(PathTable[i],currentId,table);
if(issame){
// we find the next dir
isfind = true;
// record the last dir in parentId
parentId = currentId;
break;
}
}
// Find Failed
if(!isfind)
return -1;
}
printf("Successfully Find: %s",parentId);
// return the parent Dir
return parentId;
}
List
为了展示目录树,修改List代码
思路
从table[0] 即根目录开始向下遍历,迭代输出所有文件和目录的名称
代码
void
Directory::List()
{
// My codes:
// List all the file names in dir
printf("Directory Contents:\n");
printf("/root\n");
// from the root
for(int i=1;i PathTable;
int index = i;
// find the parents
while(table[index].parent != -1){
string tmp = table[index].name;
PathTable.push_back(tmp);
index = table[index].parent;
}
// cout the path
printf("/root");
for(int j = PathTable.size() - 1; j >= 0; j --){
printf( "/");
cout << PathTable[j];
}
printf("\n");
}
}
}
Print
修改Print函数 使-D 指令能够正常执行
思路
从上到下进行层次遍历,名字记录在vector里,然后输出
代码
void
Directory::Print()
{
// My Codes
FileHeader *hdr = new FileHeader;
printf("Directory contents:\n");
for (int i = 0; i < tableSize; i++){
if (table[i].inUse) {
vector PathTable;
int index = i;
// not to root
while(table[index].parent != -1){
string temp = table[index].name;
PathTable.push_back(temp);
index = table[index].parent;
}
printf("Name: /root");
// the next path
for(int j=PathTable.size()-1;j>=0;j--){
printf("/");
cout<FetchFrom(table[i].sector);
hdr->Print();
}
}
printf("\n");
delete hdr;
}
Remove
重写Remove函数,使其能够正常删除多级目录,并且能够递归删除含有文件或者目录的目录
思路
根据多级目录 找到该文件
修改目录表项的InUse信息
更新有关父节点的信息
如果删除的是目录,递归删除该目录所有内容
代码
bool
Directory::Remove(char *name)
{
// MY codes:
int i = FindIndex(name);
// name not in directory
if (i == -1)
return FALSE;
// clean dir table set false
table[i].inUse = FALSE;
// Update parent
int parentId = table[i].parent;
// Until Roor
if(parentId != -1){
// record other child except I
vector tempChild;
for(int j=0;j
递归删除子目录或者子文件DeteleChildren
//---------------------------------------------------------------------
// Directory::DeteleChildren
//
// "name" -- the file name to be removed
//----------------------------------------------------------------------
void
Directory::DeteleChildren(int i){
for(int j = 0; j < table[i].Child_Num; j ++){
int index = table[i].children[j];
if(table[index].inUse){
table[index].inUse = FALSE;
table[index].Child_Num = 0;
DeteleChildren(index);
}
}
}
可视化
(1) 增加 -V 参数 代表visualize Catalog Tree
(2) 在filesys 添加相应成员函数
以及
//---------------------------------------------------------------------
// FileSystem::VisualTree
// Visual CataLog TRee
//---------------------------------------------------------------------
void
FileSystem::VisualTree()
{
Directory *directory = new Directory(NumDirEntries);
directory->FetchFrom(directoryFile);
directory->VisualCataLogTree();
delete directory;
}
(3) 在目录类中加入可视化函数:
思路
使用graphviz + dot 作图
ofstream写出到文件dot代码
通过层次遍历添加dot代码
系统执行进行作图
代码
//--------------------------------------------------------------------
// Directory::VisualCataLogTree
// VisualCataLogTree
//--------------------------------------------------------------------
void Directory::VisualCataLogTree(){
ofstream fout;
fout.open("VisualCataLogTree.dot");
fout<<"strict digraph s{\n";
fout<<"root[shape=record,color=green];\n";
for(int i=0;i PathTable;
while(table[index].parent != -1){
string s = table[index].name;
PathTable.push_back(s);
index = table[index].parent;
}
PathTable.push_back("root");
for(int j=PathTable.size()-1;j>=1;j--)
fout< "<
完成!
测试CataLogTree
修改宏定义
在directory.h
#define MaxDirChildNUm 20 // the number of child that a dir can have
使得最多有20个孩子
在filesys.cc中
#define NumDirEntries 20
使得目录表可以有20项,最多20个文件+目录
测试cp命令
执行如下代码
rm DISK
./nachos -f
./nachos -cp test/small /file1
./nachos -cp test/empty /dir1
./nachos -cp test/empty /dir12
./nachos -cp test/medium /file2
./nachos -cp test/medium /dir1/file21
./nachos -cp test/empty /dir1/dir2
./nachos -cp test/small /dir1/file22
./nachos -cp test/small /dir12/file121
./nachos -cp test/empty /dir12/dir21
./nachos -cp test/small /dir12/file122
测试-l命令
测试-V命令
输出图片
测试-r命令
./nachos -r /dir12
./nachos -r /file2
./nachos -V
结论体会
在目录树的设计中,使用了m叉树,首先肯定是把这个数据结构应用到目录表上的,但是同时不仅仅需要修改目录表类的函数,很多其他函数也会修改,体现了操作系统紧密连接的
实现目录表时,用了一些STL等工具,会方便很多,但是也出现了gcc版本不一致导致的错误,即在untils.h 和 sysdep.cc 里面定义了一些c++的工具时基于C++98和C++11差距较大,会报错,其中一种解决方案是把他们注释掉使用stdlib.h 库
使用多叉树复杂度大致为 O ( l o g m ( n ) ) O(log_m(n)) O ( l o g m ( n ) ) ,比单单一个线性表的目录表的查找更加高效,真实的操作系统应该需要这种高效。
你可能感兴趣的:(课程学习,操作系统,系统架构,数据结构,c++,中间件)
使用嵌入式Linux在ARM平台上使用MIPI CSI接口
WangWEel
linux arm开发 运维 嵌入式
使用嵌入式Linux在ARM平台上使用MIPICSI接口MIPICSI(MobileIndustryProcessorInterfaceCameraSerialInterface)是一种广泛应用于移动设备和嵌入式系统中的摄像头接口标准。在ARM平台上,我们可以使用嵌入式Linux操作系统来实现MIPICSI接口的功能。本文将介绍如何在ARM平台上使用嵌入式Linux来配置和操作MIPICSI接口,
蚂蚁集团可转正实习算法岗内推-自然语言
飞300
业界资讯 自然语言处理
具备极佳的工程实现能力,精通C/C++、Java、Pvthon、Perl等至少一门语言:对目前主流的深度学习平台:tensorflow、pytorch、mxnet等,至少对其中一个有上手经验;熟悉深度学习以及常见机器学习算法的原理与算法,能熟练运用聚类、分类、回归、排序等模型解决有挑战性的问题,有大数据处理的实战经验;有强烈求知欲,对人工智能领域相关技术有热情,内推链接:https://u.ali
”天下第一神数“——紫微斗数的JAVA实现!紫微玄机速run~
钮钴禄·爱因斯晨
赛博算命JAVA实现 java python 开发语言
各位佬儿们好呀~~互三必回哦~更多精彩:个人主页赛博算命精彩文章:梅花易数的java实现赛博算命系列文章不作溢美之词,不作浮夸文章,此文与功名进取毫不相关也!与各位共勉!!文章目录#前言:一、紫微斗数简介二、紫微斗数的数学原理1.**命盘构建规则**2.**星曜分布算法**3.**运势推导逻辑**三、Java实现步骤1.代码分布实现1.1**数据结构设计**1.2**命盘构建算法实现**1.3**
小白必看!2025 网络安全保姆级学习路线来啦~
白帽黑客-晨哥
学习 web安全 安全 数据库 php
关键词:网络安全入门、渗透测试学习、零基础学安全、网络安全学习路首先咱们聊聊,学习网络安全方向通常会有哪些问题1.初学者常见问题1.1如何开始学习网络安全?问题:网络安全领域广泛,初学者往往不知道从哪里入手。解答:从基础知识开始:学习计算机网络、操作系统、编程语言(如Python、Bash)。了解网络安全的基本概念,如加密、认证、漏洞、攻击类型等。使用在线资源(如Cybrary、OWASP)或书籍
IMX6ULL驱动开发uboot篇01
charlie114514191
从0开始的学习ARMv7a IMX6ULL芯片 驱动开发 IMX6ULL 嵌入式硬件 uboot
目录所以,啥是UBoot使用uboot的命令行完成点事情bdinfo,printenv和version环境变量内存操作所以,啥是UBoot我们搞过STM32或者啥其他单片机的朋友都知道,我们的程序想要跑上去,需要一个BOOTLoader来提供一个最基本的,被初始化后的软硬件环境(比如说中断向量要布置好,C语言的栈环境要布置好等等!),对于跑操作系统,想要让一个大系统跑在一个板子上的重要步骤就是提供
【华为OD机试真题E卷】54、统一限载货物数最小值 | 机试真题+思路参考+代码解析(C++、Java、Py)
KFickle
Java Py) 华为od c++ java 华为OD机试真题 统一限载货物数最小值
文章目录一、题目题目描述输入输出样例1样例2二、代码与思路参考C++代码Java代码Python代码订阅本专栏后即可解锁在线OJ刷题权限个人博客首页:KFickle专栏介绍:最新的华为OD机试真题D、E卷,每题都使用C++,Java,Python语言进行解答,每个题目的思路分析都非常详细,持续更新,支持在线OJ刷题,订阅后评论获取权限,有代码问题随时解答,代码仅供学习参考一、题目题目描述火车站附近
DeepSeek本地部署教程(Windows操作系统笔记本电脑适用)
程序员辣条
AI产品经理 产品经理 大模型 人工智能 DeepSeek Windows AI大模型
最近DeepSeek非常火,你想不想也本地部署,玩转AI呢?一、将DeepSeek部署到自己的电脑有以下好处:1.数据隐私与安全本地存储:所有数据保存在本地,避免第三方服务器存储带来的隐私风险。数据控制:完全掌控数据访问权限,防止未经授权的访问或泄露。2.性能优化低延迟:本地运行减少网络延迟,响应速度更快。资源利用:可根据硬件配置优化性能,充分利用本地计算资源。3.定制化灵活配置:可根据需求调整模
【华为OD技术面试手撕真题】113、组合总和 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)
KJ.JK
华为OD技术面试手撕真题 华为od 面试 c语言 华为od机试E卷 华为od机试真题 组合总和
文章目录一、题目题目描述样例1二、代码参考C语言思路C语言代码C++语言思路C++代码Java语言思路Java代码Python语言思路Python代码JS语言思路JS代码作者:KJ.JK个人博客首页:KJ.JK专栏介绍:本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C&C++&Java&Python&JS),思路分析都非常详细,争取实现最低的时间复杂度和高通过率,每
mysql新手常见问题解决方法总结
微刻时光
笔记 mysql 数据库 人工智能 影刀证书 影刀RPA pyhon rpa
1.安装与配置问题1.1无法安装MySQLServerMySQLServer安装失败是新手常见的问题之一,以下是具体原因及解决方案:系统要求不满足:MySQL对操作系统有最低版本要求,如Windows7SP1及以上、macOS10.13及以上。若系统版本过低,安装程序可能无法正常运行。例如,在WindowsXP系统上安装MySQLServer8.0,会直接提示系统不兼容,无法进行安装。安装包选择错
win11编译pytorch cuda128版本流程
System_sleep
pytorch 人工智能 python 编译 windows cuda
Geforce50xx系显卡最低支持cuda128,torchcu128release版本目前还没有释放,所以自己基于2.6.0源码自己编译wheel包。1.前置条件1.使用visualstudioinstaller安装visualstudio2022,工作负荷选择【使用c++的桌面开发】,安装完成后将“VC\Tools\MSVC\\bin\Hostx64\x64”对应的路径加入环境变量;2.访问
CD刻录的一点个人经验:铭大、铼德、三菱、万盛, Nero、Burnatonce、Burrrn、Feurio
System_sleep
CD刻录 CD音乐刻录 Feurio Burnatonce CD刻录碟 Nero
基本信息操作系统win1021H119043刻录机型号ASUSSDRW-08D3S-U(USB2.0外置)最低x10碟片信息1.铭大金碟(MNDA)江南水乡,制造商Plasmondatasystemsltd.ShortStrategyTypePhthalocyanine2.三菱AZO水蓝,制造商MitsubishChemicalCorporationLongStrategyTypeCyanine3
标量、向量、矩阵与张量:从维度理解数据结构的层次
舒旻
AI杂谈 矩阵 数据结构 线性代数 人工智能 深度学习
在数学和计算机科学中,维度描述了数据结构的复杂性,而标量、向量、矩阵、张量则是不同维度的数据表示形式。它们的关系可以理解为从简单到复杂的扩展,以下是详细解析:1.标量(Scalar):0维数据定义:单个数值,没有方向,只有大小。维度:0维(无索引)。示例:温度(25℃)、年龄(30岁)、灰度图像的单个像素值(128)。特点:基础数据单元,所有复杂结构的起点。2.向量(Vector):1维数据定义:
VB6 调用 JS 函数时数据传输json格式或a=1&b=s2字符串
专注VB编程开发20年
javascript json 开发语言 vb6 js
1.VB6调用JS函数时数据传输格式当从VB6调用JS设计的函数时,使用JSON字符串作为数据传输格式是一个不错的选择,但并非唯一选择。使用JSON字符串传输的优势通用性:JSON是一种轻量级的数据交换格式,具有良好的跨语言和跨平台特性。在VB6和JS之间使用JSON字符串传输数据,可以方便地表示复杂的数据结构,如对象、数组等。结构化:JSON可以清晰地表示数据的结构,便于在不同语言环境中解析和处
C++ 泛型编程
四代目 水门
C++学习笔记 c++ 开发语言
C++泛型编程一、泛型编程基础1.核心概念实现算法与数据结构的分离基于模板技术(函数模板/类模板)本质:类型参数化,减少重复代码典型应用:STL容器、迭代器、算法2.类型本质内存布局的抽象不同类型对应不同的内存分配策略二、函数模板1.基本语法cpptemplate//或template返回类型函数名(参数列表){//函数体}2.关键特性支持隐式推导和显式指定类型可重载(包括与普通函数重载)可声明为
【学习笔记5】Linux下cuda、cudnn、pytorch版本对应关系
longii11
linux pytorch 运维
一、cuda和cudnnNVIDIACUDAToolkit(CUDA)为创建高性能GPU加速应用程序提供了一个开发环境。借助CUDA工具包,您可以在GPU加速的嵌入式系统、桌面工作站、企业数据中心、基于云的平台和HPC超级计算机上开发、优化和部署您的应用程序。该工具包包括GPU加速库、调试和优化工具、C/C++编译器以及用于部署应用程序的运行时库。全球的深度学习研究人员和框架开发人员都依赖cuDN
字节跳动2024校招后端开发面试题大全(含解题思路)
AI天才研究院
ChatGPT AI大模型企业级应用开发实战 DeepSeek R1 & 大数据AI人工智能大模型 大厂Offer收割机 面试题 简历 程序员读书 硅基计算 碳基计算 认知计算 生物计算 深度学习 神经网络 大数据 AIGC AGI LLM Java Python 架构设计 Agent 程序员实现财富自由
字节跳动2024校招后端开发面试题大全(含解题思路)关键词:字节跳动、校招、后端开发、面试题、解题思路摘要:本文将围绕字节跳动2024校招后端开发面试题进行深入分析,包括数据结构与算法、编程语言基础、后端技术栈、微服务架构、系统设计与优化等方面的面试题。通过详细解析这些面试题,帮助读者理解解题思路,提升后端开发面试技能。字节跳动2024校招后端开发面试背景字节跳动(ByteDance)是中国领先的
【Qt】Qt Widgets和QML(Qt Quick)开发界面的区别
£އއ昔年
qt 开发语言
Qt提供了两种主要的UI技术:QtWidgets和QML(QtQuick)。它们的核心区别主要体现在使用方式、架构、性能、开发难度和适用场景等方面。1.QtWidgetsvs.QML总体对比对比项QtWidgetsQML(QtQuick)语言C++(带QtUI库)QML+JavaScript(底层C++)渲染方式传统窗口系统控件(原生或模拟)基于OpenGL,使用GPU加速UI风格经典桌面UI(W
[数据结构] [C++ STL] vector使用详解
高亚奇
数据结构 数据结构 c++ 开发语言
一、概述vector(向量):是一种序列式容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而vector正好弥补了这个缺陷,它的特征是相当于可分配拓展的数组(动态数组),它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。二、定义及初始化使用之前必须加相应容器的头文件:#include//vector属于std命名域的,因
数据结构与算法--实现链表的复制(链表中节点比较特殊,含有一个rand指针,指向任意一个节点)
请叫我大虾
数据结构 链表 数据结构
已在leetcode上执行通过//https://leetcode.com/problems/copy-list-with-random-pointer/leetcode地址publicclassCopyListWithRandom{publicstaticclassNode{intval;Nodenext;Noderandom;publicNode(intval){this.val=val;th
【python】软件更新:用conda或Poetry
无水先生
AI原理和python实现 python指南和应用 人工智能综合 python conda 开发语言
一、说明在实现anancoda的软件更新问题,需要明确几个问题:1)是python包吗?2)是C++包吗?更新的方法有别。python包可以pip访问。C++包必须是conda访问。二、更新C++包的循环依赖问题如果在Windows10上的Ananconda3.7上安装和更新软件包。运行代码时:condaupdate--all或者condainstallpandas收到以下错误:RemoveErr
拓展:核心对象成员访问操作符
神里流~霜灭
c++ c语言 数据结构 链表 顺序表 操作符
前言针对于核心对象成员访问操作符,这篇文章只简单介绍一下两者的区别以及优缺点,什么情况下使用操作符(->)、什么情况下使用操作符(.)。在C++中,操作符->(箭头操作符)和.(点操作符)是用于访问对象成员的核心操作符,但它们的使用场景和底层逻辑有明显区别。以下是详细分析:一、基本定义与区别操作符适用对象语法等价底层逻辑.对象实例(非指针)obj.member直接访问对象的成员->指向对象的指针p
大型项目,选择conda还是Poetry要点分析
Hello kele
conda Python Poetry AI编程 人工智能
在大型项目中选择conda还是Poetry,取决于项目的具体需求,以下从多个维度进行分析,助你判断哪个更合适:包管理方面支持的包类型conda:作为跨语言的包管理系统,不仅能管理Python包,还能处理其他语言(如C、C++、R等)的包和依赖。对于大型项目,尤其是涉及多语言协同开发的项目,比如数据科学项目中可能会用到Python进行数据分析,同时依赖底层用C语言编写的高性能计算库,conda可以很
数据结构拓展:详解realloc(C++)
神里流~霜灭
数据结构 c++ c语言 数据结构 顺序表 链表 线性表
前言在C++中,realloc是C标准库提供的一个内存管理函数,用于动态调整已分配内存块的大小。尽管C++更推荐使用new/delete或智能指针,但在某些场景(如与C代码交互或底层内存操作)中仍可能用到realloc。以下是详细分析:一、realloc的核心行为void*realloc(void*ptr,size_tnew_size);功能:调整ptr指向的内存块大小(原内存块由malloc/c
数据结构难学吗,如何才能学会?
玩转C语言和数据结构
数据结构 算法 c语言
本教程发布以来,有很多读者想我请教学习数据结构和算法的方法。接下来,我就结合自己学习数据结构的经历,谈谈学习数据结构的门槛,告诉大家一些学习数据结构的方法,帮大家规避一些学习数据结构和算法过程中可能会踩的坑。提示:想系统学习数据结构的小伙伴,推荐一个网站:数据结构与算法教程(C语言版)https://xiexuewu.github.io/这里有一整套的数据结构和算法教程,提供有完整、可运行的C语言
【2024年华为OD机试】 (C卷,100分)- 分配土地(JavaScript&Java & Python&C/C++)
妄北y
算法汇集笔记总结(保姆级) 华为od c语言 javascript python java
一、问题描述题目描述从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。某天,集体村民决定将覆盖相同数字的最小矩阵形的土地分配给村里做出巨大贡献的村民。请问此次分配土地,做出贡献的村民最大会分配多大面积?输入描述第一行输入m和n:m代表村子的土地的长。n代表土地的宽。第二行开始输入地图上的具体标识:旗子上的数字为1~500,未插旗子的土地用0标识。输出描述输出此次分配土地,
数据结构——六度空间理论验证
FineFINE01
数据结构 数据结构 图论
一、实验项目要求1.输入格式:多组数据输入,每组数据m+1行,第一行有两个数字,n和m,代表着n个人和m组朋友的关系,n个人的编号为1到n,第二行到第m+1行每行包括两个数字a和b,代表着两个人互相认识。输出格式:对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:百分比%”。二、理论分析六度空间理论的数学模型属于图结构,我们把六
电商智能客服实战(一)---概要设计
power-辰南
企业级AI项目实战 人工智能 ai agent 智能客服 大模型 NER NUL
第一章系统架构全景图模块组成与层级关系:智能客服API层:系统唯一入口,处理多协议请求需求感知模块:用户需求解析核心模块规划模块:决策与解决方案生成中心规划-工具模块:业务能力扩展接口用户交互模块:对话管理与个性化交互辅助监控及调试模块:全链路追踪与质量保障第二章智能客服API层功能与数据流通过HTTP/gRPC请求协议转换身份认证请求路由负载均衡限流熔断需求感知模块技术实现:协议支持:FastA
双指针——滑动窗口
六七_Shmily
算法题 c++ 双指针 滑动窗口
双指针算法是一种常用的算法技巧,广泛应用于数组、链表、字符串等数据结构的处理中。其中,滑动窗口是双指针的一种特殊形式,主要用于解决子数组或子字符串相关的问题。下面我们详细讨论双指针和滑动窗口的区别,以及滑动窗口的特点和应用场景。1.双指针的基本形式双指针的核心思想是使用两个指针(通常是下标或迭代器)在数据结构中协同工作,通过移动指针来解决问题。双指针的常见形式包括:左右指针:两个指针从两端向中间移
数据结构理论
@YeMaolin
算法设计与分析 数据结构 c++
目录基本概念和术语数据数据元素数据项数据对象数据结构数据的结构逻辑结构存储结构(物理结构)数据类型定义原子数据类型结构数据类型抽象数据类型(AbstractDataType,ADT)算法和算法分析算法算法设计要求时间复杂度空间复杂度基本概念和术语数据对客观事物的符号表示,描述客观事物的数、字符、以及所有能输入到计算机中,被计算机程序识别和处理的符号的集合。包括数值型数据和非数值型数据。数据元素数据
二叉树三种遍历方式——前序、中序、后序(C++)
六七_Shmily
#C++ 数据结构与算法分析 c++ 算法 开发语言
以下是使用C++实现的二叉树前序、中序和后序遍历的递归方法示例:#includeusingnamespacestd;//二叉树节点结构体structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};//前序遍历voidpreOrder(TreeNode
用MiddleGenIDE工具生成hibernate的POJO(根据数据表生成POJO类)
AdyZhang
POJO eclipse Hibernate MiddleGenIDE
推荐:MiddlegenIDE插件, 是一个Eclipse 插件. 用它可以直接连接到数据库, 根据表按照一定的HIBERNATE规则作出BEAN和对应的XML ,用完后你可以手动删除它加载的JAR包和XML文件! 今天开始试着使用
.9.png
Cb123456
android
“点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png
智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸,造成图形的失真变形。
我们都知道android平台有多种不同的分辨率,很多控件的切图文件在被放大拉伸后,边
算法的效率
天子之骄
算法效率 复杂度 最坏情况运行时间 大O阶 平均情况运行时间
算法的效率
效率是速度和空间消耗的度量。集中考虑程序的速度,也称运行时间或执行时间,用复杂度的阶(O)这一标准来衡量。空间的消耗或需求也可以用大O表示,而且它总是小于或等于时间需求。
以下是我的学习笔记:
1.求值与霍纳法则,即为秦九韶公式。
2.测定运行时间的最可靠方法是计数对运行时间有贡献的基本操作的执行次数。运行时间与这个计数成正比。
java数据结构
何必如此
java 数据结构
Java 数据结构
Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类:
枚举(Enumeration)
位集合(BitSet)
向量(Vector)
栈(Stack)
字典(Dictionary)
哈希表(Hashtable)
属性(Properties)
以上这些类是传统遗留的,在Java2中引入了一种新的框架-集合框架(Collect
MybatisHelloWorld
3213213333332132
//测试入口TestMyBatis
package com.base.helloworld.test;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibat
Java|urlrewrite|URL重写|多个参数
7454103
java xml Web 工作
个人工作经验! 如有不当之处,敬请指点
1.0 web -info 目录下建立 urlrewrite.xml 文件 类似如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE u
达梦数据库+ibatis
darkranger
sql mysql ibatis SQL Server
--插入数据方面
如果您需要数据库自增...
那么在插入的时候不需要指定自增列.
如果想自己指定ID列的值, 那么要设置
set identity_insert 数据库名.模式名.表名;
----然后插入数据;
example:
create table zhabei.test(
id bigint identity(1,1) primary key,
nam
XML 解析 四种方式
aijuans
android
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用Java解析XML的四种方法。
XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object
spring中配置文件占位符的使用
avords
1.类
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.o
前端工程化-公共模块的依赖和常用的工作流
bee1314
webpack
题记: 一个人的项目,还有工程化的问题嘛? 我们在推进模块化和组件化的过程中,肯定会不断的沉淀出我们项目的模块和组件。对于这些沉淀出的模块和组件怎么管理?另外怎么依赖也是个问题? 你真的想这样嘛? var BreadCrumb = require(‘../../../../uikit/breadcrumb’); //真心ugly。
上司说「看你每天准时下班就知道你工作量不饱和」,该如何回应?
bijian1013
项目管理 沟通 IT职业规划
问题:上司说「看你每天准时下班就知道你工作量不饱和」,如何回应
正常下班时间6点,只要是6点半前下班的,上司都认为没有加班。
Eno-Bea回答,注重感受,不一定是别人的
虽然我不知道你具体从事什么工作与职业,但是我大概猜测,你是从事一项不太容易出现阶段性成果的工作
TortoiseSVN,过滤文件
征客丶
SVN
环境:
TortoiseSVN 1.8
配置:
在文件夹空白处右键
选择 TortoiseSVN -> Settings
在 Global ignote pattern 中添加要过滤的文件:
多类型用英文空格分开
*name : 过滤所有名称为 name 的文件或文件夹
*.name : 过滤所有后缀为 name 的文件或文件夹
--------
【Flume二】HDFS sink细说
bit1129
Flume
1. Flume配置
a1.sources=r1
a1.channels=c1
a1.sinks=k1
###Flume负责启动44444端口
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=44444
a1.sources.r1.chan
The Eight Myths of Erlang Performance
bookjovi
erlang
erlang有一篇guide很有意思: http://www.erlang.org/doc/efficiency_guide
里面有个The Eight Myths of Erlang Performance: http://www.erlang.org/doc/efficiency_guide/myths.html
Myth: Funs are sl
java多线程网络传输文件(非同步)-2008-08-17
ljy325
java 多线程 socket
利用 Socket 套接字进行面向连接通信的编程。客户端读取本地文件并发送;服务器接收文件并保存到本地文件系统中。
使用说明:请将TransferClient, TransferServer, TempFile三个类编译,他们的类包是FileServer.
客户端:
修改TransferClient: serPort, serIP, filePath, blockNum,的值来符合您机器的系
读《研磨设计模式》-代码笔记-模板方法模式
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
配置心得
chenyu19891124
配置
时间就这样不知不觉的走过了一个春夏秋冬,转眼间来公司已经一年了,感觉时间过的很快,时间老人总是这样不停走,从来没停歇过。
作为一名新手的配置管理员,刚开始真的是对配置管理是一点不懂,就只听说咱们公司配置主要是负责升级,而具体该怎么做却一点都不了解。经过老员工的一点点讲解,慢慢的对配置有了初步了解,对自己所在的岗位也慢慢的了解。
做了一年的配置管理给自总结下:
1.改变
从一个以前对配置毫无
对“带条件选择的并行汇聚路由问题”的再思考
comsci
算法 工作 软件测试 嵌入式 领域模型
2008年上半年,我在设计并开发基于”JWFD流程系统“的商业化改进型引擎的时候,由于采用了新的嵌入式公式模块而导致出现“带条件选择的并行汇聚路由问题”(请参考2009-02-27博文),当时对这个问题的解决办法是采用基于拓扑结构的处理思想,对汇聚点的实际前驱分支节点通过算法预测出来,然后进行处理,简单的说就是找到造成这个汇聚模型的分支起点,对这个起始分支节点实际走的路径数进行计算,然后把这个实际
Oracle 10g 的clusterware 32位 下载地址
daizj
oracle
Oracle 10g 的clusterware 32位 下载地址
http://pan.baidu.com/share/link?shareid=531580&uk=421021908
http://pan.baidu.com/share/link?shareid=137223&uk=321552738
http://pan.baidu.com/share/l
非常好的介绍:Linux定时执行工具cron
dongwei_6688
linux
Linux经过十多年的发展,很多用户都很了解Linux了,这里介绍一下Linux下cron的理解,和大家讨论讨论。cron是一个Linux 定时执行工具,可以在无需人工干预的情况下运行作业,本文档不讲cron实现原理,主要讲一下Linux定时执行工具cron的具体使用及简单介绍。
新增调度任务推荐使用crontab -e命令添加自定义的任务(编辑的是/var/spool/cron下对应用户的cr
Yii assets目录生成及修改
dcj3sjt126com
yii
assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问protected下面的文件,但是我们又希望将module单独出来,所以需要使用发布,即将一个目录下的文件复制一份到assets下面方便通过url访问。
assets设置对应的方法位置 \framework\web\CAssetManager.php
assets配置方法 在m
mac工作软件推荐
dcj3sjt126com
mac
mac上的Terminal + bash + screen组合现在已经非常好用了,但是还是经不起iterm+zsh+tmux的冲击。在同事的强烈推荐下,趁着升级mac系统的机会,顺便也切换到iterm+zsh+tmux的环境下了。
我为什么要要iterm2
切换过来也是脑袋一热的冲动,我也调查过一些资料,看了下iterm的一些优点:
* 兼容性好,远程服务器 vi 什么的低版本能很好兼
Memcached(三)、封装Memcached和Ehcache
frank1234
memcached ehcache spring ioc
本文对Ehcache和Memcached进行了简单的封装,这样对于客户端程序无需了解ehcache和memcached的差异,仅需要配置缓存的Provider类就可以在二者之间进行切换,Provider实现类通过Spring IoC注入。
cache.xml
<?xml version="1.0" encoding="UTF-8"?>
Remove Duplicates from Sorted List II
hcx2013
remove
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,Given 1->2->3->3->4->4->5,
Spring4新特性——注解、脚本、任务、MVC等其他特性改进
jinnianshilongnian
spring4
Spring4新特性——泛型限定式依赖注入
Spring4新特性——核心容器的其他改进
Spring4新特性——Web开发的增强
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——Groovy Bean定义DSL
Spring4新特性——更好的Java泛型操作API
Spring4新
MySQL安装文档
liyong0802
mysql
工作中用到的MySQL可能安装在两种操作系统中,即Windows系统和Linux系统。以Linux系统中情况居多。
安装在Windows系统时与其它Windows应用程序相同按照安装向导一直下一步就即,这里就不具体介绍,本文档只介绍Linux系统下MySQL的安装步骤。
Linux系统下安装MySQL分为三种:RPM包安装、二进制包安装和源码包安装。二
使用VS2010构建HotSpot工程
p2p2500
HotSpot OpenJDK VS2010
1. 下载OpenJDK7的源码:
http://download.java.net/openjdk/jdk7
http://download.java.net/openjdk/
2. 环境配置
▶
Oracle实用功能之分组后列合并
seandeng888
oracle 分组 实用功能 合并
1 实例解析
由于业务需求需要对表中的数据进行分组后进行合并的处理,鉴于Oracle10g没有现成的函数实现该功能,且该功能如若用JAVA代码实现会比较复杂,因此,特将SQL语言的实现方式分享出来,希望对大家有所帮助。如下:
表test 数据如下:
ID,SUBJECTCODE,DIMCODE,VALUE
1&nbs
Java定时任务注解方式实现
tuoni
java spring jvm xml jni
Spring 注解的定时任务,有如下两种方式:
第一种:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http
11大Java开源中文分词器的使用方法和分词效果对比
yangshangchuan
word分词器 ansj分词器 Stanford分词器 FudanNLP分词器 HanLP分词器
本文的目标有两个:
1、学会使用11大Java开源中文分词器
2、对比分析11大Java开源中文分词器的分词效果
本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断。
11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口:
/**
* 获取文本的所有分词结果, 对比