130242014023+李甘露美+第3次实验

一、实验目的

1.理解不同体系结构风格的具体内涵。

2.学习体系结构风格的具体实践。

二、实验环境

硬件: 联想笔记本电脑

软件:Java或任何一种自己熟悉的语言

三、实验内容

“上下文关键字”KWIC(Key Word in Context,文本中的关键字)检索系统接受有序的行集合:每一行是单词的有序集合;每一个单词又是字母的有序集合。通过重复地删除航中第一个单词,并把它插入行尾,每一行可以被“循环地移动”。KWIC检索系统以字母表的顺序输出一个所有行循环移动的列表。

四、实验步骤:

尝试用不同的策略实现这个系统。选择2-3种体系结构风格来实现。

   在这里,我选择的是管道-过滤器风格和主程序-子程序风格。

 

一、管道/过滤器的风格

1、体系结构图:

其中实现表示管道,虚线表示系统输入/输出。

2、简述体系结构各部件的主要功能,实现思想。

这种风格的构件是过滤器,连接件是管道,各个过滤器之间通过管道进行连接。这种情况有4种过滤器:输入、移动、按字母排序、输出。每一个过滤器处理数据,并把它发送到下一个过滤器。控制是分布式的,只要有数据通过,过滤器就会处理。过滤器间的数据共享严格地局限于管道中传输的数据。

3.列出主要代码

 1 //循环移动
 2 /**
 3  * 第一行数据到来后开始运作
 4  * 把原始数据行循环移位,将原始行和新的移位后的行输出给下一模块
 5  * @author 12know
 6  * @version 1.0 2009年1月14日
 7  */
 8 public class CircularShift extends Filter {
 9
10     private static final String ignore = "a#$an#$and#$as#$is#$the#$of#$"; //一些噪音词汇
11
12     public CircularShift(Pipe input, Pipe output) {
13         super(input, output);
14     }
15
16     /**
17      *
18      */
19     @Override
20     protected void transform() {
21         try {
22             CharArrayWriter writer= new CharArrayWriter(); //缓冲当前行
23             int c = -1;
24             while((c = input.read()) != -1) {
25                 if(c == 10) { //回车,表示writer中取得了一行数据
26                     String curLine = writer.toString();//存储从输入管道中取得的当前行
27                     String[] words = curLine.split(" +|\t+"); //将当前行分解成多个单词
28                     for(int i = 0; i < words.length; i++) {
29                         if(ignore.indexOf((words[i] + "#$").toLowerCase()) != -1)//去掉噪音词汇打头的行
30                             continue;
31                         String shift = "";
32                         for(int j = i; j < (words.length + i); j++) {
33                             shift += words[j % words.length];
34                             if (j < (words.length + i - 1))
35                                 shift += " ";
36                         }
37                         shift += "\r\n";
38                         output.write(shift);
39                         writer.reset();
40                     }
41                 } else
42                     writer.write(c);
43             }
44             input.closeReader();
45             output.closeWriter();
46
47         } catch (IOException e) {
48             e.printStackTrace();
49         }
50     }
51
52 }
 1 //按照字母表排序
 2 public class Alphabetizer extends Filter {
 3
 4     public Alphabetizer(Pipe input, Pipe output) {
 5         super(input, output);
 6     }
 7
 8     /**
 9      *
10      */
11     @Override
12     protected void transform() {
13         List<String> lines = new ArrayList<String>();
14         CharArrayWriter writer = new CharArrayWriter();
15         try {
16             int c = -1;
17             while((c = input.read()) != -1) {
18                 writer.write(c);
19         //        System.out.print((char) c);
20                 if(c == 10) {
21                     String curLine = writer.toString();
22                     lines.add(curLine);
23                     writer.reset();
24                 }
25             }
26
27
28             sort(lines);
29
30             for(String s : lines) {
31                 output.write(s);
32             }
33
34             input.closeReader();
35             output.closeWriter();
36         } catch (IOException e) {
37             e.printStackTrace();
38         }
39     }
40
41     private void sort(List<String> lines) { //堆排序
42         int size = lines.size();
43
44         for (int i = (size / 2 - 1); i >= 0; i--)
45             siftDown(lines, i, size);
46
47         for (int i = (size - 1); i >= 1; i--) {
48             Object tmp = lines.get(0);
49             lines.set(0, lines.get(i));
50             lines.set(i, (String) tmp);
51             siftDown(lines, 0, i);
52         }
53     }
54
55     private void siftDown(List<String> lines, int root, int bottom) {
56         int max_child = root * 2 + 1;
57
58         while (max_child < bottom) {
59             if ((max_child + 1) < bottom)
60                 if (((String) lines.get(max_child + 1))
61                         .compareTo((String) lines.get(max_child)) > 0)
62                     max_child++;
63
64             if (((String) lines.get(root)).compareTo((String) lines
65                     .get(max_child)) < 0) {
66                 Object tmp = lines.get(root);
67                 lines.set(root, lines.get(max_child));
68                 lines.set(max_child, (String) tmp);
69                 root = max_child;
70                 max_child = root * 2 + 1;
71             } else
72                 break;
73         }
74     }
75
76 }

