习题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!(磁盘数据)相关推荐

  1. 转:概述RAID磁盘的IOPS

    我们前面已经说过了,厂商所提供的IOPS值是在理想状态下测试出来的,对实际的运行性能的参考并不大,所以我们有必要通过以下几个方面来衡量该系统的实际IOPS的可能表现.决定IOPS的主要因素取决于阵列的 ...

  2. 美国主机中的RAID磁盘是什么意思?

    在试图为美国主机决定最佳存储配置时,您可能已经遇到了RAID的概念.RAID在美国主机配置中相当普遍,并为存储数据提供冗余.本文将探讨软件和硬件RAID的概念,并讨论这些技术如何工作. 什么是RAID ...

  3. 创建RAID磁盘列表(Raid5和Raid10)

    关于Raid磁盘阵列 [前言] 一.Raid磁盘阵列概述 RAID 中主要有三个关键概念和技术:镜像( Mirroring ).数据条带( Data Stripping )和数据校验( Data pa ...

  4. 关于RAID磁盘的介绍

    RAID(独立冗余磁盘阵列) 把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术 组成磁盘阵列的不同方式称为RAID级别 常用的RA ...

  5. raid 磁盘列阵的使用

    目录 一.raid 磁盘列阵的好处 二.raid6 磁盘列阵的创建 三.实验 一.raid 磁盘列阵的好处 1.提高存储的性能  r读的性能 w写的性能 2.数据的备份 raid0  1.读写性能提高 ...

  6. Linux学习第九课、磁盘容量配额、RAID磁盘冗余阵列

    磁盘容量配额 Linux系统的设计初衷就是让许多人一起使用并执行各自的任务,从而成为多用户.多任务的操作系统.但是,硬件资源是固定且有限的,如果某些用户不断地在Linux系统上创建文件或者存放电影,硬 ...

  7. C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用

    快速读写磁盘数据的方法: 1.块读取:一下子将数据读取到内存的(无论是文本还是二进制),而不是一行行的读取. 2.异步的IO,创建多线程,或者使用重叠IO,IO复用,异步的事件回调通知机制(可以用事件 ...

  8. quartus管脚分配后需要保存吗_电脑磁盘显示未分配怎么办?磁盘数据如何恢复?...

    磁盘未分配的这部分磁盘空间上没有任何分区,也就是说这部分空间无法用来保存数据.那么,什么原因会导致磁盘变成未分配呢? 1.删除分区:在平时使用电脑的时候会有意或无意的将分区删除掉.磁盘上的分区被删除之 ...

  9. 使用驱动器h中的光盘之前需要将其格式化怎么办_电脑磁盘显示未分配怎么办?磁盘数据如何恢复?...

    磁盘未分配的这部分磁盘空间上没有任何分区,也就是说这部分空间无法用来保存数据.那么,什么原因会导致磁盘变成未分配呢? 1.删除分区:在平时使用电脑的时候会有意或无意的将分区删除掉.磁盘上的分区被删除之 ...

  10. 计算机管理 未分配磁盘,电脑磁盘显示未分配怎么办?磁盘数据如何恢复?

    Hugh 于 2020/07/31更新 数据恢复 摘要 想要恢复未分配磁盘数据,需要用到第三方数据恢复软件,下面小编就为大家详细介绍一下磁盘数据恢复软件 - 易我数据恢复的详细使用流程: 磁盘未分配的 ...

最新文章

  1. 支付产品必懂的会计基础及如何应用
  2. 老板:kill -9 的原理都不知道就敢去线上执行?明天不用来了
  3. number of databases available at XJTLU
  4. javascript 实现快排 ,三向切分快排
  5. set 数据类型的应用场景
  6. C#学习-程序集和反射
  7. React-Native Fetch使用Promise封装(一)
  8. 问卷与量表数据分析(SPSS+AMOS)学习笔记(五) : 问卷星数据处理
  9. mysql 类似oracle dual_MySQL类似Oracle的dual虚拟表
  10. 关于小熊派Cat1资料收集
  11. Nyko推出平板手柄 为运行在Tegra3上的游戏特别打造
  12. 首款双频GNSS智能手机进入市场
  13. Resource of computer vision, pattern recognition, machine learning etc.
  14. 台式计算机usb接口无反应6,如何解决电脑的USB接口没反应,教您如何解决
  15. word文件中表格迁移到excel
  16. 案件精灵9判断坐标颜色变化发出提示音(按键精灵9接收通知必备)
  17. rtf格式的一些说明,转载的,我找到的rtf资料中比较实用的一片文章了
  18. C语言试卷分析表程序,试卷分析模板(试卷分析表格模板)
  19. 首届中国富豪,谁笑到了最后?
  20. 网页全终端视频直播/点播H5播放器EasyPlayer.js正式发布,支持H.265网页播放

热门文章

  1. 爬虫学习---基础操作--抽屉新热榜自动点赞与豆瓣自动统一短评
  2. 听听那冷雨 余光中
  3. 使用 brew 安装mongodb
  4. unity学习笔记(二)—— 制作第一个小游戏
  5. 网站安全防护措施有哪些
  6. 阻止事件冒泡和浏览器默认事件
  7. 台式电脑 航嘉机箱 前面板耳机只有一边(左边)有声音 问题解决
  8. 020:Django电商网站逻辑导图
  9. 今天是第几天python_“昔我往矣,杨柳依依。今我来思,雨雪霏霏”全诗赏析
  10. DNS的集群与更新(远程更新,加密更新)