判断无损分解的例子

这个就考前看了一本课外的辅导教材,现学了一下方法,不知道能不能回忆起来。

题目:U=(A,B,C,D,E)    F={A->D,E->D,D->B,BC->D,DC->A}

判断ρ={AB,AE,CE,BCD,AC}是否为无损连接分解。

解:

先求出候选键为CE。

然后画一个初始判定表如下图所示。

 ABCDE
ABa1a2b13b14b15
AEa1b22b23b24a5
CEb31b32a3b34a5
BCDb41a2a3a4b45
ACa1b52a3b54b55

解释一下这张初始判定表的含义:

直接看ρ,比如第一个是AB,那么就在A列写a1,在B列写a2,其余都写b1j。

然后开始计算。这时候要看F中的函数依赖。

比如,第一个是A->D,看A列有没有ai,看到有a1,再看D列中对应的,如果不相同,也有aj的话,就把其他换成aj,如果没有,就以第一个ai对应的bij为基准,其他都换成bij。

所以判定表应换成:

 ABCDE
ABa1a2b13b14b15
AEa1b22b23b14a5
CEb31b32a3b34a5
BCDb41a2a3a4b45
ACa1b52a3b14b55

接下来看E->D:

以前面修改后的表为基准。

 ABCDE
ABa1a2b13b14b15
AEa1b22b23b14a5
CEb31b32a3b14a5
BCDb41a2a3a4b45
ACa1b52a3b14b55

D->B:

这里看D列,因为b14对应B列有a2,所以就不以D列中a4为基准,而是以b14为基准,改B列对应位置为a2。

 ABCDE
ABa1a2b13b14b15
AEa1a2b23b14a5
CEb31a2a3b14a5
BCDb41a2a3a4b45
ACa1a2a3b14b55

BC->D:

当左边出现两个元素时,看B列和C列相同的行,发现是a2、a3,然后修改D列对应位置为a4。

 ABCDE
ABa1a2b13b14b15
AEa1a2b23b14a5
CEb31a2a3a4a5
BCDb41a2a3a4b45
ACa1a2a3a4b55

DC->A:

D列和C列有相同的行,是a3、a4,然后修改A列对应位置为a1。

 ABCDE
ABa1a2b13b14b15
AEa1a2b23b14a5
CEa1a2a3a4a5
BCDa1a2a3a4b45
ACa1a2a3a4b55

最终表:

 ABCDE
ABa1a2b13b14b15
AEa1a2b23b14a5
CEa1a2a3a4a5
BCDa1a2a3a4b45
ACa1a2a3a4b55

再看表中全部为a的行,发现是第三行,所以ρ为无损连接分解。

教材上的例题图片:



  • 32
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是一个简单的用C语言实现无损分解判断的代码示例: ```c #include <stdio.h> int main() { FILE *file; char filename[100]; int wavSize, dataSize, fmtSize, readSize; short channels, bitDepth; char chunkID[4], format[4], subchunk1ID[4], subchunk2ID[4]; // 获取文件名 printf("请输入WAV文件名:"); scanf("%s", filename); // 打开文件 file = fopen(filename, "rb"); if (file == NULL) { printf("文件打开失败\n"); return 1; } // 分析文件头 fread(chunkID, 1, 4, file); fread(&wavSize, 4, 1, file); fread(format, 1, 4, file); fread(subchunk1ID, 1, 4, file); fread(&fmtSize, 4, 1, file); fread(&channels, 2, 1, file); fread(&sampleRate, 4, 1, file); fread(&byteRate, 4, 1, file); fread(&blockAlign, 2, 1, file); fread(&bitDepth, 2, 1, file); fread(subchunk2ID, 1, 4, file); fread(&dataSize, 4, 1, file); // 检查是否为WAV文件 if (strncmp(chunkID, "RIFF", 4) != 0 || strncmp(format, "WAVE", 4) != 0) { printf("不是WAV文件\n"); fclose(file); return 1; } // 检查是否为无损分解的WAV文件 if (strncmp(subchunk1ID, "fmt ", 4) != 0 || fmtSize != 16 || (bitDepth != 8 && bitDepth != 16 && bitDepth != 24 && bitDepth != 32)) { printf("不是无损分解的WAV文件\n"); fclose(file); return 1; } // 关闭文件 fclose(file); printf("是无损分解的WAV文件\n"); return 0; } ``` 这段代码会要求用户输入一个WAV文件名,然后分析文件头,检查文件是否为WAV文件和是否为无损分解的WAV文件。如果是无损分解的WAV文件,程序会输出“是无损分解的WAV文件”,否则会输出“不是无损分解的WAV文件”。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值