4. 显示结果

(这是input.txt的内容,作为输入)

这是输出结果,(每一行一共是三组字母,共三种可能的排列情况)可以发现很明显是先看到输入数据,输出数据出来的比较慢。

二、主程序/子程序风格

1、体系结构图

2.简述体系结构各部件的主要功能,实现思想。

上述的主程序/子程序的方法,将问题分解为输入(Input)、移动(Shifter)、按字母表排序(Alphabetizer)、输出(Output)这几个步骤,每一个步骤由一个对应的子程序来完成,由主程序来调度各个子程序,多个子程序共同完成计算。

在这种体系结构中,构件就是各种子程序,连接件就是子程序直接的协同关系和主程序对它们的调用。

Input: 将读取到的每行的数据保存到实现LineStorage接口的数据结构中去

shifter:主函数调用该方法,该方法对characters中的每行的数据进行循环移位,并将移位得到的新行保存到实现LineStorage的数据结构中去

alphabetizer: 对circularShift中得到的行数据进行按字母顺序排序

Output:output方法迭代调用alphabetizer里面的方法得到按字母顺序排好序的行数据,并输出

Characters:实现字符的处理。读取一行就用Characters抽象数据类型将该行存放,直到文件读完为止

3、写出主要的代码

 1 public static void alphabetizer(List<String []> characters, List<Pair> index, List<Pair> alphabetedIndex) {
 2         alphabetedIndex.addAll(index);
 3
 4         //下面是利用插入排序算法进行排序
 5         for(int i = 1; i < alphabetedIndex.size(); i++) {
 6             Pair temp = alphabetedIndex.get(i);
 7             int wordIndex1 = temp.getWordIndex();
 8             int lineIndex1 = temp.getLineIndex();
 9             String str1 = characters.get(lineIndex1)[wordIndex1];
10             int j;
11             for(j = i - 1; j >= 0; j--) {
12
13                 int wordIndex2 = alphabetedIndex.get(j).getWordIndex();
14                 int lineIndex2 = alphabetedIndex.get(j).getLineIndex();
15
16                 String str2 = characters.get(lineIndex2)[wordIndex2];
17                 if(str1.compareToIgnoreCase(str2) < 0) {
18                     alphabetedIndex.set(j + 1, alphabetedIndex.get(j));
19                 } else break;
20             }
21             alphabetedIndex.set(j + 1, temp);
22         }
23     }
24 //循环移位的代码
25 protected void transform() {
26         try {
27             CharArrayWriter writer= new CharArrayWriter(); //缓冲当前行
28             int c = -1;
29             while((c = input.read()) != -1) {
30                 if(c == 10) { //回车,表示writer中取得了一行数据
31                     String curLine = writer.toString();//存储从输入管道中取得的当前行
32                     String[] words = curLine.split(" +|\t+"); //将当前行分解成多个单词
33                     for(int i = 0; i < words.length; i++) {
34                         if(ignore.indexOf((words[i] + "#$").toLowerCase()) != -1)//去掉噪音词汇打头的行
35                             continue;
36                         String shift = "";
37                         for(int j = i; j < (words.length + i); j++) {
38                             shift += words[j % words.length];
39                             if (j < (words.length + i - 1))
40                                 shift += " ";
41                         }
42                         shift += "\r\n";
43                         output.write(shift);
44                         writer.reset();
45                     }
46                 } else
47                     writer.write(c);
48             }
49             input.closeReader();
50             output.closeWriter();
51
52         } catch (IOException e) {
53             e.printStackTrace();
54         }
55     }

4. 显示结果

(这是input.txt的内容,作为输入)

这是输出结果,(每一行一共是三组字母,共三种可能的排列情况)可以发现运行的时候输入的数据与输出的数据是几乎同时出现的,该风格性能较好。

五、实验总结

通过这次实验,认识到了KWIC这个经典的例子,可以让不同的体系机构风格从多种角度来实现它。由于每种风格的构件、连接件、思想都不相同,所以不同风格之间的结构、过程和性能也不同。

  管道/过滤器风格的构件是过滤器,连接件是管道,各个管道之间通过数据传输进行通信,结构很灵活,系统的耦合度较低,所以性能也弱。

主程序/子程序风格的构件是各个子程序,连接件是主程序对子程序的调用以及子程序之间的通信,靠多个子程序协同完成运算。整个系统可以说是紧密相连,耦合度很高,所以性能也很高。

时间: 2024-11-05 12:37:32

130242014023+李甘露美+第3次实验的相关文章

130242014023-李甘露美-实验一

实验报告一 课程 软件体系结构与设计   实验名称 软件设计的网络环境  第   页 专业 软件工程     班级  1班      学号  130242014023     姓名  李甘露美 实验日期:   2017 年  9 月  14 日   报告退发 (订正 . 重做) 一.实验目的 1.复习软件工程的重要概念,熟悉软件体系结构与软件设计技术的基础概念与内容. 2.通过Internet搜索与浏览,了解网络环境中主流的软件体系结构与设计技术网站,掌握通过专业网站不断丰富软件体系结构和软件设

【程序员眼中的统计学(7)】正态分布的运用:正态之美

正态分布的运用:正态之美 作者 白宁超 2015年10月15日18:30:07 摘要:程序员眼中的统计学系列是作者和团队共同学习笔记的整理.首先提到统计学,很多人认为是经济学或者数学的专利,与计算机并没有交集.诚然在传统学科中,其在以上学科发挥作用很大.然而随着科学技术的发展和机器智能的普及,统计学在机器智能中的作用越来越重要.本系列统计学的学习基于<深入浅出统计学>一书(偏向代码实现,需要读者有一定基础,可以参见后面PPT学习).正如(吴军)先生在<数学之美>一书中阐述的,基于统

拿到腾讯、美图算法工程师实习offer---找实习两个月回顾

首先介绍一下,本人是厦大的研究生,计算机视觉方向,是一个标准的中等生,实验室重算法轻开发,找实习的过程中所用到的知识或者说是技能60%都是通过平时跟导师交流沟通学习来的(甚至很多对深度学习,最新前沿技术的理解面试过程中都是老师原话,高度自然不一样),最应该感谢的是我的导师和其他实验室老师们. 有找实习这个想法是从年后开学开始的,虽然之前工作过一年(比亚迪软件工程师),但是以后想去的还是互联网公司,在这个 "互联网+" 的浪潮下,我们总应该去在自己兴趣范围的前提下做点什么,之前的工作环境

