`
阅读更多
      一、       问题:
1、一所大学,做一个学生信息管理系统,你觉得要怎么考虑?
2、中学生英文作文,你怎么判断有多少错误单词?
3、对于两段中文文字,如果让你判断它们的相似程度,你觉得应该怎么判断?

二、       回答:
1、一所大学,做一个学生信息管理系统,你觉得要怎么考虑?
答:对于一个学生信息管理系统,考虑的思路可以如下:
       第一步:确认该系统的用户。可以是管理员、老师、学生等相关人员。管理员拥有管理其他用户和系统数据的至高权限。老师拥有对自己权限范围内的系统数据进行管理的权限,比如本班学生的成绩的录入与修改等。学生拥有对系统数据的查询的权限。
       第二步:针对用户以及根据用户的权限级别制定需求分析。罗列出所有的功能需求,比如管理与查阅学生相关信息(入学/毕业年份、所在专业、个人成绩等)。
       第三步;根据需求确定数据结构。比如:学生可以用一个Student类,通过其数据成员和成员函数实现学生相关的记录、修改。然后选择一种容器来存放记录,并利用容器相关操作实现对象的处理。
       第四步:根据需求、用户权限以及所用数据结构确定相关操作的实现。
第五步:根据以上信息,确定用来实现的语言并进行实现。比如:C++、JAVA等。

2、中学生英文作文,你怎么判断有多少错误单词?
答:第一步:先建立一个保存有正确单词的字典库(如字典般有序保存,当然比一般字典多的是对每一个单词不同时态不同语态的单词也应保存)。
       第二步:可以利用string类的容器保存单词。
       第三步:从保存作文的文件头开始逐步依次读取单词。每读取一个单词,则从每个单词的第一个字母开始根据字母的顺序逐步地与字典库里的单词进行比较,如果能找到,则该单词正确。跳至判断下一个单词。如果找不到,则单词错误,计数,并跳至判断下一个单词。如此类推。直至到达文件结尾。返回错误单词的总数。

3、对于两段中文文字,如果让你判断它们的相似程度,你觉得应该怎么判断?
答:第一步:分析何为相似程度。两个字符串的相似程度可以定义如下:两个串中相同的子串出现的次序与频率都差不多时,则称两个字符串的相似程度高,否则相似程度低。如果两个字符串是两句话,还可以比较两句话表达的意思的相近程度。
       第二步:在了解“相似程度”的定义后,开始思考如何判断两个串的相似程度。其实涉及的操作包括两个串的遍历、取子串、模式匹配等。
利用分词技术将字符串分成若干个单词,每个独立的单词作为二元变量的一个属性。我们把所有单词设定为一个二元变量属性集合R,字符串1和字符串2的单词包含于这个集合R。设q是字符串1和字符串2中都存在的单词的总数,s是字符串1中存在,字符串2中不存在的单词总数,r是字符串2中存在,字符串1中不存在的单词总数,t是字符串1和字符串2中都不存在的单词总数。我们称 q,r,s,t为字符串比较中的4个状态分量。
因考虑到一个字符串中可能在不同位置出现相同的单词,则将在不同位置出现的相同单词假设为不同单词,以其在字符串中出现的次序作为区分。
在实际应用中,q,r,s三种状态分量并不一定是同等价值的,它们往往根据实际应用的需要存在不同的权重,比如对于某些应用来说,两个字符串中相同单词数量比不同单词数量更能说明字符串的相似程度,那么我们必须将q的权重提高。设对应q,r,s三个变量的权重分别是Kq, Kr, Ks。则相似程序的公式可以表示如下:
相似度=Kq*q/(Kq*q+Kr*r+Ks*s) (Kq > 0 , Kr>=0,Ka>=0)
如果还要考虑两个中文字符串的语意相似程序,则首先我们需要构建一个同义词对照表,将同义词对应到一个等价单词,在对字符串分词后对字符串中的所有单词到同义词表中查找,如果存在,则替换为对应的等价单词,这样分词后,两个字符串中的同义词就指向了相同的单词,然后在通过前述步骤进行判断相似程序。
       第三步:在第二步完成后,思考如何实现这些操作。按目前的操作可以利用以KMP算法基础的改进算法。
       第四步:选择一门语言,实现之。
参考网址:
a. http://blog.csdn.net/SmartTony/archive/2009/02/20/3915601.aspx
b. http://www.vipcn.com/chengxukaifa/CC/323938.html

三、分析与小结:
Programs = Data Structures + Algorithms. 这样的说法很精辟,越过表层直接说到了程序的实质。不仅如此,这样几个简单的单词却也让我们认识到如何思考问题,如何进行程序设计,更重要的是让我们明白我们应该学习什么!
此次的三个问题,第一个问题相对比较熟悉,大家都比较有想法,经过讨论后形成了比较传统的一个答案。只是看了老师的文章后,在描述上有了改动。在具体实现上的描述相对减少,甚至一句话概括。更多的是描述了我们的思路。第二、第三个问题相对陌生,对于这两个问题,我们团队认为有共同点,那就是都是对串的处理。只是处理的对象和结果不一样。尤其是第三题,因为之前基本没有接触过,所以在自己思考无果后在网上搜索了一些资料进行了学习与整理,形成这样的一个答案。
对于这三个问题,实现起来也许还要花很大的功夫,但是就目前我们通过学习讨论,也已经收获了不少,在思想上得到了启发,在观念上得到了改变,在理论上得到了指导……
我们将继续努力!





简评

非常感谢这个小组的及时回答,答案也基本上超出了我的预期。
对于这样一组问题的回答,我更期待大家思考问题的过程的展现,而不是已有知识的套路。我们简单举例来讲,比如第一个问题,学过数据库的同学,可能看到这个问题习惯上会想,我需要建立什么样的数据表、我需要什么样的用户操作、我需要用c#做一个什么样的界面、如何用sql server进行实现数据库 —— 但其实我不期待这样一个过程。这个小组的同学的分析过程是基本符合我的设想的,对于一个给定的问题,其思考过程应该是从问题的抽象入手,然后试图分解它的业务逻辑和数据描述,最后再考虑你所熟悉的技术和工具的层面上。这也就是说,为什么程序可以定义为算法+数据结构,可以和具体的平台与语言无关。
另外就是,对于我们学习程序设计的同学,多从问题出发,从世界最原始的那个点开始,有助于大家知其所以然。比如仍然是第一个应用层面的问题,当你确认了系统的用户,及每一个用户的操作逻辑定义后,你接下来会有两个问题,第一个,你如何规范化的描述你知道的内容——你可以用文字进行描述,可以使用word做一些简单的图;但如果你团队早就达成一致,你可以使用有规范定义的用例图进行描述;第二个,业务逻辑如何分解成程序的流程,这个过程中的数据使用什么样的结构进行描述——1万个同学的信息你是准备用一个Student的线性表来存储?对于每个学期都会产生的各科成绩你用超大表的方式存储进去?你如何实现你的检索过程与删除过程?等等,有了这些问题,你会考虑将数据进行抽象并分类,你会考虑不同的存储结构,你会为某些业务逻辑考虑优化增加索引,你也会考虑一个用户在修改信息而另外一个用户在查询时,你需要怎么做?你心中有了这些问题,并尝试去思考答案——这就是最好的学习。接下来是水到渠成的,或许你有自己的答案,或许你没有找到答案,但当你阅读了数据库原理方面的内容,你会恍然大悟。
缺乏这样一个过程,纯粹的当做一个教学过程去学习数据库设计、学习数据结构,我个人觉得对于计算机同学而言,不是一个高效的办法。已成熟的理论或技术都是从问题而来;同样的,在这个行业里面还有大量的问题没有有效的解决办法。同学们,不要低视自己。

第二个例子更像一个小规模的数据结构或算法题目。回答这个问题的重点,你们可以放到如何组织词典的关键点上来。你的词典结构,基本上可以确认你的查询效率。——这方面可以更具体一些,更花心思一些。
第三个例子,则完全是一个研究层面的问题了。这也就是上面所说的,“没有有效解决办法”的问题。这个小组的考虑问题的过程非常好,尤其是开始,我们先来定义“什么是相似程度”,换句话,有两层意思,其一是你觉得你要解决的问题是什么,其二,你觉得项目在结束时你怎么验证你是否解决了你的问题。需求和验收标准是相辅相成的。其实这个小组给出了两个答案:
(1)              两个字符串的相似程度可以定义如下:两个串中相同的子串出现的次序与频率都差不多时,则称两个字符串的相似程度高,否则相似程度低。
(2)              如果两个字符串是两句话,还可以比较两句话表达的意思的相近程度。
我不知道这个小组的成员在讨论时,有没有注意到,这两个答案的差异性是非常大的——尤其是第二点,有没有就这个方向上有过什么讨论。

这个问题毕竟比较困难一些,对于非专业方向做研究的同学而言,场景也陌生一些。没有关系。其实大家在讨论什么是相似程度的时候,我觉得应该是没有明确讨论项目的验收标准的——如果有讨论这个验收标准,我相信就这个第二点,后面会有些讨论的材料或相应的考虑。

我的问题是“中文文本的相似程度”,虽然没有明说,但我的导向是其内容的相关性。相信大家就这个是有体会的。但内容的相关性和文本字符串的相似性,这是一个很值得玩味的东西。大家参考的方案是一个非常简单的方案,而且,有一点点建议,描述一个问题的解决思路时,一定要清晰易懂。我不知道大家是否真的吸收了文章中给出的思路,但就这个描述而言,“每个独立的单词作为二元变量的一个属性”这句话大家能够明白吗?

就文本相关性而言,期待后面有简单的项目可以让大家接触一下。我会看课程的情况进行安排。
总的来看,感觉大家做这几个题目还是非常用心的。投入,就会有收获。期待大家学习这门课程的起始,就开始养成这样一个思考问题的习惯。仍然回到课堂上来,从纯技术的角度去考虑,程序设计就是这样的一个定义;这是解决问题的一种相对普适的思路。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics