元素唯一性-算法优化

我们给出一个有n个元素的序列array,求该集合中的所有元素受否有相同。

public static boolean checkElement_v1(int[] array){
        for (int i = 0; i < array.length; i++) {
            for (int j = i+1; j < array.length; j++) {
                if (array[i] == array[j]){
                    return true;
                }
            }
        }
        return false;
    }

该算法使用两层循环,外层循环的第一次迭代致使内层循环的n-1次迭代,外层循环的第二次,致使内层循环的n-2次迭代,以此类推,在最坏的情况下该算法的运行时间按比例增长到:(n-1)+(n-2)+…+2+1,得出最后的运行时间为O(n²);
解决元素唯一性的问题的更优的一个算法是以排序作为解决问题的工具。我们可以先对序列进行排序,相同的元素肯定会排在一起,然后对任意相邻的两个元素进行比较。

public static boolean checkElement_v2(int[] array) {
        //先对数组进行排序
        Arrays.sort(array);  //O(nlogn)
        for (int i = 1; i < array.length; i++) {  //从1到n-1有n-1,再+1
            if (array[i-1] == array[i]){ //还是n
                 return true;
            }
        }
        return false;
    }

Arrays.sort(arr);如果没看错的话,sort()是使用快速排序实现的,时间复杂度在正常情况下的为O(nlogn),一旦对序列排序过后,进入for以后的运行时间为O(n),根据比较函数间的增长率,因此算法的总运行时间为O(nlogn)。当n作为一个很大的值时比起O(n²),还是有些优化的。

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
习 题 答 案 习题一答案 一、选择题 1. 软件的主要特性是(A B C)。 A) 无形 B) 高成本 C) 包括程序和文档   D) 可独立构成计算机系统 2. 软件工程三要素是(C D)。 A) 技术、方法和工具  B) 方法、工具和过程  C) 方法、对象和类  D) 过程、模型、方法 3. 包含风险分析的软件工程模型是(A)。 A) 螺旋模型 B) 瀑布模型 C) 增量模型 D) 喷泉模型 4. 软件工程的主要目标是(C)。 A) 软件需求  B) 软件设计  C) 风险分析  D) 软件实 现 5. 下列属于面向对象开发方法的是(A B C D)。 A) Booch   B) UML   C) Coad   D) OMT 6. 软件危机的主要表现是(B D)。 A) 软件成本太高 B) 软件产品的质量低劣 C) 软件开发人员明显不足 D) 软件生产率低下 7. 软件开发方法的主要工作模型有(A B C) A) 螺旋模型 B) 循环模型 C) 瀑布模型 D) 专家模型 8. 软件工程的目标有(A B C)。 A) 易于维护 B) 低的开发成本 C) 高性能 D) 短的开发期 9. 软件工程学的目的和意义是( )。 A) 应用科学的方法和工程化的规范管理来指导软件开发 B) 克服软件危机 C) 作好软件开发的培训工作 D) 以较低的成本开发出高质量的软件 二、 判断题 1. 软件就是程序,编写软件就是编写程序。(×) 2. 瀑布模型的最大优点是将软件开发的各个阶段划分得十分清晰。(×) 3. 结构化方法的工作模型是使用螺旋模型进行开发。(×) 4. 结构化方法和JSP方法都不适合于大型软件的开发。(√) 5. 原型化开发方法包括生成原型和实现原型两个步骤。(×) 6. 面向对象的开发方法包括面向对象的分析、面向对象的设计和面向对象的程序设计。( √) 7. 软件危机的主要表现是软件的需求量迅速增加,软件价格上升。(×) 8. 软件工具的作用是为了延长软件产品的寿命。(×) 9. 软件工程过程应该以软件设计为中心,关键是编写程序。(×) 10. RCP法与RSP法的主要区别是前者采用循环渐进的开发方式,原型将成为最终的产品,而后者将被废弃。(√) 三、简答题 1. 软件产品的特性是什么? 答: ● 软件是一种逻辑产品,具有无形性;  ● 软件产品的生产主要是研制;  ● 软件不存在磨损和老化问题,但存在退化问题;  ● 软件产品的生产主要是脑力劳动;  ● 软件产品的成本非常昂贵,其开发方式目前尚未完全摆脱手工生产方式; ● 软件具有“复杂性”,其开发和运行常受到计算机系统的限制。 2. 软件发展有几个阶段?各有何特征? 答: ① 程序设计阶段。    硬件特征:价格贵、存储容量小、运行可靠性差。    软件特征:只有程序、程序设计概念,不重视程序设计方法。   ② 程序系统阶段。    硬件特征:速度、容量及工作可靠性有明显提高,价格降低,销售有爆炸性增长 。    软件特征:程序员数量猛增,开发人员素质低。   ③ 软件工程阶段。    硬件特征:向超高速、大容量、微型化及网络化方向发展。    软件特征:开发技术有很大进步,但未获得突破性进展,软件价格不断上升,未完全摆脱软件危机。 3. 什么是软件危机?其产生的原因是什么? 答:“软件危机”(Software Crisis)的出现是由于软件的规模越来越大,复杂度不断增 加,软件需求量增大。而软件开发过程是一种高密集度的脑力劳动,软件开发的模式及技术 不能适应软件发展的需要。致使大量质量低劣的软件涌向市场,有的花费大量人力、财力, 而在开发过程中就夭折。软件危机主要表现在两个方面: (1) 软件产品质量低劣,甚至开发过程就夭折。 (2) 软件生产率低,不能满足需要。 4. 什么是软件生存周期模型?它有哪些主要模型? 答:软件生存周期模型是描述软件开发过程中各种活动如何执行的模型。 主要模型包括:瀑布模型、增量模型、螺旋模型、喷泉模型、变换模型和基于知识的模型。 5. 有哪些主要的软件开发方法? 答:主要的软件开发方法有:结构化开发方法、Jackson(JSP、JSD)方法、原型化开发方 法、维也纳开发方法(VDM)和面向对象的开发方法。 6. 软件生命期各阶段的任务是什么? 答:软件生命期瀑布模型分为六个阶段: ● 可行性研究与计划(确定系统的目标和规模,分析项目的可行性); ● 需求分析与规格说明(明确系统的规格和要求); ● 设计(包括概要设计和详细设计,将系统分解为模块); ● 编程(用程序语言实现每个模块,简单容易); ● 测试(发现并改正错误,分为模块测试、集成测试和系统联调三级); ● 运行维护(扩充功能、纠错等)。 习题二答案 一、 选择题 1. 需求分析的主要目的是(B C)。 A) 系统开发的具体方案 B) 进一步确定用户的需求 C) 解决系统是“做什么的问题” D) 解决系统是“如何做的问题” 2. 需求分析的主要方法有(C D)。 A) 形式化分析方法 B) PAD图描述 C) 结构化分析(SA)方法 D) OOA法 3. 面向对象的分析方法主要是建立三类模型,即(D)。 A) 系统模型、ER模型、应用模型 B) 对象模型、动态模型、应用模型 C) E-R模型、对象模型、功能模型 D) 对象模型、动态模型、功能模型 4. SA法的主要描述手段有(B)。 A) 系统流程图和模块图 B) DFD图、数据词典、加工说明 C) 软件结构图、加工说明 D) 功能结构图、加工说明 5. 画分层DFD图的基本原则有(A C D)。 A) 数据守恒原则 B) 分解的可靠性原则 C) 子、父图平衡的原则 D) 数据流封闭的原则 6. 在E-R模型中,包含以下基本成分(C)。 A) 数据、对象、实体 B) 控制、联系、对象 C) 实体、联系、属性 D) 实体、属性、联系 7. 画DFD图的主要目的是(A D)。 A) 作为需求分析阶段用户与开发者之间交流信息的工具 B) 对系统的数据结构进行描述 C) 对目标系统的层次结构进行描述 D) 作为分析和设计的工具 8. 数据字典是数据流图中所有元素的定义的集合,一般由以下四类条目组成(C)。 A) 数据说明条目、控制流条目、加工条目、数据存储条目 B) 数据流条目、数据项条目、文件条目、加工条目 C) 数据源条目、数据流条目、数据处理条目、数据文件条目 D) 数据流条目、数据文件条目、数据池条目、加工条目 9. 在需求分析阶段主要采用图形工具来描述的原因是(B C)。 A) 图形的信息量大,便于描述规模大的软件系统 B) 图形工具能够极好地概括描述一个系统的信息,比文字叙述能够更好地表达重 要的细节 C) 图形能够更加直观地描述目标系统,便于用户理解和交流,有利于开发者与用 户之间达成一致的需求 D) 图形比文字描述简单、形象 二、 判断题 1. 在进行了可行性分析后,需求分析就只需要解决目标系统的设计方案。(×) 2. SA法是面向数据流,建立在数据封闭原则上的需求分析方法。(√) 3. HIPO法既是需求分析方法,又是软件设计方法。(√) 4. 在面向对象的需求分析方法中,建立动态模型是最主要的任务。(×) 5. 加工小说明是对系统流程图中的加工进行说明。(×) 6. 判定表的优点是容易转换为计算机实现,缺点是不能够描述组合条件。(×) 7. 需求分析的主要方法有SD法、OOA法及HIPO法等。(×) 8. 分层的DFD图可以用于可行性分析阶段,描述系统的物理结构。(×) 9. 信息建模方法是从数据的角度来建立信息模型的,最常用的描述信息模型的方法是E-R 图。(√)  10. 用于需求分析的软件工具,应该能够保证需求的正确性,即验证需求的一致性、完整性、现实性和有效性。(√) 三、 问答题 1. 什么是需求分析?需求分析阶段的基本任务是什么? 答: 需求分析是当前软件工程中的关键问题,需求分析阶段的任务是:在可行性分析的基础上,进一步了解、确定用户需求。准确地回答 “系统必须做什么?” 的问题。获得需求规格说 明书。还涉及到软件系统的目标、软件系统提供的服务、软件系统的约束和软件系统运行的环境。它还涉及到这些因素和系统的精确规格说明,以及系统进化之间的关系。 需求分析的基本任务包括: (1) 抽取需求 分析现行系统存在需要解决的问题。获取足够多的问题领域的知识,需求抽取的方法一般有问卷法、面谈法、数据采集法、用例法、情景实例法以及基于目标的方法等;还有知识工程方法,例如,场记分析法、卡片分类法、分类表格技术和基于模型的知识获取等 。 (2) 模拟和分析需求 需求分析和模拟又包含三个层次的工作。首先是需求建模。需求模型的表现形式有自然语言、半形式化(如图、表、结构化英语等)和形式化表示等三种。需求概念模型的要求包括实现的独立性:不模拟数据的表示和内部组织等;需求模拟技术又分为企业模拟、功能需求模拟和非功能需求模拟等。 (3) 传递需求 传递需求的主要任务是书写软件需求规格说明。 (4) 认可需求 就是对需求规格说明达成一致,其主要任务是冲突求解,包括定义冲突和冲突求解两方面。常用的冲突求解方法有:协商、竞争、仲裁、强制、教育等,其中有些只能用人的因素去控制。 (5) 进化需求 客户的需要总是不断(连续)地增长,但是一般的软件开发又总是落后于客户需求的增长,如何管理需求的进化(变化)就成为软件进化的首要问题。对于传统的变化管理过程来说,其基本成分包括软件配置、软件基线和变化审查小组。当前的发展是软件家族法 ,即产品线方法。多视点方法也是管理需求变化的一种新方法,它可以用于管理不一致性, 并进行关于变化的推理。 2. M公司的软件产品以开发实验型的新软件为主。用瀑布模型进行软件开发已经有近十年了,并取得了一些成功。若你作为一名管理员刚加入M公司,你认为快速原型法对公司的软件开发更加优越,请向公司副总裁写一份报告阐明你的理由,切记:副总裁不喜欢报告长度 超过一页(B5)。 参考答案提示: 应先简述瀑布模型的缺点,它已不适宜开发实验型的软件。根据快速原型法的特点,说明它特别适合于开发探索型、实验型的软件。 3. 如何画分层数据流图? 答: 总的原则是:至顶而下,逐层分解(画分层数据流图)。 比较复杂的系统不能画在一张纸上,逐层分解的画法可以控制每一层的复杂度。 顶层:将整个系统作为一个加工,描述系统边界(输入与输出)。 中间层:表示某个加工分解为一组子加工,其中的子加工还需进一步分解。 底层:由不再进行分解的基本加工组成。 4. 加工小说明有哪些描述方法? 答: ● 结构化语言:介于自然语言和形式语言(如谓词逻辑)之间。 ● 结构化英语:通常由外层和内层结构组成。 ● 汉语的情况:精确、简明扼要、文体可以灵活。 ● 判定表:适用于表述比较复杂的加工逻辑,如具有多项选择条件的操作。 ● 判定树:本质上与判定表相同,图形表示更易于理解。 5. 考察下图中子图、父图的平衡。 图1 图2 参考答案: 图1中子图与父图不平衡。子图是父图中加工2的分解,加工2 有输入数据流M和N,输出数据流T,而子图则只有一个输入数据N,却有两个输出数据流T与S。 图2中子图是父图中加工3的分解,虽然表面上加工3只有一个输入数据流“订货单”,而子图却有三个输入数据流,但是如果“订货单”是由“客户”、“账号”和“数量”三部分组成,即有如下数据条目,订货单=客户+账号+数量(2.2.5数据词典),则子、父图平衡。 6. 画出银行取款过程的DFD图。问题描述为:储户用存折取款,首先填写取款单,根据“ 账卡”中的信息检验取款单与存折,如有问题,将问题反馈给储户,否则,登录“储户存款 数据库”,修改相应数据,并更新“账卡”,同时发出付款通知,出纳向储户付款。 参考答案: 7. 常用的软件需求分析方法有哪些? 答: 结构化分析方法(SA)、功能分解法、信息建模法、面向对象的分析方法(OOA)。 习题三答案 一、 选择题 1. 模块的基本特征是(A C)。 A) 外部特征(输入/输出、功能) B) 内部特征(输入/输出、功能) C) 内部特征(局部数据、代码) D) 外部特征(局部数据、代码 ) 2. SD方法的设计总则是(C D)。 A) 程序简洁、操作方便 B) 结构清晰、合理 C) 模块内聚性强 D) 模块之间耦合度低 3. 软件设计的主要任务是(A B D)。 A) 将分析阶段获得的需求说明转换为计算机中可实现的系统 B) 完成系统的数据结构和程序结构设计 C) 完成模块的编码和测试 D) 对模块内部的过程进行设计 4. 设计阶段应达到的目标有(A D)。 A) 提高可靠性和可维护性 B) 提高应用范围 C) 结构清晰 D) 提高可理解性和效率 5. 从工程管理的角度来看,软件设计分两步完成(D)。 A) ①系统分析②模块设计 B) ①详细设计②总体设 计 C) ①模块设计②详细设计 D) ①总体设计②详细设 计 6. 模块独立性准则由以下定性指标来衡量(BD)。 A) 分解度    B) 耦合度    C) 屏蔽性    D) 内聚性 7. 用户界面设计的任务包括(A B C)。 A) 确定用户界面类型 B) 建立任务模型 C) 建立用户模型 D) 建立功能模型 8. 程序设计语言可以分为(B C D)。 A) 面向过程的语言    B) 机器语言 C) 高级语言    D) 汇编语言  9. 程序效率包括(A C D)几个方面的内容。 A) 代码效率     B) 运行效率    C) 存储效率     D) I/O效率 10. SP方法中的基本控制结构有(A B C)。 A) 顺序结构 B) 选择结构 C) 重复结构 D) GOTO结构 11. 内部文档可用注释语言书写,注释语言分为(A B C D)。 A) 序言性注释 B) 描述性注释 C) 功能性注释 D) 状态性注释 12. 为使程序中数据说明更易于理解和维护,必须遵循以下原则(A B C) 。 A) 数据说明的次序应当规范化 B) 一个语句说明多个变量时,各变量名按字母顺序排列 C) 对于复杂的数据结构,要加注释,说明在程序实现时的特点 D) 定义变量名应按字母顺序排列 13. 源程序的效率与(D)阶段确定的算法的效率直接有关。 A) 概要设计 B) 总体设计 C) 单元设计 D) 详细设计 14. 在详细设计翻译转换成源程序代码后,算法效率反映为对程序的哪几个方面的要求 (C D)。 A) 读写速度 B) 代码长度 C) 存储容量 D) 执行速度 15. 提高程序效率的根本途径在于(B C)。 A) 编程时对程序语句进行调整 B) 选择良好的设计方法 C) 使程序最大限度的简洁 D) 选择良好的数据结构与算法 二、判断题 1. 划分模块可以降低软件的复杂度和工作量,所以应该将模块分得越小越好。 (×) 2. 在网状结构中任何两个模块都是平等的,没有从属关系,所以在软件开发过程中常常被使用。(×) 3. 信息隐蔽原则有利于提高模块的内聚性。(√) 4. 中心变换型的DFD图可看成是对输入数据进行转换而得到输出数据的处理,因此可以使 用事务分析技术得到初始的模块结构图。(×) 5. SD法是一种面向数据结构的设计方法,强调程序结构与问题结构相对应。 (×) 6. 所谓结构冲突,是指输入数据与输出数据之间很少或没有结构上的对应关系。通常解决 的办法是:构造一个或者多个中间结构,在输入和输出结构之间进行转换。(√) 7. 当模块的控制范围是其作用范围的子集时,模块之间的耦合度较低。(×) 8. JACKSON方法是以数据流、数据封闭性准则逐层分解的。(×) 9. 程序设计语言的工程特性包括:可移植性、可重用性、可维护性、局部性和顺序性。(×) 10. 项目应用领域是选择语言的关键因素。(√) 11. FORTRAN、Pascal、C语言、PL/1和汇编语言都是科学工程计算可选用的语言。(×) 12. 要用快速原型法开发软件,应选用4GL语言。(√) 13. 提高程序效率的根本途径是选择良好的设计方法、数据结构与算法。(×) 14. 良好的程序设计风格简单说就是高的编程技巧。(√) 三、简答题 1. 模块内联系和模块间联系有哪些种类? 答:块间联系的各种类型的划分,从以下3方面考虑: ● 按块间联系的方式(可分为直接引用与过程调用); ● 按块间共用信息的作用(可分为数据型、控制型与混合型); ● 按块间共用的信息数量多少(信息多联系紧密)。 (1) 块间联系的类型,按照耦合度由大到小分为: 内容型:直接引用另一模块的内部信息; 公共型:两个模块引用共同的全程数据区; 控制型:模块间传送的信息用于控制模块的内部逻辑; 复合型:模块间传送复合的数据结构; 数据型:模块间传送单个数据项。 (2) 块内联系的类型,按照内聚性从小到大分为: 偶然型:模块内部没有必然联系; 逻辑型:逻辑上相似的功能放进一个模块; 瞬时型:将同时执行的语句放在一个模块; 通信型:模块中的各部分引用共同的数据; 顺序型:模块中一部分的输出是另一部分的收入; 功能型: 模块中刚好包含了完成一个基本任务所必需的成分。 2. 分析以下DFD图,说明属于哪种类型的DFD图,并按照相应的变换将其转换为初始的模块 结构图。 参考答案:(略) 3. 下图是修改文件记录的DFD图,请确定其主加工。 解:主加工为:账号、修改、写记录。 4. 按照“降低块间联系,提高块内联系”的设计总则对模块进行修改,具体从哪些方面进 行改进? 解: (1) 尽可能建立功能模块; (2) 消除重复功能; (3) 模块的作用范围与控制范围,即当作用范围为控制范围的子集时,才能获得较低的块间 联系; (4) 模块的大小适当; (5) 模块的扇入扇出数不宜太多。 5. 根据模块的作用范围与控制范围的原则,判定a、b两图的正确性。 解:显然,图a不满足作用范围应与控制范围的原则,模块F的作用范围不在控制范围之内。 图b的模块设计合理。 6. 图a中,模块G为判定,判断涉及到模块B、F、G,请指出设计中的错误,再根据改进模 块图的基本原则,画出1~2个改进方案(不改变模块G的判断关系),并说明是按照哪条基本 原则进行改进的。 解:图b为一个改进方案,将模块G的位置提高,使其作用范围为控制范围的子集,减少模块 之间的联系。 7. 编码阶段的主要任务是什,应交付的结果是什么? 答:编码阶段的主要任务是为每个模块编写程序。即是:将详细设计的结果转换为用某种计 算机语言写的程序——源程序代码。编码阶段应交付的结果是带有“程序内部文档”的、不 再含有语法错误的程序。 8. SP法的自顶向下,逐步求精方法的优点有哪些? 答:此法符合人们解决复杂问题的普遍规律,可提高软件开发的成功率和生产率;而且用先 全局后局部、先整体后细节、先抽象后具体的逐步求精过程,开发出来的程序具有清晰的层 次结构,因此程序容易阅读和理解。这样,程序自顶向下,逐步细化,分解成一个树型结构 。 因此,在同一层次的节点上做细化工作,相互之间没有联系,它们之间的细化工作相互独立 ;在任何一步发生错误,一般只影响它下层的节点,同一层其他节点不受影响;在以后的测试中,也可以先独立地一个节点一个节点地做,最后再集成。这样,程序清晰和模块化,使 得在修改和重新设计一个软件时,可复用的代码量最大。 9. 为了使程序具有良好的设计风格,应注意哪些方面的问题? 答:(1) 标识符应按意取名。 标识符即符号名,包括:模块名、常量名、标号名、子程序名、数据区名、缓冲区名等。 这些名字应能反映它所代表的实际东西,应有一定实际意义,使其能够见名知意,有助于对 程序功能的理解。 (2) 程序应加注释,它分为两类:序言性注释和功能性注释。 序言性注释应置于每个模块的起始部分,主要内容有:①说明每个模块的用途,功能;②说明模块的接口即调用格式、参数描述及从属模块的清单;③数据描述;④开发历史 。 功能性注释是嵌在源程序体中的,用于说明其后的程序段或语句的功能以及数据的状态;也就是解释下面要“做什么”,或是执行下面的语句会发生什么情况;而不是解释下面“怎么做”,因为怎么做常常是与程序重复的,且对读者理解程序没有什么帮助。 10. 样评价程序的执行效率?它与程序清晰性的关系是怎样的? 答:许多程序员往往片面追求效率,其实程序系统的成本不仅包括运行所需的机时,同时还应把程序员及操作员所花费的人力考虑进去。在编程时为追求效率而损害可读性或可靠性,会给以后的维护工作带来困难,所以从整体上看来是不值得的。 此外,还应该认识到,提高程序效率的根本途径在于:选择良好的设计方法、良好的数据结构与算法,而不是靠编程时对程序语句进行调整。 (1) 追求建立在不损害程序可读性或可靠性基础上,要先使程序正确、清晰,再提高程序 效率。 (2) 不能因为贪图效率上的小利,而破坏程序的清晰性。 (3) 让编译程序去作简单的优化。 (4) 提高程序效率的根本途径在于:选择良好的设计方法和良好的数据结构与算法,而不是靠编程时对程序语句做调整。 11. 假定:需要编一个求解一元二次方程根的子程序,加入到现有的子程序库中,供其他程序员使用。要求: (1) 为该子程序写一个序言性注释; (2) 用PASCAL语言或其他语言写出这个子程序(要把根的性质,如:实根、复根、降为一次方程等有区别地通知调用者),并加上描述性注释。 答案:(略) 习题四答案 一、选择题 1. 面向对象程序设计的基本机制(ABC)。 A) 继承 B) 消息 C) 方法 D) 结构 2. 下列属于面向对象的要素有(BCD)。 A) 分类性 B) 抽象 C) 共享 D) 封装 3. 下列选项中属于面向对象开发方法的有(ACD)。 A) Booch B) CAD C) Coad D) OMT 4. 下列属于Coad方法中面向对象的分析模型的层次有(AB)。 A) 主题层 B) 对象层 C) 应用层 D) 接口层 5. 一个类属性依其特征划分,其类型有(ABCD)。 A) 描述型 B) 定义型 C) 派生型 D) 参考型 6. 在进行面向对象分析时,所采用的模型有(ABD)。 A) 对象模型 B) 动态模型 C) 静态模型 D) 功能模型 7. 状态是对象属性的值的一种抽象,它的性质有(AB)。 A) 时间性 B) 持续性 C) 有序性 D) 有穷性 8. 数据流图中的处理必须用对象中的操作来实现常见的操作有(ABCD)。 A) 查询 B) 动作 C) 活动 D) 访问 9. 建立继承关系时所采用的方式有(AC)。 A) 自顶向下 B) 从内到外 C) 自底向上 D) 从复杂到简单 10. 对象是人们要研究的任何事物主要的对象类型有(ABCD)。 A) 有形实体 B) 作用 C) 事件 D) 性能说明 二、判断题 1. 面向对象的的方法是以类作为最基本的元素,它是分析问题解决问题的核心。(×) 2. 类是指具有相同或相似性质对象的抽象,对象是抽象的类,类的具体化就是对象。(√) 3. 继承性是父类和子类之间共享数据结构和消息的机制,这是类之间的一种关系(×)。 4. 多态性增强了软件的灵活性和重用性,允许用更为明确、易懂的方式去建立通用软件, 多态性和继承性相结合使软件具有更广泛的重用性和可扩充性。(×) 5. 面向对象分析,就是抽取和整理用户需求并建立问题域精确模型的过程。(√) 6. 面向对象的设计的主要目标是提高生产效率,提高质量和提高可维护性。(√) 7. 对象模型表示了静态的、结构化的系统数据性质,描述了系统的静态结构,它是从客观世界实体的对象关系角度来描述,表现了对象的相互关系。(√) 8. 面向对象的分析是用面向对象的方法对目标系统的问题空间进行理解、分析和反映。通过对象层次结构的组织确定解空间中应存在的对象和对象层次结构。(√) 9. 类的设计过程包括:确定类,确定关联类,确定属性,识别继承关系。(√) 10. 复用也叫重用或再用,面向对象技术中的“类”,是比较理想的可重用软构件。有三种重用方式:实例重用、继承重用、多态重用。(√) 11. 主题是一种关于模型的抽象机制,它是面向对象模型的概貌,也是关于某个模型要同时考虑和理解的内容,主题起一种控制作用。(√) 12. 面向对象的分析由对象、结构、继承性和基于消息的通信构成。(×) 13. 支持继承性是面向对象程序设计语言和传统程序设计语言在语言机制方面的根本区别。(√) 14. 面向对象的分析过程主要包括三项内容:理解、表达和验证。(√) 15. 面向对象的设计的主要目标是提高生产效率、提高质量和提高可维护性。(√) 三、 简答题 1. 与传统程序设计模式中的过程调用相比,消息传递机制有何本质区别? 答: (1) 消息传递必须给出信道的信息,通常要指出明显的接受方。 (2) 由于接受方是一通信实体,具有保持状态的能力,所以同一发送方在不同时刻向同一 接受方发送同样的信息,可因接受方的当前状态不同而得到不同的结果。 (3) 消息传递可以是异步的,发送方可以不必等待接受方返回信息就可以继续执行后面的操作,因而支持程序的并发和分布执行,而过程调用只能是同步的,本质上是串行的。 2. 阐述面向对象的特征,并做简要的解释。 答: (1) 对象惟一性。 每个对象都有自身惟一的标识,通过这种标识,可找到相应的对象。 (2) 分类性。 是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。 (3) 继承性。 是父类和子类之间共享数据结构和方法的机制,这是类之间的一种关系。 (4) 多态性。 是指相同的操作或函数,过程作用于多种类型的对象上,并获得不同的结果。 3. Coad方法主要由面向对象分析OOA和面向对象设计OOD。OOA方法分析过程和构造OOA概念模型的顺序由5个层次组成,请简述这5个层次。 答: (1) 发现类及对象。描述如何发现类及对象。从应用领域开始识别类及对象,形成整 个应用的基础,然后,据此分析系统的责任。 (2) 识别结构。该阶段分为两个步骤。第一,识别“一般-特殊”结构,该结构捕获了识别出的类的层次结构;第二,识别“整体-部分”结构,该结构用来表示一个对象如何成为另一个对象的一部分,以及多个对象如何组装成更大的对象。 (3) 定义主题。主题由一组类及对象组成,用于将类及对象模型划分为更大的单位,便于理解。 (4) 定义属性。其中包括定义类的实例(对象)之间的实例连接。 (5) 定义服务。其中包括定义对象之间的消息连接。 4. 面向对象程序设计有哪些优点? 解:开发时间短、效率高、可靠性高,所开发的程序更强壮。由于面向对象编程的可重用性 ,可以在应用程序中大量采用成熟的类库,从而缩短开发时间,这样程序更易于维护、 更新和升级。继承和封装使得应用程序的修改带来的影响更加局部 化。 5.比较面向对象方法与结构化方法的特点。 解:分析是问题抽象 (做什么),设计是问题求解 (怎么做),实现是问题的解 (结果)。任 何方法学对客观世界的抽象和求解过程都是如此。在问题抽象阶段,结构化方法面向过程, 按照数据变换的过程寻找问题的结点,对问题进行分解。因此,与面向对象方法强调的对象 模型不同,描述数据变换的功能模型是结构化方法的重点。如果问题世界的功能比数据更复 杂或者更重要,那么结构化方法仍然应是首选的方法学。如果数据结构复杂且变换不多, 那么如果以过程主导分析和设计,一旦有系统变更就会给下游开发带来极大混乱。 由于对过程的理解不同,面向过程的功能细分所分割出的功能模块有时会因人而异。而面向 对象的对象细分,从同一问题领域的对象出发,不同人得出相同结论的比率较高。 在设计上,结构化方法学产生自顶向下、结构清晰的系统结构。每个模块有可能保持较强的独立性,但它往往与数据库结构相独立,功能模块与数据库逻辑模式间没有映射关系,程序与数据结构很难封装在一起。如果数据结构复杂,则模块独立性很难保证。面向对象方法抽象的系统结构往往并不比结构化方法产生的系统结构简单,但它能映射到数据库结构中,很容易实现程序与数据结构的封装。 在软件工程基本原则中有一条“形式化原则”,即对问题世界的抽象结论应该以形式化语言 (图形语言、伪码语言等)表述出来。结构化方法可以用数据流图、系统结构图、数据辞典、状态转移图、实体关系图来进行系统逻辑模型的描述;而面向对象方法可以使用对象模型图、数据辞典、动态模型图、功能模型图。其中对象模型图近似系统结构图与实体关系图的结合,动态模型图类似状态迁移图,功能模型图类似数据流图。 6.当重要的对象被发现后,通过一组互相关联的模型详细表示类之间的关系和对象的行为,这些模型从四个不同的侧面表示了软件的体系结构、静态逻辑、动态逻辑、静态物理和动态物理。试描述一下这四种特性。 解:静态逻辑模型描述实例化(类成员关系)、关联、聚集(整体/部分)、和一般化(继承)等关系。这被称为对象模型。一般化关系表示属性和方法的继承关系。定义对象模 型的图形符号体系通常是从用于数据建模的实体关系图导出的。对设计十分重要的约束,如 基数(一对一、一对多、多对多),也在对象模型中表示。 动态逻辑模型描述对象之间的互相作用。互相作用通过一组协同的对象,对象之间消 息的有序的序列,参与对象的可见性定义,来定义系统运行时的行为。 静态物理模型通过模块描述代码的布局。动态物理模型描述软件的进程和线程体系结 构。 习题五答案 一、选择题 1. 下列不是模型元素的是(D)。 A) 关联 B) 聚合 C) 依赖 D) 笔记 2. UML具有扩展性,常见的扩展机制有(BCD)。 A) 修饰 B) 版类 C) 加标签值 D) 约束 3. UML语言支持的建模方式有(ABD)。 A) 静态建模 B) 动态建模 C) 模块化建模 D) 功能建模 4. 下列各种图可用于动态建模的有(ACD)。 A) 状态图 B) 类图 C) 序列图 D) 活动图 5. 下列属于状态的组成部分的有(AB)。 A) 名称 B) 活动 C) 条件 D) 事件 6. UML中包括的事件有(ABCD)。 A) 条件为真 B) 收到另一对象的信号 C) 收到操作调用 D) 时间表达式 7. 属性的可见性有(ABD)。 A) 公有的 B) 私有的 C) 私有保护的 D) 保护的 8. 用例之间的关系有(BCD)。 A) 友元 B) 扩展 C) 使用 D) 组合 9. 应用于通用化约束的方式有(ABCD)。 A) 完整 B) 不相交 C) 不完整 D) 覆盖 10. 消息的类型有(ABC)。 A) 同步 B) 异步 C) 简单 D) 复杂 二、 判断题 1. UML建模语言是由视图、图、模型元素和通用机制构成的层次关系来描述的。 (√) 2. UML是一种建模语言,是一种标准的表示,是一种方法。 (×) 3. 泳道是一种分组机制,它描述了状态图中对象所执行的活动。 (×) 4. 同步消息和异步消息的主要区别是:同步消息的发送对象在消息发送后,不必等待消息处理,可立即继续执行,而异步消息则发送对象必须等待接收对象完成消息处理后,才能继续执行。 (×) 5. 类图中的角色是用于描述该类在关联中所扮演的角色和职责的。 (√) 6. 类图用来表示系统中类和类与类之间的关系,它是对系统动态结构的描述。 (×) 7. 用例模型的基本组成部件是用例、角色和用例之间的联系。 (√)
人工智能解读 人工智能解读全文共19页,当前为第1页。人工智能解读全文共19页,当前为第1页。人工智能解读 人工智能解读全文共19页,当前为第1页。 人工智能解读全文共19页,当前为第1页。 人工智能(英语:Artificial Intelligence,缩写为AI)亦称智械、机器智能,指由人制造出来的机器所表现出来的智能。通常人工智能是指通过普通计算机程序来呈现人类智能的技术。该词也指出研究这样的智能系统是否能够实现,以及如何实现。人工智能于一般教材中的定义领域是"智能主体(intelligent agent)的研究与设计",智能主体指一个可以观察周遭环境并作出行动以达致目标的系统。约翰·麦卡锡于1955年的定义是"制造智能机器的科学与工程"。安德里亚斯·卡普兰(Andreas Kaplan)和迈克尔·海恩莱因(Michael Haenlein)将人工智能定义为"系统正确解释外部数据,从这些数据中学习,并利用这些知识通过灵活适应实现特定目标和任务的能力"。人工智能的研究是高度技术性和专业的,各分支领域都是深入且各不相通的,因而涉及范围极广。 AI的核心问题包括建构能够跟人类似甚至超卓的推理、知识、规划、学习、交流、感知、移物、使用工具和操控机械的能力等。当前有大量的工具应用了人工智能,其中包括搜索和数学优化、逻辑推演。而基于仿生学、认知心理学,以及基于概率论和经济学的算法等等也在逐步探索当中。 思维来源于大脑,而思维控制行为,行为需要意志去实现,而思维又是对所有数据采集的整理,相当于数据库,所以人工智能最后会演变为机器替换人类。 2017年12月,人工智能入选"2017年度中国媒体十大流行语"。 人工智能定义: 人工智能的定义可以分为两部分,即"人工"和"智能"。"人工"比较好理解,争议性也不大。有时我们会要考虑什么是人力所能及制造的,或者人自身的智能程度有没有高到可以创造人工智能的地步,等等。但总的来说,"人工系统"就是通常意义下的人工系统。[1] 关于什么是"智能",就问题多多了。这涉及到其它诸如意识(CONSCIOUSNESS)、自我(SELF)、思维(MIND)(包括无意识的思维(UNCONSCIOUS_MIND))等等问题。人唯一了解的智能是人本身的智能,这是普遍认同的观点。但是我们对我们自身智能的理解都非常有限,对构成人的智能的必要元素也了解有限,所以就很难定义什么是"人工"制人工智能解读全文共19页,当前为第2页。人工智能解读全文共19页,当前为第2页。造的"智能"了。因此人工智能的研究往往涉及对人的智能本身的研究。其它关于动物或其它人造系统的智能也普遍被认为是人工智能相关的研究课题。 人工智能解读全文共19页,当前为第2页。 人工智能解读全文共19页,当前为第2页。 人工智能在计算机领域内,得到了愈加广泛的重视。并在机器人,经济政治决策,控制系统,仿真系统中得到应用。 著名的美国斯坦福大学人工智能研究中心尼尔逊教授对人工智能下了这样一个定义:"人工智能是关于知识的学科――怎样表示知识以及怎样获得知识并使用知识的科学。"而另一个美国麻省理工学院的温斯顿教授认为:"人工智能就是研究如何使计算机去做过去只有人才能做的智能工作。"这些说法反映了人工智能学科的基本思想和基本内容。即人工智能是研究人类智能活动的规律,构造具有一定智能的人工系统,研究如何让计算机去完成以往需要人的智力才能胜任的工作,也就是研究如何应用计算机的软硬件来模拟人类某些智能行为的基本理论、方法和技术。 人工智能是计算机学科的一个分支,二十世纪七十年代以来被称为世界三大尖端技术之一(空间技术、能源技术、人工智能)。也被认为是二十一世纪三大尖端技术(基因工程、纳米科学、人工智能)之一。这是因为近三十年来它获得了迅速的发展,在很多学科领域都获得了广泛应用,并取得了丰硕的成果,人工智能已逐步成为一个独立的分支,无论在理论和实践上都已自成一个系统。 人工智能是研究使计算机来模拟人的某些思维过程和智能行为(如学习、推理、思考、规划等)的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。人工智能将涉及到计算机科学、心理学、哲学和语言学等学科。可以说几乎是自然科学和社会科学的所有学科,其范围已远远超出了计算机科学的范畴,人工智能与思维科学的关系是实践和理论的关系,人工智能是处于思维科学的技术应用层次,是它的一个应用分支。从思维观点看,人工智能不仅限于逻辑思维,要考虑形象思维、灵感思维才能促进人工智能的突破性的发展,数学常被认为是多种学科的基础科学,数学也进入语言、思维领域,人工智能学科也必须借用数学工具,数学不仅在标准逻辑、模糊数学等范围发挥作用,数学进入人工智能学科,它们将互相促进而更快地发展。 2017年3月5日,
RFID冗余数据近似消重 1.简介: 随着信息技术的发展,各种数据(如XML、RDF和RFID数据生成。RFID不需要接触即可检测射频识别标签的特性,因此被用于很多领域,如商业、军事和医学,导致了大量的RFID数据生成,沃尔玛采用RFID技术是一个典型的RFID在商业领域应用的例子。 然而,RFID技术也带来一系列的问题,由于RFID是非接触式探测,只要标签在阅读器的探测范围内,所有的标签信息都会被读到,因此,RFID标签在探测区移动缓慢或者停留都会产生冗余数据。另外,标签在探测区移动速度过快或者有多个标签同时移动,会造成阅读器漏读。为了避免漏读现象的产生,就会在一个区域放置多个阅读器,当同一个标签被几个阅读器读到时,冗余数据也就产生了。 一个智能的RFID阅读器能够去除自身产生的冗余数据,但是多个阅读器产生的冗余数据紧靠本身自包含的处理能力去除是不可能的,因此我们提出了一种基于中间件的处理冗余数据的技术。 上面这张图表示:有两个阅读器Reader1和Reader2,两个标签在探测区内,Reader1探测到标签用ID1,Reader2探测到标签用ID2表示,每个阅读器生成的信息表示形式为 : <tag ID, location of the reader, time>. Reader1探测到标签ID1产生RFID数据 : <ID1, Loc1, 1>, <ID1, Loc1, 2>, <ID1, Loc1,4>,然而, RFID 数据是重复的除了<ID1, Loc1, 1>. .Reader1 也探测到了ID2的RFID 数据 <ID2, Loc1, 3>, <ID2, Loc1, 5> , <ID2, Loc1, 5> 是重复数据. 同样的, Reader2 探测到的数据和产生的一些冗余数据在上图中都表示出来了。由于两个阅读器可能会探测到同一个RFID标签于是更多就会造成中间件中有更多的冗余数据。比如:Reader1<ID1, Loc1, 1>, Reader2<ID1, Loc2, 1> 就是冗余数据。中间件要进行去冗余处理,去冗余后结果为<ID1, Loc1, 1>, <ID2, Loc2, 2>.对于小数据的处理似乎是很简单的。 然而,RFID数据量是很庞大的,如果每个商品上都有一个标签,那么一个大型的零售商每天产生的数据将会超过1TB,并且,RFID数据是以流的形式产生的,也就意味着冗余数据在一个有限的内存中要立即进行去重处理,我们很难设计出一个精确的去冗余办法,因而,提出了一个近似去冗余方案去替代它。 有一种应用背景是这样的。我们要对大型百货商场中客户的移动进行实时分析,每个客户都有一个唯一的RFID标签,经理希望得到对客户的一些实时分析,比如:每个商店的顾客数量,哪个商店的顾客数量最多,百货商店的中间件就应该对这些数据进行去冗余处理。在这样的环境中,大量的重复数据同时进入中间件,特别是一个顾客长时间呆在同一个地方就会产生大量的重复数据,为了准确的去除冗余数据,我们需要在内存中长时间保存包括重复数据在内的所有RFID数据。当相对于RFID数据来说存储器的数量较少时,RFID数据实时去冗余也就很困难。在这个应用中,管理者是允许统计数据有误差,因而我们提出了在有限存储空间中的近似RFID去重技术。 Bloom filter是一种能够容忍误差的情况下被广泛应用的数据结构。要用少量的内存管理RFID数据流,我们设计了基于bloom filter的方法。然而,由于布鲁姆过滤器是针对静态数据,我们应该让bloom filter适应RFID数据流的环境。因此,我们提出了time bloom filter,由于要用少量的内存管理RFID数据流,我们设计了基于bloom filter的方法。然而,由于布鲁姆过滤器是针对静态数据,我们应该让bloom filter适应RFID数据流的环境。因此,我们提出了time bloom filter,由于time bloom filter是基于bloom filter的,它们不会产生假阴性错误,但是,它们可能产生假阳性错误。我们也计算出了time bloom filter的假阳性错误率,为了降低错误率,我们又提出了time interval bloom filter。 2.相关工作: 3.初期(基本bloom filter介绍): 为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1(1≤i≤k)。注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。在下图中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位)。 在判断a是否属于这个集合时,我们对a应用k次哈希函数,如果所有hi(a)的位置都是1(1≤i≤k),那么我们就认为a是集合中的元素,否则就认为a不是集合中的元素。A如果不是集合中的元素但却被误认为是集合中的元素。这就是一个false positive。 错误率: 当k= 时错误率最低。 4.问题说明: 系统结构如图 2所示,RFID数据流产生并进入中间件。中间件中有过滤模块和应用程序在。在原始RFID数据流进入应用程序之前,它通过过滤模块去除重复RFID数据,之后应用程序接收到非重复的RFID数据。即,在过滤模块中,重复的RFID数据被去除。 RFID数据是在许多RFID阅读器中连续地产生的。 RFID阅读器发送RFID数据到中间件。因此,中间件接收到一系列的RFID数据流。 其中RFID数据包括标签识别符(即,EPC),RFID阅读器的位置,检测标签的时间。 RFID数据流定义如下: Definition1:数据流S(s1,s2,s3,……sn),si=(TagID,Loc,Time), 在RFID数据流,,如果在RFID数据流中存在γ(≠x),使得x.TagID= y.TagID 和 x.Time-y.Time≤τ,RFID数据x被认为是一个重复的,其中τ是应用程序专用的正值[2,21,22]。从冗余的定义中,我们可以通过去除重复数据找到非重复的RFID数据流。然而,有这样一种情况,即在时间间隔小于或等于τ时相同标签被探测到的RFID数据产生,找到一个非重复的RFID数据流就是混乱的。例如,一个RFID数据流S= {S1,S2,S3},其中S1 =(tag1,loc1,5),S2 =(tag 1,loc 1,10)和s3=(tag 1,loc1,15)(τ= 8)。根据s1我们知道S2是重复的,根据s2我们知道S3是重复的。然而,S连续的到达中间件的。如果S2到达中间件,我们可以先从{S1,S2}中除去s2。在这种情况下,如果S3到达中间件,因为不存在s2所以S3就判断为不是一个重复数据。(相同时间去定义重复) 根据不同的应用程序,非重复的数据流S的定义是不同的。 Definition 2:(不同时间定义重复数据)标签相同,出现时间间隔小于等于t即为重复。 Definition 3:集合S'(⊂S)为S的无重复数据集合,如果不存在x∈S',则称x在S中属于重复数据。 Definition 4:集合S'(⊂S)为S中的最大无重复集合, x∈S-S’,则称x在S中属于重复数据。 Min=|Sˆ−S| / |S’| , Max=s’。 5.time bloom filter 为了去除冗余数据,我们提出了一个基于bloom filter 的简单的time bloom filter,从definition2 中可以知道,标签相同的RFID数据不一定就是冗余数据,因此,可以用时间信息来检测冗余。Bloom filter的位数组被设置成0或者1,TBF的数组设置成RFID标签的检测时间。也就是说,TBF用整数数组而不是一个bit数组。 TBF如图三所示。它使用k个相互独立的哈希函数(h1,h2,…..hk),如BF一样映射到(0,….,m-1).TBF第i个单元的值用M[i]表示。为了存储RFID数据x,找到h1(x.TagID),⋯,hk(x.TagID)对应的k个单元,TBF将K个单元的值设置为x的检测时间x.time。如果这个单元已经被设置成之前RFID数据的检测时间,TBF用当前RFID数据的检测时间。 为了检测RFID数据x是否是冗余数据,检测h1(x.TagID),….,hk(x.TagID)对应的k个单元,如果至少存在一个单元满足x.Time−M[hi(x.TagID)]>τ,那么x不是冗余数据(因为冗余数据产生在t时间内)。在TBF中,可以将x.Time−M[hi(x.TagID)]≤t看作BF中的1,x.Time−M[hi(x.TagID)]>τ看作BF中的0。 图四是数据流基于TBF的去冗余算法,这个算法能够在有限的存储空间中找到非重复的数据,TBF所有的单元初始值为0,当RFID数据到达中间件,通过TBF 的数据将被过滤,换句话说,数据x要么被过滤掉要么被发送给应用程序。首先,当数据x通过TBF的时候,检测x.Time-M[hi(x.TagID)]≤τ for all i∈{1, 2,⋯,k}是否全部满足来判断数据x是否是重复数据。因为所有单元的初始值都是0,如果当至少有一个单元的值为0时,数据x就不是重复数据。如果 x.Time−M[hi(x.TagID)]≤τ满足对于所有的 i∈{1, 2,⋯,k}没有满足 M[hi(x.TagID)]为0的,数据x可能就是重复数据,然后将x过滤掉,将非重复数据发送给应用程序,最后 x是否是重复数据都将单元的值更新为x.time。如果我们仅当数据不是重复数据的时候更新,那么当有相同标签的数据在小于t的时间间隔内连续出现时就不能进行被过滤掉。 例子1:如图五所示,图五表示数据流S={s1, s2, s3}在通过TBF过滤之后的TBF 的状态。s1=(ID1, Loc1, 10), s2=(ID2, Loc2, 120), and s3=(ID1, Loc1, 130).TBF的数组长度为8,哈希函数个数k为3,时间间隔t为100,为了很好的解释TBF,我们假定h2(ID1)=h1(ID2)。 考虑TBF如何处理数据流S={s1, s2, s3},当s1到达TBF的时候,它将会检测s1是否是冗余数据,因为M[0],M[5],and M[2]的初始值都是0,s1不是重复数据,s1被发送给应用程序,然后TBF设置M[0],M[5],and M[2]的值为10。当s2通过TBF的时候因为没有重复数据,它被发送给应用程序,TBF设置M[5],M[7],and M[3]的值为120,对于M[5]单元,虽然之前的值10,但也被重新设置为120。s3通过TBF时,由于 130−M[0]>τ and 130−M[2]>τ,不是重复数据,s3发送到应用程序。TBF设置M[0],M[5],and M[2]的值为130.在这个例子中,因为没有数据是重复的,所以应用程序可以接受到所有的RFID数据。 TBF假阳性率(错误率): 公式: ,其中k为哈希函数个数,n’ 为在t时间内非重复的元素个数,m为单元个数。 证明:为了得到错误率,我们假定到达TBF的数据流都是非重复的,然而,在真正的应用中,RFID数据流中有很多重复数据,这些数据流的标签相同,到达时间集中因而在TBF被哈希到相同的单元,单元设置的时间值相似。因而,重复数据到达TBF后被过滤和非重复数据到达TBF导致的TBF状态是一样的。因而,假定到达TBF的数据都是非重复数据是合理的。 思考,之前有RFID数据到达TBF,现在对于任意的元素x我们想计算其假阳性率。重复数据的定义是在时间t内到达的数据,也就是说在时间t内到达TBF的数据是无效的,因此,我们只考虑相对于x.time来说t时间内的数据。 P1为x.Time−M[hi(x.TagID)]≤τ for 1≤i≤k的概率,p2为x可能为重复数据的概率。 X的假阳性概率为:x=p1-p2; 为了得到p1,我们先得到对于u的x.Time−M[u]≤τ的 概率,我们假定哈希函数有统一的分布,对于在时间t内的RFID数据y来说概率为:hi(y.TagID)≠u for some i is (1−1/m),对于所有的i∈{1, 2,…,k},hi(y.TagID)≠u的概率为 。 假定n’为在t时间内到达TBF的RFID数据的数量, 。 . 因为我们假定到达TBF的数据是非重复数据,因而,p2=0. 所有y的假阳性概率为: 。 6.time interval bloom filter . 在前面的部分,我们介绍了TBF,TBF只是BF的一个简单扩展,我们提出了TIBF去优化TBF。 如图3即为TIBF的结构,M[i].StartTime和M[i].EndTime分别表示第i个单元的开始和结束时间,开始和结束时间的初始值分别为0和-1.考虑TIBF如何保持每个单元的开始和结束时间,一个简单的解释是,假定哈希函数的个数为1,TIBF的每一个单元对应一个标签,当RFID数据x(TagID=1)首先到达时,设置TagID=1对应单元的开始和结束时间为x.time,也就是初始时间间隔是一个时间点,当另一个数据y(TagID=1)到达时,仅仅改变TagID=1对应单元的结束时间为y.time。因此,TIBF保持了TagID=1对应的时间间隔,对RFID数据x,如果有x.Time-EndTime>t, x.Time-x.StartTime>t,时间间隔没有用,在这种情况下,初始化时间间隔,设置单元的开始和结束时间为x.Time. 因为一个单元可能被不同TagID的RFID数据设置,对于每个TagID的时间间隔可能被混合,但是,单元的间隔时间[StartTime,EndTime]涉及所有跟单元有关的RFID数据的检测时间。 为了确定RFID数据x是否是冗余数据,检查h1(x),h2(x),…hk(x)对应的所有时间间隔的交集是否为空。如果接收到的RFID数据TagID=x.TagID在时间t内到达TIBF,x.TagID对应的所有时间间隔应该包括了该数据的检测时间,并且其交集应不为空。因此,当交集为空,亏确定任何RFID数据TagID=x.TagID在时间t内没有到达TIBF.. 图6说明了如何确认RFID数据x是否为冗余数据,图6中TIBF右侧坐标表示数据x对应的时间间隔,在图6(a)中,四个时间间隔的交集是[10,15]。因为交集非空,x是冗余数据。在图6(b)中,四个时间间隔的交集为空,x非冗余数据。 图7 为TIBF 去除冗余数据的算法,RFID数据x到达TIBF,首先检测x是否为冗余数据,为了检测x是否为冗余数据,首先要检查时间间隔对应的h1(x),h2(x),….,hk(x)的交集是不是空集,如果交集在x.time-t之前(即x.time-intersection.EndTime>t),我们认为他是空集,因为重复数据定义在t之间之内的,当交集不是空集并且x. Time−intersectInterval.EndTime≤τ, 则认为数据x是重复数据并且将被过滤掉,否则将会被发送给应用程序。 例子2:考虑数据流{(ID1, Loc1, 10), (ID1, Loc1, 11), (ID2, Loc2, 14), (ID3, Loc3, 15), (ID2, Loc4, 17), (ID2,Loc2, 18)}.在解释TIBF的操作之前,我们先解释数据流通过TBF后的TBF的状态,哈希函数如图8,9所示,单元数组的长度为8,k为3,t为100,为了解释TIBF,假定h1(ID1)=h2(ID4), h1(ID2)=h1(ID4), and h3(ID3)=h3(ID4).如果(ID4, Loc4,20)通过TBF,因为20−M[h1(ID4)]≤τ, 20−M[h2(ID4)]≤τ and 20−M[h3(ID4)]≤τ,TIBF将会检测到ID4为重复数据,实际上ID4不是重复数据,也就是说这里出现了假阳性错误。 同时,TIBF记录了开始时间和结束时间,如图9为上述数据流通过TIBF后TIBF的状态,如图9,考虑数据(ID4,Loc4,20)通过TIBF,ID4的三个时间间隔的集合(即[10,11], [14,18], [15])为空,因此,时间间隔过滤器将会检测到ID4为非重复数据。 对于TIBF,必须根据时间间隔的交集来计算错误率,所以很难计算,但是考虑TBF和TIBF具有相同个数单元和相同哈希函数设置,那么,对于任何RFID数据流,TIBF的错误率小于等于TBF。 理论2:考虑TBF和TIBF具有相同个数单元和相同哈希函数设置,那么,对于任何RFID数据流,TIBF的错误率小于等于TBF。 证明:假定相同的数据流通过TBF和TIBF ,当数据被检测出来是重复时就会出现假阳性错误,证明,对于任何元素x,当被TIBF检测出为重复时,被TBF检测出也为重复。 假定TIBF检测x为重复数据。 Then intersectInterval≠ϕ and x.Time−intersectInterval.EndTime ≤τ ei ≥intersectInterval.EndTime for 1≤ i≤k (also, si ≤intersectInterval:StartTime) mi = ei ≥intersectInterval.EndTime [mi is M[hi(x.TagID)] −mi≤−intersectInterval:EndTime By adding x.Time in both sides, x.Time−mi ≤ x:Time−intersectInterval:EndTime Since x.Time−intersectInterval.EndTime≤τ by Eq. (1), x.Time−mi ≤τ 所以对于任何元素x,当被TIBF检测出为重复时,被TBF检测出也为重复。 6.1空间优化: 如果TBF和TIBF的元素个数相同,那么TIBF需要的空间是TBF的两倍。但是,因为只有t以内的时间间隔有用,可以对TIBF的空间进行优化,如图10所示,时间间隔只需保存StartTime 和 EndTime−StartTime(DiffTime)代替了StartTime 和 EndTime,因为DiffTime所需空间小于EndTime。但是用如图7所示的算法运行的时候DiffTime的值可能会大于t,为了使DiffTime的值小于等于t,我们修改了算法如图11所示。StartTime和 EndTime需要保存数月,日,时,分,秒,但是t只是一个很小的值,因此保存DiffTime会大大减少了空间需求。 如图11所示,考虑空间优化后的TIBF算法,StartTime 和 DiffTime的初始值为0和-1,类似TIBF()算法,TIBF_OPT()首先检查数据x是否为重复数据,EndTime可以通过DiffTime+StartTime计算出来。 为了保证t的值小于等于t,TIBF_OPT()更新单元值的方法与TIBF()不同,当StartTime=0 或者x.Time−(StartTime+DiffTime)>τ时,设置StartTime = x.Time , DiffTime = 0,当x.Time−StartTime>τ时StartTime = x.Time−τ ,DiffTime =τ,当x.Time−StartTime≤τ时,只设置DiffTime =x.Time−StartTime。 7.参数设置。 对于TIBF,因为必须根据时间间隔的交集计算错误率,所以很难计算。但是考虑TBF和TIBF具有相同个数单元和想要哈希函数设置。对于BF,k设置为(ln2)(m/n)(n为数据个数)时,BF的错误率最低,那么,对于任何RFID数据流,TIBF的错误率小于等于TBF(理论2,证明2)。同样,k设置为(ln2)(m/n’)时,可以保证TIBF的错误率小于等于TBF。因此,对于TIBF和TBF,k值均为(ln2)(m/n’)(n’为非重复数据的个数)。 8.实验 为了验证算法的有效性,我们设计了实验进行验证。比较了BF,TBF和TIBF处理数据额能力。实验环境:3GHz PC with 1 GB 主存。 8.1数据集 由于没有一个已知的数据集,我们生成了类似的合成数据,用检测模型去模拟RFID标签检测。 如果标签和阅读器的距离过远,标签将不能被检测到,随着标签靠近阅读器,标签被检测到的概率和距离成正比,这个区域被称作次检测区域,当标签和阅读器的距离较近时,标签被检测到的概率是恒定的,这个区域被称为主检测区域。 由于我们的目的是检测去重效率,所以假定标签是直线移动的,如图13所示。标签只在出发的时候产生,然后沿着直线移动,移动速度是标签生成时随机分配的,同一时间产生的标签分配的速度相同因为在现实的应用中,标签是一起移动的,标签到达目的地后就会消失,另外,为了提高检出率在检测区内存在多个标签和多个阅读器。我们分别在有一个阅读器和三个阅读器的检测区生成了107, 2×107, 3×107, 4×107, 5×107,和6×107(10的7次方)个元组。之前的数据称为SData 之后的数据称为MData。 8.2 实验结果 8.2.1显示的是根据元数据多少的实验结果,8.2.2显示的是根据空间大小的实验结果。 如图14.15所示为根据元数组大小的实验结果,对于数据SData和MData,BF的processing rate随着元数组的增加而增大,而TBF和TIBF的processing rate恒定。但是SData的processing rate小于MData,因为MData的k值较大(k值较小,在BF中访问的单元就比较小,因而,processing rate较大)。 为了验证算法的有效性,根据元数据量对TIBF,TBF和BF的错误率进行了测评,对于SData数据,如图17所示,BF的错误率更高,对于MData数据,如图17所示,TIBF的错误率都低于0.007%,随着元数组数量的增加,错误率都随之增大。 8.2.2根据空间大小的实验结果。 给定的元组数量为4*107(10的7次方),测定根据空间大小的processing rate 和error rate。如图18,,19所示随着空间的增大,BF,BTF,BITF的processing rate减少。 对于数据SDate,BF的processing rate比BTF和BITF高很多,对于数据MDate,BF的processing rate 比TBF和TBIF也高出一些,这是因为BF中MDate的k值比BTF和BITF中的K值增加的更多。 如图20和21为根据空间大小的错误率结果。随着空间增大BF的错误率保持恒定,而TBF和TIBF的错误率降低。而TIBF的错误率比起其他算法来是最低的,因为BF不能动态改变单元的值,并且元数组的数量越少错误率越高。 8.2.3优化k值 和BF类似,k值也影响TBF和TIBF的错误率,为了测试在第7部分提出来的K值是否有效,从1到10改变k的值去测试错误率,如图22和23所示,给定的空间大小为3*107(10的7次方),元数组数量为3*107(10的7次方),单个圆圈表示用第7部分公式测试的k值,双圆圈表示用BF的公式测试的k值。 实验结果表明虽然第7部分给定的K值不是最优解,但是计算出来的错误率最低。 9.结论 通常,RFID数据流中有大量的重复数据,由于数据是以流的形式产生的,所以要在很小的存储空间上去除重复数据是很困难的,因此,我们提出了近似去重方法,基于BF的TBF和TIBF。根据RFID数据中重复的定义是和检测时间有关的,我们用时间信息的整数代替了BF中的bit,为了降低错误率,TIBF用了时间间隔。最后,实验结果表明,新提出的算法去重的错误率更低。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值