《三联生活周刊》2017年17期:3星。电子版阅读体验远超纸版。如果雄安的土地制度实验成功了,“北上广深”的房价也就被釜底抽薪了。

家附近的报刊亭都被拆了,被迫看电子版三联.发现阅读体验远超纸版.主要有以下两个方面的好处:1:看图片的体验,电子版好过纸版.当然前提是在电脑上或平板上看,kindle是黑白的,看图片效果比较查:2:可以做笔记,笔记可以永久保存:3:检索方便. 目前电子版的缺陷是滞后两期,导致时效性太差,只能当作纸版的长尾. 本期雄安的几篇文章比较有深度.总体评价3星. 以下是本期中一些重要的信息的摘抄: 1:研究人员调查分析了美国11个城市10年中举办马拉松赛事前后心脏病患者的死亡率后发现,那些在赛事举办时发生

一个疗程找回做女人的自信,享永恒女人味之美

美国科学家在最新一期<癌细胞>杂志上报告说,他们发现了癌细胞在放疗过程中自我保护的机理,据此对放疗方法进 行改进,可使放疗对癌症的治愈率大大提高. 美国杜克大学医学中心的研究人员在报告中说,放疗治愈率低的主要原因是癌细胞在放疗后会产生一种被称为“细胞因 子”的分子.这种分子促使新的血管生成,以取代在放疗中被破坏的血管,为癌细胞供应血液. 为探明该过程中细胞因子的生成,研究人员在实验中监测了接受放疗的老鼠体内一种名为低氧诱导因子-1的分子水平 ,该分子能促使细胞因子的生成.实验结果表明,放疗后,

转载-从信息论角度论证为什么汉语是世界上最先进的语言--引用多项实验数据

[转载]从信息论角度论证为什么汉语是世界上最先进的语言–引用多项实验数据 作者:汉语计算机应用研究小组(笔名:冷酷的哲学?) 一.语言水平高低的评判准则 口语,实际上是一种通讯协议.就是说,语言实际上是把人的思想通过发音器官变成一串频率不同.波形不同的声波,然后被另一个体的听觉器官和相关的脑部组织重新转变回思想.通讯协议,就是一个规则,一个规定了应该如何把思想/信息转变为易于传输的信号的规则 计算机上,通讯协议有两个基本评判标准:[传输效率]和[抗噪能力] 传输效率:在单位时间里,按照该通讯协议

不懂数学也能明白傅里叶分析和感受数学之美 转载

文章链接 : http://zhuanlan.zhihu.com/wille/19763358 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式.但不幸的是,傅里叶分析的公式看起来太复杂了,所以很多大一新生上来就懵圈并从此对它深恶痛绝.老实说,这么有意思的东西居然成了大学里的杀手课程,不得不归咎于编教材的人实在是太严肃了.(您把教材写得好玩一点会死吗?会死吗?)所以我一直想写一个有意思的文章来解释傅里叶分析,有可能的话高中生都能看懂的那种.所以,不管读到这里的您从事

Apple广告推广运营联盟iAd 转化率实验

苹果推出的 iAd for Developers 让开发者们有了除 AdMob 以外的又一个应用推广平台,但这个全新平台的推广效果如何,费用.转化率等情况都怎么样?CocoaChina 会员 “blackbox” 的这篇译作应该会让我们对 iAd for Developers 的推广效果有一个全新的.量化的认识,也应该会节省开发者们的大量推广费用. 简单结论 苹果平台的广告 iAd for Developers看起来似乎对下载量没有多大帮助. 从 8 月 19 号到 8 月 25 号,我在最新版

CSAPP 六个重要实验 lab4

CSAPP && lab4 实验材料: http://download.csdn.net/detail/u011368821/7926305 实验指导书: http://download.csdn.net/detail/u011368821/7926323 实验环境: Linux 3.13.11 Ubuntu 14.0 Part I: An Experiment in C and Java Q&A Answer these questions: 1.  What are the s