uva 509 RAID!(磁盘数据)
习题4-7 RAID技术(RAID!, ACM/ICPC World Finals 1997, UVa509)
RAID技术用多个磁盘保存数据。每份数据在不止一个磁盘上保存,因此在某个磁盘损
坏时能通过其他磁盘恢复数据。本题讨论其中一种RAID技术。数据被划分成大小
为s(1≤s≤64)比特的数据块保存在d(2≤d≤6)个磁盘上,如图4-9所示,每d-1个数据块都
有一个校验块,使得每d个数据块的异或结果为全0(偶校验)或者全1(奇校验)。
图4-9 数据保存情况
例如,d=5,s=2,偶校验,数据6C7A79EDFC(二进制01101100 01111010 01111001
11101101 11111100)的保存方式如图4-10所示。
图4-10 数据6C7A79EDPC的保存方式
其中加粗块是校验块。输入d、s、b、校验的种类(E表示偶校验,O表示奇校验)以
及b(1≤b≤100)个数据块(其中“x”表示损坏的数据),你的任务是恢复并输出完整的数
据。如果校验错或者由于损坏数据过多无法恢复,应报告磁盘非法。
Sample Input
5 2 5
E
0001011111
0110111011
1011011111
1110101100
0010010111
3 2 5
E
0001111111
0111111011
xx11011111
3 5 1
O
11111
11xxx
x1111
0
Sample Output
Disk set 1 is valid, contents are: 6C7A79EDFC
Disk set 2 is invalid.
Disk set 3 is valid, contents are: FFC
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=833&problem=450&mosmsg=Submission+received+with+ID+21205211
注意点:
(行列块的顺序就按照图中的,一个磁盘道是一列)
1、校验块是不加入十六进制运算的
2、校验块的顺序是第一行的第一块,第二行的第二个,到了某行最后一个时,下一行就有从第一个开始算做校验块
3、十六进制转换是 一个十六进制数字需要四个二进制数字,所以每四位二进制就是一位十六进制
4、校验进行是一行中每个块的相同位进行校验
5、奇校验就是每个数互相异或下来是1,偶校验就是0
6、磁盘不合理有两种可能性:一是已知的位校验不符合,二是未知位有多位,无法判断其内容
7、关于输入的内容:
第一个数是磁盘道数,即列数,
第二个数是每个数据块中包含的二进制位个数
第三个数是有多少行数据,就是行数
8、题输入的数据流的分段没有意义,需要后期排列
9、数据存储是先存完一个磁道再存下一个,即按列的顺序竖的存(在这里栽过)
思路:
1、存储数据:使用三维数组,或二维向量vector(元素是string或int),我用的三维数组,可以想象成每个数据块就是在行和列组成的平面上拔地而起向上的01列
2、整体分两部分:补全缺的位,以及转换十六进制
3、补全:先循环行,再循环块里的位,用每一位循环列,每一列的当前位进行异或处理,结果和校验奇偶性即0,1一样即可,不一样就是错的,如果有 x ,那先记录下来 x 的下标,最后算完后的结果就是 x 的值。如果有多个 x ,就是错的。
4、二进制转十六进制:可以十六行暴力解,也可以转成十进制,大于9的六个数罗列输出
5、注意输入开始三个数的顺序
6、可以使用一个函数来看存储的数据。
没了
这个代码我使用了动态分配的数组,网上查的,挺有意思,C语言的三重指针真的是很奇妙,指针这种东西本身也是个变量,他特别的就是里面存的值是别的变量的地址罢了,仅此而已,无论几重指针都是如此
//uva 509 RAID(磁盘数据)
#include<iostream>
#include<string>
using namespace std;
/*
1 0 1
1 1 0
0 0 0
0 1 1
*/
//列个行 bca
int a,b,c; //数据块(几行),磁盘(一行几个,列),一单位数据几位//一个显示三维表的函数,辅助,不用也可以
void show(char ***disk)
{for(int i=0;i<a;i++){for(int j=0;j<b;j++){for(int k=0;k<c;k++)cout<<disk[i][j][k];cout<<"_";}cout<<endl;}cout<<endl;
}int repair(char ***disk,int od_ev)//od_ev直接传来0或1
{//应该先循环a,再循环c,后循环b//找到一位然后 循环一行中所有的这个位//cout<<a<<" "<<b<<" "<<c<<endl;for(int i=0;i<a;i++){for(int k=0;k<c;k++){int yihuo=0;int x_num=-1;for(int j=0;j<b;j++){
// cout<<i<<" "<<j<<" "<<k<<endl;
// show(disk);if(disk[i][j][k]=='x'){if(x_num!=-1)return 0;//disk invalidx_num=j;}elseyihuo=yihuo^(disk[i][j][k]-'0');}if(x_num!=-1)disk[i][x_num][k] = yihuo^od_ev+'0';else if(yihuo!=od_ev)return -1; //数据错误}}return 1;
}char hex(string bin)//char b1,char b2,char b3,char b4)
{//cout<<bin<<"----"<<endl;int n=(bin.at(0)-'0')*2*2*2+ (bin.at(1)-'0')*2*2 + (bin[2]-'0')*2+ (bin[3]-'0');if(n<10) return (n+'0');switch(n){case 10:return 'A';case 11:return 'B';case 12:return 'C';case 13:return 'D';case 14:return 'E';case 15:return 'F';}
// 以下是暴力解233
// string h="0000";
// h[0]=b1;
// h[1]=b2;
// h[2]=b3;
// h[3]=b4;
// if(h=="0000") return "0";
// if(h=="0001") return "1";
// if(h=="0010") return "2";
// if(h=="0011") return "3";
// if(h=="0100") return "4";
// if(h=="0101") return "5";
// if(h=="0110") return "6";
// if(h=="0111") return "7";
// if(h=="1000") return "8";
// if(h=="1001") return "9";
// if(h=="1010") return "A";
// if(h=="1011") return "B";
// if(h=="1100") return "C";
// if(h=="1101") return "D";
// if(h=="1110") return "E";
// if(h=="1111") return "F";}
int main()
{int NUM =0;while(cin>>b>>c>>a&&b!=0) //注意输入的顺序{char ***disk;char od_ev;cin>>od_ev;disk = new char**[a]; //disk指向存着a个char**型的空间//char **disk[a]for(int i=0;i<a;i++)disk[i] = new char*[b]; //disk里的每个元素指向存着b个char*型空间//char *disk[i][b]for(int i=0;i<a;i++)for(int j=0;j<b;j++)disk[i][j] = new char[c];for(int j=0;j<b;j++)for(int i=0;i<a;i++)for(int k=0;k<c;k++)cin>>disk[i][j][k];NUM++;cout<<"Disk set "<<NUM<<" is ";int retu = repair(disk,od_ev=='E'?0:1);if(retu!=1){cout<<"invalid."<<endl;continue; //进行下一次大循环}//cout<<retu<<endl;//show(disk);string result;string bin; //要转十六进制的四位二进制int num=0; //间隔是4,代表四位二进制int sum=a*b*c-a*c; //一共要过的字符量,除去校验位for(int i=0;i<a;i++)for(int j=0;j<b;j++){if((i+1)%b==(j+1)%b) //校验码{//sum-=c; //将查过的这c个也要记录continue;}for(int k=0;k<c;k++){
// cout<<"disk"<<i<<" "<<j<<" "<<k<<" "<<(disk[i][j][k])<<endl;;bin.append(1,disk[i][j][k]); //这里的1代表加入1个处于第二个元素的字符,这里没处理好。num++;
// cout<<bin<<"__"<<sum<<" "<<num<<endl;if(num%4==0){result.append(1,hex(bin));bin.erase();}else if(sum%4!=0&&sum==num)result.append(1,hex(bin+"0000"));}}cout<<"valid, contents are: ";cout<<result<<endl;}//whilereturn 0;
}
//AC at 2018/4/25
(题外话:这个一不小心又花掉了一个晚上,过了样例后,第二天一次过,爽哈哈哈,我只能写写程序来找回点信心的意义了,每天写代码的时间也并不多啊,感觉还是写程序好,每天都能获得一点成就感。每天真的好麻烦的,我可能也仅限于此了)
uva 509 RAID!(磁盘数据)相关推荐
- 转:概述RAID磁盘的IOPS
我们前面已经说过了,厂商所提供的IOPS值是在理想状态下测试出来的,对实际的运行性能的参考并不大,所以我们有必要通过以下几个方面来衡量该系统的实际IOPS的可能表现.决定IOPS的主要因素取决于阵列的 ...
- 美国主机中的RAID磁盘是什么意思?
在试图为美国主机决定最佳存储配置时,您可能已经遇到了RAID的概念.RAID在美国主机配置中相当普遍,并为存储数据提供冗余.本文将探讨软件和硬件RAID的概念,并讨论这些技术如何工作. 什么是RAID ...
- 创建RAID磁盘列表(Raid5和Raid10)
关于Raid磁盘阵列 [前言] 一.Raid磁盘阵列概述 RAID 中主要有三个关键概念和技术:镜像( Mirroring ).数据条带( Data Stripping )和数据校验( Data pa ...
- 关于RAID磁盘的介绍
RAID(独立冗余磁盘阵列) 把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术 组成磁盘阵列的不同方式称为RAID级别 常用的RA ...
- raid 磁盘列阵的使用
目录 一.raid 磁盘列阵的好处 二.raid6 磁盘列阵的创建 三.实验 一.raid 磁盘列阵的好处 1.提高存储的性能 r读的性能 w写的性能 2.数据的备份 raid0 1.读写性能提高 ...
- Linux学习第九课、磁盘容量配额、RAID磁盘冗余阵列
磁盘容量配额 Linux系统的设计初衷就是让许多人一起使用并执行各自的任务,从而成为多用户.多任务的操作系统.但是,硬件资源是固定且有限的,如果某些用户不断地在Linux系统上创建文件或者存放电影,硬 ...
- C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用
快速读写磁盘数据的方法: 1.块读取:一下子将数据读取到内存的(无论是文本还是二进制),而不是一行行的读取. 2.异步的IO,创建多线程,或者使用重叠IO,IO复用,异步的事件回调通知机制(可以用事件 ...
- quartus管脚分配后需要保存吗_电脑磁盘显示未分配怎么办?磁盘数据如何恢复?...
磁盘未分配的这部分磁盘空间上没有任何分区,也就是说这部分空间无法用来保存数据.那么,什么原因会导致磁盘变成未分配呢? 1.删除分区:在平时使用电脑的时候会有意或无意的将分区删除掉.磁盘上的分区被删除之 ...
- 使用驱动器h中的光盘之前需要将其格式化怎么办_电脑磁盘显示未分配怎么办?磁盘数据如何恢复?...
磁盘未分配的这部分磁盘空间上没有任何分区,也就是说这部分空间无法用来保存数据.那么,什么原因会导致磁盘变成未分配呢? 1.删除分区:在平时使用电脑的时候会有意或无意的将分区删除掉.磁盘上的分区被删除之 ...
- 计算机管理 未分配磁盘,电脑磁盘显示未分配怎么办?磁盘数据如何恢复?
Hugh 于 2020/07/31更新 数据恢复 摘要 想要恢复未分配磁盘数据,需要用到第三方数据恢复软件,下面小编就为大家详细介绍一下磁盘数据恢复软件 - 易我数据恢复的详细使用流程: 磁盘未分配的 ...
最新文章
- 支付产品必懂的会计基础及如何应用
- 老板:kill -9 的原理都不知道就敢去线上执行?明天不用来了
- number of databases available at XJTLU
- javascript 实现快排 ,三向切分快排
- set 数据类型的应用场景
- C#学习-程序集和反射
- React-Native Fetch使用Promise封装(一)
- 问卷与量表数据分析(SPSS+AMOS)学习笔记(五) : 问卷星数据处理
- mysql 类似oracle dual_MySQL类似Oracle的dual虚拟表
- 关于小熊派Cat1资料收集
- Nyko推出平板手柄 为运行在Tegra3上的游戏特别打造
- 首款双频GNSS智能手机进入市场
- Resource of computer vision, pattern recognition, machine learning etc.
- 台式计算机usb接口无反应6,如何解决电脑的USB接口没反应,教您如何解决
- word文件中表格迁移到excel
- 案件精灵9判断坐标颜色变化发出提示音(按键精灵9接收通知必备)
- rtf格式的一些说明,转载的,我找到的rtf资料中比较实用的一片文章了
- C语言试卷分析表程序,试卷分析模板(试卷分析表格模板)
- 首届中国富豪,谁笑到了最后?
- 网页全终端视频直播/点播H5播放器EasyPlayer.js正式发布,支持H.265网页播放