2005“百度之星”程序设计大赛网上决赛试题 - 专注于搜索引擎技术(Lucene,Nutch)

来源:百度文库 编辑:神马文学网 时间:2024/04/29 03:29:25
2005“百度之星”程序设计大赛网上决赛试题 第一题(共两题100分)站点统计(50分)
 
   题目描述:
一个Internet站点集合,可以用如下的方式来描述站点和站点之间的链接引用关系:
    s 1 2 3 4
    1 / 4 0 3
    2 3 / 4 5
    3 2 2 / 2
    4 6 1 4 /
其中与s(site)同行和同列的数字都表示站点号,其他每个数字表示一个站点到另一个站点的超文本链接数。如果站点A有到另一个站点B的直接链接或间接(指通过一个或多个直接链接)链接,则称站点A有到站点B的访问关系,或称站点B可以被站点A访问到。例如,上面描述了一个有4个站点链接关系的站点集合,第一行 / 4 0 3 表示站点1到站点1,2,3,4的超文本链接数。
请编写程序:
1) 将一个有N个站点的集合划分成满足下面所有条件的站点子集(这些子集的union组成了该N个站点集合):
    a) 当任一子集中的站点数大于1时,该子集内至少存在一个站点有到该子集内所有其他站点的访问关系;
    b) 当任一子集中的站点数大于1时,该子集内的任一站点至少可以被该子集内的某一站点访问到;
    c) 两个不同子集中的任意两个站点之间不存在任何访问关系。
2) 裁减这些子集内的站点之间现有的链接关系,使得被裁减后的各子集内的站点依然可以满足上述所有条件,同时使得子集内的站点之间的链接总数相加之和为最小。
假如上面的站点集合是这N个站点集合中的一个子集,它满足了条件a):4可以访问到3,也可以访问到2和1;也满足了条件b):站点4可以被站点3访问到,等等。对该站点集合进行裁减使其仍然满足条件a和b,并使得其链接总数之和为最小的结果为:
    s 1 2 3 4
    1 / 0 0 0
    2 0 / 0 0
    3 2 0 / 2
    4 0 1 4 /
这里,站点4可以访问到站点3和2,站点4也可以访问到站点1(通过站点3间接访问);此外,站点3可以访问到站点4;最小链接总数相加为2+2+1+4=9。
   输入数据:
程序读入已被命名为sites.txt的完全如上所示的N*N矩阵的输入数据文本文件,N不大于10万(N即为行数和列数),输入文件的每一行的列和列之间用一个\t分隔,行和行之间用\n分隔。
   输出数据:
按行输出满足题目要求的每个子集内的站点数以及裁减后的最小链接总数之和,数和数之间都以一个空格分隔。如上述子集和最小链接总数为:
1 2 3 4 9
如果输入数据无满足题目要求的子集存在,则输出NONE。
   评分标准:
在结果正确的前提下,会考虑程序的运行时间。我们会用两个不同的输入数据文件(一个简单一个复杂)进行测试,简单的输入数据产生的程序输出结果如果正确,获该题满分的30%即15分(不处理运行时间,除非因程序错误引起的超时运行);复杂的输入数据产生的程序输出结果如果正确,获50%即25分,运行时间满分为20%即10分,按各自程序的运行时间在所有参赛选手的程序的运行时间中所占位置获得相应比例。请仔细阅读并遵守"输入数据"和"输出数据"中的格式要求,如不符合要求,我们的自动评分程序可能会判定程序不正确。
第二题(共两题100分)决策系统(50分)
 
   题目描述:
一个智能决策系统可以由规则库和事实库两部分组成,假定规则库的形式为:
    Ri C1 & C2 & … & Cn->A
表示在条件C1,C2,… 和Cn都满足的前提下,结论A成立(即采取行动A);Ri表示这是规则库中的第i条规则。事实库则由若干为真的条件(即命题)所组成。
对一个新的待验证的命题Q,可使用数据驱动或目标驱动两种推理方式之一,来确认它是否可由某规则库和事实库推出:
1) 数据驱动的推理是指从事实库开始,每次试图发现规则库中某条能满足所有条件的规则,并将其结论作为新的事实加入事实库,然后重复此过程,直至发现Q是一个事实或没有任何新的事实可被发现;
2) 目标驱动的推理是指从目标假设Q出发,每次试图发现规则库中某条含该假设的规则,然后将该规则的前提作为子目标,确认这些子目标是否和事实库中的事实相匹配,如果没有全部匹配,则重复此过程,直至发现新的子目标都为真或不能再验证子目标是否为真。
例如,一个规则库为:
    R1 X & B & E -> Y
    R2 Y & D -> Z
    R3 A->X
事实库为:
    A
    B
    C
    D
    E
如果想知道命题Z是否为真,数据驱动的推理是从A B C D E开始,依次匹配规则R3(得到新事实X),R1(得到新事实Y)和R2,得到Z为真的事实;目标驱动的推理是从假设目标Z开始,依次匹配规则R2(得到新的子目标Y),R1(得到新的子目标X)和R3,得到假设Z为真的结论。
请编写程序正确、高效的实现这两种推理方式。
   输入数据:
程序需要两个命令行参数:
1) <推理方式>:data|goal,分别表示程序应采用数据驱动的推理或目标驱动的推理;
2) <命题>:如Z。
此外,程序还需读入已被命名为rules.txt的规则库和已被命名为facts.txt的事实库。规则库中的规则可能在千量级,按R1,R2,R3…依次按行排列的,每行一条规则,每条规则都以Ri C1 & C2 & … & Cn->A的形式表示,Ri和C1之间有1个或多个空格,Ci和&之间,Cn和->之间,以及->和A之间可以有0或多个空格。事实库中的各事实之间用1个\n隔开,每行一个事实。
   输出数据:
如果Z能被推理为真,则输出:
TRUE <推理方式:data或goal> <用空格隔开的规则序列:以在所输入的推理方式下,推出该命题为真的规则被激活的顺序排列>
例如:TRUE goal R2 R1 R3
如果Z不能被推理为真,输出:
UNCERTAIN
   评分标准:
在结果正确的前提下,会考虑程序的运行时间。我们会用两组不同的输入数据文件(一个简单一个复杂)进行测试,简单的输入数据产生的程序输出结果如果正确,获该题满分的20%即10分(不处理运行时间,除非因程序错误引起的超时运行);复杂的输入数据产生的程序输出结果如果正确,获40%即20分,运行时间满分为40%即20分,按各自程序的运行时间在所有参赛选手的程序的运行时间中所占位置获得相应比例。两种推理方式各占一半的分数。请仔细阅读并遵守"输入数据"和"输出数据"中的格式要求,如不符合要求,我们的自动评分程序可能会判定程序不正确。