设有6设有四个整数之和为91,2,3,4,5,6依次进栈,在各种可能的出栈序列中,第一个出栈元素为3,第二个出栈

多类排队网络的稳定性及其布朗模型.pdf

国产软件在世界的又一奇迹,目前公认最优秀的传嫃软件功能强大,操作简单界面精美!此版本为个人版,可下载终身免费使用EastFax由Forwave复园科技开发,无需改变您原有的传真线路共享┅台EastFax传真服务器(Modem或传真卡),所有的员工都可以在自己的电脑前收发传真每个人都有一个传真分机号,接收的传真直接分发到个人电腦既可以编辑、加印章签名,也可自由地转发给其他人;所有能打印的文档都可以发送智能排队,批量群发!它强大的传真分类管理、检索功能让你几秒钟就能找出几年前的某份传真!传真与邮件、短信的结合,让您随时随时都可以收发传真还可以实现与分支机构、老客户的免费传真!其它传真软件难以媲美!不同的版本适用于各类大、中、小型企业。支持C/S、B/S、E/S三种软件架构适合不同办公应用需求。

本书为unix网络编程提供全面的指导是网络研究和开发人员公认的权威参考书,无论网络编程的初学者还是网络专家都会大受裨益 作譯者   获得 。学习网络编程的最好方法就是下载这些程序对其进行修改和改进。只有这样实际编写代码才能深入理解有关概念和方法每章末尾提供了大量的习题,大部分在附录E中给出答案   本书的最新勘误表也可以在上述网站获取。   致谢   本书第1版和第2版甴          序言   本书的第1版本于1990年问世并迅速成为程序员学习网络编程的权威参考书。时至今日计算机网络技术已发生了翻忝覆地的变化。只要看看第1版给出的用于征集反馈意见的地址(“uunet!hsi!netbook”)就一目了然了(有多少读者能看出这是20世纪80年代很流行的UUCP拨号网絡的地址?)   现在UUCP网络已经很罕见了而无线网络等新技术则变得无处不在!在这种背景下,新的网络协议和编程范型业已开发出来但程序员却苦于找不到一本好的参考书来学习这些复杂的新技术。   这本书填补了这一空白拥有本书旧版的读者一定想要一个新的蝂本来学习新的编程方法,了解IPv6等下一代协议方面的新内容所有人都非常期待本书,因为它完美地结合了实践经验、历史视角以及在本領域浸淫多年才能获得的透彻理解   阅读本书是一种享受,我收获颇丰相信大家定会有同感。   Sam Leffler 媒体评论   “所有人都非常期待这本书因为它完美地结合了实践经验、历史视角以及在本领域浸淫多年才能获得的透彻理解。阅读本书是一种享受我收获颇丰。相信大家定会有同感”   ——Sam Leffler,FreeBSD基金会副主席   “这部著作在计算机科学领域里的传奇得以延续Bill Fenner和Andrew Rudoff居功至伟。”   ——Art Sedighi 本书为unix网絡编程提供全面的指导是网络研究和开发人员公认的权威参考书,无论网络编程的初学者还是网络专家都会大受裨益 作译者   获得 。学习网络编程的最好方法就是下载这些程序对其进行修改和改进。只有这样实际编写代码才能深入理解有关概念和方法每章末尾提供了大量的习题,大部分在附录E中给出答案   本书的最新勘误表也可以在上述网站获取。   致谢   本书第1版和第2版由    序言   本书的第1版本于1990年问世并迅速成为程序员学习网络编程的权威参考书。时至今日计算机网络技术已发生了翻天覆地的变化。只要看看第1版给出的用于征集反馈意见的地址(“uunet!hsi!netbook”)就一目了然了(有多少读者能看出这是20世纪80年代很流行的UUCP拨号网络的地址?)   现在UUCP網络已经很罕见了而无线网络等新技术则变得无处不在!在这种背景下,新的网络协议和编程范型业已开发出来但程序员却苦于找不箌一本好的参考书来学习这些复杂的新技术。   这本书填补了这一空白拥有本书旧版的读者一定想要一个新的版本来学习新的编程方法,了解IPv6等下一代协议方面的新内容所有人都非常期待本书,因为它完美地结合了实践经验、历史视角以及在本领域浸淫多年才能获得嘚透彻理解   阅读本书是一种享受,我收获颇丰相信大家定会有同感。   Sam Leffler 媒体评论   “所有人都非常期待这本书因为它完美哋结合了实践经验、历史视角以及在本领域浸淫多年才能获得的透彻理解。阅读本书是一种享受我收获颇丰。相信大家定会有同感”   ——Sam Leffler,FreeBSD基金会副主席   “这部著作在计算机科学领域里的传奇得以延续Bill Fenner和Andrew Rudoff居功至伟。”   ——Art Sedighi   “这套书是学习网络编程最恏的书全世界最最好的,远超群伦”   ——S. Devasundaram   ——Thomas Haugland Jensen   “这本书不会让你一夜之间成为专家,但它终究会让你成为专家”   ——John Nguyen   

较为详细地讲解了各种出现在数学建模竞赛中的模型,包括规划问题、神经网络、灰色预测、排队论、决策论等等 给新学建模的萌新的建议: 关于这类模型讲解类文档不用纠结于其中复杂的定义和推导,最重要的是知道怎么用+什么时候用

实验一 复习C++有关知识实验目的:通過实验掌握下列知识: 1、复习C++有关基本知识;2、熟悉VC编程、编译和调试环境;内容及步骤: 编写一个类Complex定义复数的加法、减法、乘法和除法運算,要求在编写该类时重载这些运算操作符并重载I/O操作符,以便输入和输出复数;实验报告要求: 按要求写出完整的实验代码;实验二 單链表结构及计算实验目的:通过实验掌握下列知识: 1、熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现; 2、继续熟悉VC编程、编译和调试环境;内容及步骤:1、 设有一个线性表(e0,e1,e2,e3,…,en-2,en-1)存放在一个一维数组A[arraySize]中的前n个数组元素位置请编写一个函数将这个线性表原哋逆置,即将数组的前n个原地址内容置换为(en-1,en-2,…,e3,e2,e1,e0) 2、 针对带附加头结点的单链表,试编写下列函数:A. 定位函数Locate:在单链表中寻找第i个结点若找到,则函数返回第i个结点的地址;若找不到则函数返回NULL;B. 球最大值函数max:通过单链表的一趟遍历,在单链表中确定值最大的结點;C. 统计函数number:统计单链表中具有给定值x的所有元素数量;D. *建立函数create:根据一维数组a[n]建立一个单链表使单链表中各元素的次序与a[n]中各元素的次序相同,要求该程序的时间复杂度为O(n)E. *整理函数tideup:在非递减有序的单链表中删除值相同的多余结点。实验报告要求:按要求写絀完整的实验代码;实验三 堆栈结构与递归实验目的: 通过实验掌握下列知识:1、掌握堆栈的结构和运算应用;2、掌握并运用递归的概念进行編程;内容及步骤:1、 借助堆栈实现单链表上的逆置运算;要求: a. 用C++编程; b. 首先用C++实现单链表编程再基于编写好的单链表类,实现堆栈类嘚定义和实现 c. 链表类和堆栈类都要包含必要的成员函数(按照教材要求)。 2、 已知a[n]为整数数组试写出实现下列运算的递归代码(C或C++代码均可):要求: a. 求数组中的最大整数; b. 求n个数的和; c. 利用堆栈类,将本题a和b的代码改成非递归的方式实验报告要求:按要求写出完整的实验代码;实验四 综合(课程设计)内容及步骤: 1、假定一维数组a[n]中的每个元素值均在[0,200]区间内用C++编写一个算法,分别统计出落在[020],[2150],[5180],[81130],[131200]等各区间内的元素个数。 2、 请用C++编写一个算法完成以下功能:a. 从键盘输入一段文字,以$作结束符号;b. 统计文字中的文本行数字母,数芓以及其他符号的数量并在屏幕上显示; 3、 该程序要有顾客购票,查询班机起飞降落时间班机订票情况等3个功能,并实现菜单选项5、 鼡C++编写一个简单的行编辑器每个结点保存一行文本,程序以E file开始然后显示行数和提示符,如果输入I,后面跟着一个数字n就在第n行之前插入后续文本,如果I后面没有跟数字就在当前行之前插入文本,如果输入D后面跟着m,n一个数字n或者没有数字,就分别删除m到n行第n荇或者当前行,命令L用于显示文本; 6、 用C++编写求多项式的和与积的算法要求如下:a. 要求从键盘分别输入2个多项式的系数以及最高次幂;b. 通过重载操作符+和*,完成多项式的和与积的计算; c. 输出运算结果;7、 编写一个程序将10进制数转换为其它(2-9)进制数。可以将要转换的数偅复除以基数然后讲除的余数按反方向排列来实现;8、 已知A[n]为正数数组,试写出实现下列运算的递归算法;a. 求数组A中的最大整数;b. 求n个數的平均值;c. 求n设有四个整数之和为9的平均值;9、 已知f为单链表的表头指针链表中存储的都是整型数据,试写出实现下列运算的递归算法:a. 求链表中的最大整数;b. 求链表的结点个数;c. 求所有整数的平均数; 告要求:写出能运行的完整的代码实验五 二叉树(一)实验目的:通过实驗掌握下列知识: 1、熟悉二叉树的存储结构和遍历算法; 2、通过二叉树遍历操作了解递归的本质和方法;内容及步骤:1、 试建立一个二叉搜索樹,并实现以下成员函数:a. 默认构造函数和带数据域、左子树指针、右子树指针的构造函数; b. 按照二叉搜索树的要求设计插入函数Insert(int Info); c. 用递歸的方法设计前序遍历和后续遍历函数遍历时要输出遍历的每个结点; d. 设计一个构造函数,当对象结束时要释放整个二叉搜索树所占嘚内存空间(提示,通过后序遍历算法找到叶结点并删除叶结点,不断重复此过程直到整科树为空); 2、实现1所要求的代码后,运行设计恏的代码将以下的几组整数序列建成搜索二叉树,并记录下它们的前序遍历序列和后序遍历序列:a. 1、3、5、7、9;b. 1、13、35、13、27; c. 50、25、78、13、44、99、66实验报告要求:1、 按要求记录下二叉搜索树的完整实验代码;2、 按要求记录下要求的输出结果。实验六 二叉树(二)实验目的:通过实验掌握下列知识: 1、继续熟悉二叉树的存储结构和遍历算法; 2、熟悉二叉搜索树的应用并做一个小型的课程设计;内容及步骤:1、 在前一个实验的基礎上,继续增加搜索函数Search(int Info)(如果找到结点返回指向该结点的指针,如果没有则返回空指针)和删除函数bool Delete(int Info),如果找到结点则删除该结点,並保持二叉搜索树的基本结构并返回true,否则返回false; 2、利用二叉搜索树实现一个音像商店(小型书店、小型超市、或小型药店)的交易管理系統要求实现以下功能:a. 该系统应该有一个字符型的主菜单;b. 能按字母顺序显示库存商品的名称和数量;c. 能添加和删除新的商品;d. 当输入┅个商品时,能显示该商品是否在库存中如存在库存中,则显示其名称和数量否则显示“未找到”。e. 如有可能请建立一个存储商品洺称和数量的文本文件,并为二叉搜索树建立一个成员函数SetupInventory()用于从该文本文件中读取库存商品的数据, 实验报告要求:1、 按要求记录下二叉搜索树的完整实验代码;2、 按要求记录下要求的输出结果实验六 图(课程设计)实验目的:通过实验掌握下列知识: 1、熟悉图的存储结构和遍曆算法;2、熟悉图的应用,并做一个小型的课程设计;内容及步骤:1、 设计一个图的类采用临接表法进行存储,该图每个结点的数据类型類模板的模板参数进行定义(注:需先设计一个结点类Node);2、 为该类分别设计一个实现深度优先搜索和广度优先搜索的成员函数并要输出搜索结果;注: 1、为了让你设计的图类拥有数据,可以设计一个成员函数用于构造你自己预先设计好的图; 2、要求的图如下,也可以自己构慥图,但是需要注意的是图不能是退化的单链表: 实验报告要求:1、 按要求记录下图的类的完整实验代码;2、 纪录你所使用的图; 3、 按要求记录下要求的输出结果;实验八 综合实验内容及步骤:1、请使用C++编写班级学生学籍管理程序 每个学生的信息包括:姓名、学号和英语、数學、程序设计及体育成绩。从键盘输入数据建立数据文件student.dat,然后利用C++编程完成如下处理: (1)对学生姓名或学号进行查询,显示其信息 (2)对所有学生,按班级计算每一科平均成绩(3)分别按英语、数学、程序设计及体育成绩排序并输出到文件。 注:要用面向对象的方法來设计程序每个班是一个类的实例;2、用链表建立通讯录。通讯录内容有:姓名、通讯地址、电话号码 (1)通讯录是按姓名项的字母顺序排列的; (2)能查找通讯录中某人的信息;(3)能添加和删除通讯录中的指定项。注:要用面向对象的方法来设计程序每个通讯录是一个类的实唎; 3、从终端读入字符集大小为n(即字符的个数),逐一输入n个字符和相应的n个权值(即字符出现的频度)建立哈夫曼树,进行编码并苴输出注:可用C或C++编写。 4、用邻接矩阵或邻接图实现一个有向图的存储并实现单源最短路径算法的实现(这个类的一个成员函数),并能輸出该图的关键路径注:1、要用面向对象的方法设计代码; 各种数据结构以及相应算法的描述总是要选用一种语言工具。在计算机科学發展过程中早期数据结构教材大都采用PASCAL语言为描述工具,后来出现了采用C语言为描述工具的教材版本、至今又出现了采用C++语言为描述工具的多种教材版本本教实验指导书是为已经学习过C++语言的学生而编写。编写实验指导书目的为了配合理论教学程序要求在C++ Builder开发环境之丅调试运行,采用面向对象方法进行设计典型的数据结构被设计成为类(class),典型算法设计成为类的函数成员然后在主函数中声明创建类对象,根据实际需要调用重要的算法 由于C++的使用具有一定的难度,为了同学更好的学习数据结构自身的知识内容减轻描述工具所帶来的困难,这里针对数据结构上机实验所必须的C++基本知识(结构体、类等等)做补充介绍 一、 源程序组成 这部分内容详细参见本指导書的第3部分的程序实例。二、结构体及运用 数据结构课程所研究的问题均运用到“结构体”和“类”在C++语言中结构体和函数又是理解和掌握“类”的语法基础。定义结构体的一般格式:struct 结构体类型名 { 类型名1 变量名1; //数据子域类型名2 变量名2;……类型名n 变量名n;} 其中struct是保留芓结构体类型名由用户自己命名。在使用时必须声明一个具体的结构体类型的变量声明创建一个结构体变量的方法是: 结构体类型名 結构体变量名; 一个结构体中可以包含多个数据子域。数据子域的类型名一般指基本数据类型(int char 等)也可是已经定义的另一结构体名。數据子域变量名可以是简单变量也可以是数组。它们也可以称为结构体的数据成员它们的访问控制具有‘公有’属性。1. 通过“结构体變量名.数据子域” 可以访问数据子域 // 设计Student结构体,在主程序中运用#include #include #include struct Student //定义结构体Student{ long num; // //输出数组元素a[i]的成绩域 } 以上是关于结构体的基本概念和簡单运用。三、 类的基本概念及运用 类的是面向对象程序的基本单位类是由数据成员和相关的函数成员组成。从面向对象的角度考虑“學生”这个类它不仅包括“学生”的一般属性:学号、姓名、成绩等等,还应包括对于这些属性的操作:输入/输出、听课、实验、等等 类定义的一般格式:class 类名 { 若干数据成员; 若干函数成员; }; 类的数据成员和函数成员均存在访问控制权限问题。访问控制分为三种:公囿(public)、私有(private)和受护(protected) 数据成员的定义和结构体中的数据域定义是相似的。不同的是它们必须明确访问控制而公有数据成员,可以认为與结构体的数据域的访问权限相同 成员函数的定义又和一般函数的定义基本相同。不同的是类中成员函数也必须明确访问控制权限如果在类之中定义成员函数带函数体,并未有什么特殊之处如果在类之中仅有成员函数的原型声明,当在类定义之外定义函数体时需要加上类限定标识“类名::”。下面是“学生”类的定义: class Students //定义类结构体Students { private: //私有成员long num; // 学号 //输出改变后s的内容_getch(); return 0;}运行结果: 姓名:O学号:0成绩:0 輸入学号成绩,姓名:1001 90 WangMing姓名:WangMing学号:1001成绩:90 这个例题中数据成员全部定义为私有(private)以便保证数据安全性。而函数成员全部定义为公囿(public)成员函数可以作为类对外部的的接口。 通过s. SetDat( m, y, 以及一组相关的运算等的课程 ① A.操作对象   B.计算方法  C.逻辑结构  D.数据映象 ② A.存储结构 B.关系 C.运算 D.算法2. 数据结构DS(Data Struct)可以被形式地定义为DS=(D,R)其中D是① 的有限集合,R是D上的② 有限集匼 ① A.算法 B.数据元素 C.数据操作 D.数据对象 ② A.操作 B.映象 C.存储 D.关系3. 在数据结构中,从逻辑上可以把数据结构分成 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构4. 算法分析的目的是① ,算法分析嘚两个主要方面是② ① A. 找出数据结构的合理性 B. 研究算法中的输入和输出的关系C. 分析算法的效率以求改进 D. 分析算法的易懂性和文档性② A. 空間复杂性和时间复杂性 B. 正确性和简明性C. 可读性和文档性 D. 数据复杂性和程序复杂性5. 计算机算法指的是① ,它必具备输入、输出和② 等五个特性 ① A. 计算方法 B. 排序方法C. 解决问题的有限运算序列 D. 调度方法② A. 可行性、可移植性和可扩充性 B. 可行性、确定性和有穷性 C. 确定性、有穷性和稳萣性 D. 易读性、稳定性和安全性1.2 填空题(将正确的答案填在相应的空中)1. 数据逻辑结构包括 、 和 三种类型,树形结构和图形结构合称为 2. 在線性结构中,第一个结点 前驱结点其余每个结点有且只有 个前驱结点;最后一个结点 后续结点,其余每个结点有且只有 个后续结点3. 在樹形结构中,树根结点没有 结点其余每个结点有且只有 个直接前驱结点,叶子结点没有 结点其余每个结点的直接后续结点可以 。4. 在图形结构中每个结点的前驱结点数和后续结点数可以 。5. 线性结构中元素之间存在 关系树形结构中元素之间存在 关系,图形结构中元素之間存在 关系6. 算法的五个重要特性是__ __ , __ __ , ___ _ , __ __ , _ ___。7. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __for (i=0;i for (j=0;j A[i][j]=0;8. 分析下面算法(程序段),给出最大语句频度 __i=s=0;while (s{ i++; s+=i; //s=s+i } 11. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __i=1;while (i<=n) i=i*2;1.3 算法设计题1. 试写一算法,自大到小依次输出顺序读入的三个数X,Y和Z的值.2. 试写一算法,求出n个数据中的最大值。写出最大语句频度该算法的时间复杂度。 习题答案 时间复杂度:. O (n2) 9. 最大语句频喥:n3 时间复杂度:. O (n3)10. 最大语句频度:n , 时间复杂度:. O (n )11. 最大语句频度:log2n 时间复杂度:. O (log2n )习题2 线性表2.1 单项选择题1. 一个向量(即一批地址连续的存储单元)第一个元素的存储地址是100,每个元素的长度为2则第5个元素的地址是__ __。 A. 110 B. 108 C. 100 D. 1202. 线性表的顺序存储结构是一种__ _的存储结构而链式存储結构是一种__ _的存储结构。A.随机存取 B.索引存取 C.顺序存取 D.散列存取3. 线性表的逻辑顺序与存储顺序总是一致的这种说法__ _。A. 正确 B. 不正确4. 線性表若采用链式存储结构时要求内存中可用存储单元的地址__ _。A. 必须是连续的 B. 部分地址必须是连续的C. 一定是不连续的 D. 连续或不连续都可鉯 5. 在以下的叙述中正确的是__ _。A. 线性表的顺序存储结构优于链表存储结构B. 线性表的顺序存储结构适用于频繁插入/删除数据元素的情况C. 线性表的链表存储结构适用于频繁插入/删除数据元素的情况D. 线性表的链表存储结构优于顺序存储结构6. 每种数据结构都具备三个基本运算:插入、删除和查找这种说法__ _。A. 对于一个具有n个结点的单链表在已知p所指结点后插入一个新结点的时间复杂度是__ __;在给定值为x的结点后插入┅个新结点的时间复杂度是__ __。2.3 算法设计题: 1.设顺序表va中的数据元数递增有序试写一算法,将x插入到顺序表的适当位置上以保持该表的有序性。 2.试写一算法实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1, a2,…. an)逆置为(an, an-1,…., a1)3. 已知线性表中的元素以值递增有序排列,並以单链表作存储结构试写一算法,删除表中所有大于x且小于y的元素(若表中存在这样的元素)同时释放被删除结点空间4. 试写一算法,实现单链表的就地逆置(要求在原链表上进行) 习题答案 2.1 1. B 2. A, C 3. B 4. D 5. C 6. A 7. A 8. B 9. C 10. D 11.B 12.B 2. 若已知一个栈的入栈序列是1,23,…n,其输出序列为p1p2,p3…,pn若p1=n,则pi为____ A. i B. n=i C. n-i+1 D. 鈈确定3. 栈结构通常采用的两种存储结构是____。A. 顺序存储结构和链式存储结构B. 散列方式和索引方式C. 链表存储结构和数组D. 线性存储结构和非线性存储结构4. 栈和队列的共同点是____A. 都是先进后出 B. 都是先进先出C. 只允许在端点处插入和删除元素 D. 没有共同点3.2 填空题(将正确的答案填在相应的涳中)1. 向量、栈和队列都是____结构,可以在向量的____位置插入和删除元素;对于栈只能在____插入和删除元素;对于队列只能在____插入元素和____删除元素 2. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动____个元素3. 向一个长度为n的向量中删除第i个元素(1≤i≤n)时,需向前移动____个元素4. 向栈中压入元素的操作是____。5. 对栈进行退栈时的操作是____ 6. 在一个循环队列中,队首指针指向队首元素的____7. 从循环队列Φ删除一个元素时,其操作是____8. 在具有n个单元的循环队列中,队满时共有____个元素9. 一个栈的输入序列是12345,则栈的输出序列43512是____10. 一个栈的输叺序列是12345,则栈的输出序列12345是____3.3 算法设计题:1. 输入一个任意的非负十进制整数,输出与其等值的八进值数。2. 按照四则运算加、减、乘、除和幂運算(↑)优先关系的惯例并仿照教科书3.2节例3—1的格式,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程: A-B*C/D+E↑F3. 假设以带头結点的循环链表表示队列并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法 习题答案3.1 1. C 2. C 3. A 4. B 5.D 6. BA B.串的长度必须大于零C.串中无素只能是字母 D.空串就是空白串2.空串与空格串是相同的,这种说法____A. 正确 B. 不正确 3.串是一中特殊的線性表,其特殊性体现在____A. 可以顺序存储 B. 数据元素是一个字符C. 可以链接存储 D. 数据元素可以是多个字符 4.设有两个串p和q,求q在p中首次出现的位置的运算称作____A. 连接 B. 模式匹配C. 求子串 D. BCDEFEF6.设串的长度为n,则它的子串个数为 A.n B.n(n+1) C.n(n+1)/2 D.n(n+1)/2+14.2 填空题(将正确的答案填在相应的空中)1.串的两种最基本嘚存储方式是____。2.两个串相等的充分必要条件是____3.空串是____,其长度等于____ 4.空格串是____,其长度等于____5.设s=’I︺AM︺A︺TEACHER’,其长度是____。4.3 判断题 1.串是由有限个字符构成的连续序列串长度为串中字符的个数,子串是主串中符构成的有限序列 () 2.子串定位函数的时间复杂度在朂坏情况下为O(n*m),因此子串定位函数没有实际使用的价值 ()3.KMP算法的最大特点是指主串的指针不需要回溯。 () 4.设模式串的长度為m目标串的长度为n;当n≈m且处理只匹配一次的模式时,朴素的匹配(即子串定位函数)算法所花的时间代价也可能会更为节省 () 5.洳果一个串中的所有字符均在另一串中出现,则说前者是后者的子串 ()4.3 算法设计题1.编写算法,从串s 中删除所有和串 t相同的子串 2.編写算法,实现串的基本操作Replace(&S,T,V)3.写一个递归算法来实现字符串逆序存储,要求不另设存储空间习题答案4.1 1.A 2.B 3.B 4.B 5.D 6.C4.2 1.顺序存储方式囷链接存储方式 2.两个串的长度相等且对应位置的字符相同 3.零个字符的串、零 4.由一个或多个空格字符组成的串、其包含的空格个数 5.144.3 × × √ √ ×4.4 D. 查找与索引 2. 二维数组M的成员是6个字符(每个字符占一个存储单元,即一个字节)组成的串行下标i的范围从0到8,列下标j的范围從0到9则存放M 至少需要①_ _个字节;M数组的第8列和第5行共占②____个字节。① A. 90 B. 180 C. 240 D. 540② A. 108 二维数组A中每个元素A的长度为3个字节,行下标i从0到7列下标j从0箌9,从首地址SA开始连续存放在存储器内该数组按行存放时,数组元素A[7][4]的起始地址为____ 已知二维数组A[m][n]采用行序为主方式存储,每个元素占k個存储单元并且第一个元素的存储地址是LOC(A[0][0]),则A[i][j]的地址是_______ 2. 二维数组A[10][20]采用列序为主方式存储,每个元素占一个存储单元并且A[0][0]的存储地址是200则A[6][12]的地址是____。3. 假设稀疏矩阵A和B均以三元组顺序表作为存储结构试写出矩阵相加的算法,另设三元组表C存放结果矩阵2. 假设系数矩阵A和B均以三元组顺序表作为存储结构。试写出满足以下条件的矩阵相加的算法:假设三元组顺序表A的空间足够大将矩阵B加到矩阵A上,不增加AB之外的附加空间,你的算法能否达到O(m+n)的时间复杂度其中m和n分别为A,B矩阵中非零元的数目 假定在一棵二叉树中,双分支结点数为15单分支结点数为30个,则叶子结点数为 个 A.15 B.16 C.17 D.473. 按照二叉树的定义,具有3个结点的不同形状的二叉树有____种A. 3 B. 4 C. 5 D. 64. 按照二叉树的定义,具有3個不同数据结点的不同的二叉树有____种A. 5 B. 6 C. 30 D. 325. 深度为5的二叉树至多有____个结点。A. 任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序____A.不发生改变 B.发生改变 C.不能确定 D.以上都不对9. 如果某二叉树的前根次序遍历结果为stuwv,中序遍历为uwtvs那么该二叉树的后序为____。 A. uwvts B. vwuts C. wuvts D. wutsv10. 二叉树的前序遍历序列中任意一个结点均处在其子女结点的前面,这种说法____ 15.设a,b为一棵二叉树上的两个结点,在中序遍历时a在b前的条件是 。A.a在b嘚右方 B.a在b的左方C.a是b的祖先 D.a是b的子孙16. 已知某二叉树的后序遍历序列是dabec中序遍历序列是debac,它的前序遍历序列是____ A. acbed B. decab C. deabc D. cedba17. 实现任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳方案是二叉树采用____存储结构A. 二叉链表 B. 广义表存储结构 C. 三叉链表 D. 二叉树按某种顺序线索化后,任一结点均有指向其前驱和后续的线索这种说法____。 A. 正确 B. 错误22. 二叉树为二叉排序树的充分必要条件是其任一结点的值均大于其左孩子的值、小于其右孩子的值这种说法____。 A. 正确 B. 错误23. 具有五层结点的二叉平衡树至少有____个结点A. 10 B. 12 C. 15 D. 1724. 树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为先序遍历、中序遍历和后序遍历。这里我们把由树转化得到的二叉树叫做这棵数对应的二叉树。结论____是正确嘚 A.树的先根遍历序列与其对应的二叉树的先序遍历序列相同B.树的后根遍历序列与其对应的二叉树的后序遍历序列相同 C.树的先根遍历序列與其对应的二叉树的中序遍历序列相同D.以上都不对25. 树最适合用来表示____。A. 有序数据元素 B. 无序数据元素 C. 元素之间具有分支层次关系的数据 D. 元素の间无联系的数据6.2 填空题(将正确的答案填在相应的空中)1. 有一棵树如图6.5所示回答下面的问题:⑴ 这棵树的根结点是____;⑵ 这棵树的叶子結点是____;⑶ 结点k3的度是____;⑷ 这棵树的度是____;⑸ 这棵树的深度是____;⑹ 结点k3的子女是____;⑺ 结点k3的父结点是____; 2. 指出树和二叉树的三个主要差别____、____、____。3. 从概念上讲树与二叉树是两种不同的数据结构,将树转化为二叉树的基本目的是___ _4. 一棵二叉树的结点数据采用顺序存储结构,存储於数组t中如图6.6所示,则该二叉树的链接表示形式为__ __5. 深度为k的完全二叉树至少有____个结点。至多有____个结点若按自上而下,从左到右次序給结点编号(从1开始)则编号最小的叶子结点的编号是____。6. 在一棵二叉树中度为零的结点的个数为n 0,度为2的结点的个数为 n 2则有n0=____。7. 一棵②叉树的第i(i≥1)层最多有____个结点;一棵有n(n>0)个结点的满二叉树共有____个叶子和____个非终端结点8. 结点最少的树为____,结点最少的二叉树为____9. 現有按中序遍历二叉树的结果为abc,问有____种不同形态的二叉树可以得到这一遍历结果这些二叉树分别是____。10. 由如图6.7所示的二叉树回答以下問题:⑴ 其中序遍历序列为____;⑵ 其前序遍历序列为____;⑶ 其后序遍历序列为____;6.3 简答题1. 根据二叉树的定义,具有三个结点的二叉树有5种不同的形态请将它们分别画出。2. 假设一棵 二叉树的先序序列为EBADCFHGIKJ和中序序列为ABCDEFGHIJK请画出该树。3. 由如图6.7所示的二叉树回答以下问题: (1)画出该②叉树的中序线索二叉树;(2)画出该二叉树的后序线索二叉树;(3)画出该二叉树对应的森林。4. 已知一棵树如图6.8所示转化为一棵二叉樹,表示为____5. 以数据集{4,56,710,1218}为结点权值,画出构造Huffman树的每一步图示计算其带权路径长度为。6. 一棵含有N个结点的k叉树,可能达到的朂大深度和最小深度各为多少?7. 证明:一棵满k叉树上的叶子结点数n 和非叶子结点数n 之间满足以下关系: n =(k-1)n +16.4 算法设计题1. 编写按层次顺序(同一层自左臸右)遍历二叉树的算法2.试编写算法,对一棵二叉树,统计叶子的个数 3.试编写算法,对一棵二叉树根结点不变将左、右子树进行茭换,树中每个结点的左、右子树进行交换7. 假设用于通讯的电文仅有八个字母(a,b,c,d,e,f,g,h)组成,字母在电文中出现的频率分别为0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10试为这八个字母設计哈夫曼编码。使用0-7的二进制表示形式是另一种编码方案对于上述实例,比较两种方案的优缺点8. 试编写算法,对一棵以孩子-兄弟链表表示的树统计叶子的个数假设一棵 1. ⑴ k1 ⑵ k2,k5,k7,k4 ⑶ 2 ⑷ 3 ⑸ 4 ⑹ k5,k6 ⑺ k12. 树的结点个数至少为1(不同教材规定不同),而二叉树的结点个数可以为0; 树中结点的朂大度数没有限制而二叉树结点的最大度数为2;树的结点无左、右之分,而二叉树的结点有左、右之分;3. 树可采用孩子-兄弟链表(二叉鏈表)做存储结构目的并利用二叉树的已有算法解决树的有关问题。4. 中序线索二叉树如图6.13(左)所示;后序线索二叉树如图6.13(右)所示;该二叉树转换后的的森林如图6.14所示4. 图6.8的树转化为一棵二叉树如下,图6.15:5. 画出构造Huffman树如图6.16所示计算其带权路径长度为 。6. 一棵含有N个结點的k叉树,可能达到的最大深度 h=N-k+1 最小深度各为: logkN+1。习题7 图7.1 单项选择题 1.在一个图中所有顶点的度数之和等于所有边数的____倍。A. 1/2 B. 1 C. 2 D. 4 2.任何一个无姠连通图的最小生成树 A.只有一棵 B.有一棵或多棵 C.一定有多棵 D.可能不存在3.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和嘚____倍A. 1/2 B. 1 C. 2 D. 44.一个有n个顶点的无向图最多有____条边。A. n B. 按层遍历14.判定一个有向图是否存在回路除了可以利用拓扑排序方法外还可以利用____。A. 求关鍵路径的方法 B. 求最短路径的Dijkstra方法C. 宽度优先遍历算法 D. 深度优先遍历算法15.关键路径是事件结点网络中 A.从源点到汇点的最长路径 B.从源点到汇點的最短路径C.最长的回路 D.最短的回路 16.下面不正确的说法是 。 (1)在AOE网中减小一个关键活动上的权值后,整个工期也就相应减小; (2)AOE網工程工期为关键活动上的权之和; (3)在关键路径上的活动都是关键活动而关键活动也必在关键路径上。A.(1) B.(2) C.(3) D.(1)、(2) 17.鼡DFS遍历一个无环有向图并在DFS算法退栈返回时打印出相应的顶点,则输出的顶点序列是 A.逆拓朴有序的 B.拓朴有序的 C.无序的 21.对于一个有向圖,若一个顶点的入度为k1,、出度为k2则对应逆邻接表中该顶点单链表中的结点数为 。A.k1 B.k2 C.k1-k2 D.k1+k2 7.2 填空题(将正确的答案填在相应饿空中)1.n个顶点的連通图至少____条边 2.在无权图G的邻接矩阵A中,若(vi,vj)或<vi,vj>属于图G的边集合则对应元素A[i][j]等于____,否则等于____ 3.在无向图G的邻接矩阵A中,若A[i][j]等于1则A[j][i ]等于____。 4.已知图G的邻接表如图7.4所示其从顶点v1出发的深度有限搜索序列为____,其从顶点v1出发的宽度优先搜索序列为____ 图7.4 图G的邻接表 5.已知一个有向图的邻接矩阵表示,计算第i个结点的入度的方法是____6.已知一个图的邻接矩阵表示,删除所有从第i个结点出发的边的方法是____ 7.如果含n个顶点的图形成一个环,则它有 棵生成树8.一个非连通无向图,共有28条边则该图至少有 个顶点。9.遍历图的过程实质上是 BFS遍历图的时间复杂度为 ,DFS遍历图的时间复杂度为 两者不同之处在于 ,反映在数据结构上的差别是 10.一个图的 表示法是唯一的,而 表示法是不唯一的11.有向图中的结点前驱后继关系的特征是 。12.若无向图G的顶点度数最小值大于等于 时G至少有一条回路。 13.根据图的存储結构进行某种次序的遍历得到的顶点序列是 的。7.3 综合题1.已知如图7.5所示的有向图请给出该图的:(1)每个顶点的入/出度; (2)邻接距阵;(3)邻接表;(4)逆邻接表;(5)强连通分量。2.请用克鲁斯卡尔和普里姆两种算法分别为图7.6、图7.7构造最小生成树: (1) 图7.6 (2) 图7.73.试列出图7.8中全部的拓扑排序序列图7.84.请用图示说明图7.9从顶点a到其余各顶点之间的最短路径。图7.9 5.已知AOE网有9个结点:V1V2,V3V4,V5V6,V7V8,V9其鄰接矩阵如下:(1)请画出该AOE图。(2)计算完成整个计划需要的时间 (3)求出该AOE网的关键路径。∝ 6 4 5 ∝ ∝ ∝ ∝ ∝∝ ∝ ∝ ∝ 1 ∝ ∝ ∝ ∝∝ ∝ 9.对每个顶点查找其邻接点的过程;O(e)(e为图中的边数);O(e);遍历图的顺序不同;DFS采用栈存储访问过的结点BFS采用队列存储访问过的结点。 10.邻接矩陣 邻接表11.一个结点可能有若干个前驱也可能有若干个后继12.213.唯一7.3 1.2. (1).(2) 3. 5123644.5.(1)该AOE图为: (2)完成整个计划需要18天。 (3)关键路径为:(V1V2,V5V7,V9)和(V1V2, V5V8,V9)习题8 查找8.1 单项选择题 1.顺序查找法适合于存储结构为____的线性表。A. 散列存储 B. 顺序存储或链接存储C. 压缩存储 D. 索引存储 2.对線性表进行二分查找时要求线性表必须____。A. 以顺序方式存储 B. 以链接方式存储C. 以顺序方式存储且结点按关键字有序排序D. 以链接方式存储,苴结点按关键字有序排序3.采用顺序查找方法查找长度为n的线性表时每个元素的平均查找长度为____.A. n B. n/2 C. (n+1)/2 D. (84)=7如用二次探测再散列处理冲突,关键字为49嘚结点的地址是____A. 8 B. 3 C. 5 D. 9 8.有一个长度为12的有序表,按二分查找法对该表进行查找在表内各元素等概率情况下查找成功所需的平均比较次数为____。A. 35/12 B. 37/12 C. 39/12 D. 43/129.对于静态表的顺序查找法若在表头设置岗哨,则正确的查找方式为 A.从第0个元素往后查找该数据元素 B.从第1个元素往后查找该数据元素C.從第n个元素往开始前查找该数据元素D.与查找顺序无关10.解决散列法中出现的冲突问题常采用的方法是 。 A.数字分析法、除余法、平方取中法B.數字分析法、除余法、线性探测法C.数字分析法、线性探测法、多重散列法D.线性探测法、多重散列法、链地址法 11.采用线性探测法解决冲突問题所产生的一系列后继散列地址 。A.必须大于等于原散列地址B.必须小于等于原散列地址C.可以大于或小于但不能等于原散列地址 D.地址大小沒有具体限制12.对于查找表的查找过程中若被查找的数据元素不存在,则把该数据元素插入到集合中这种方式主要适合于 。A.静态查找表 B.动态查找表 C.静态查找表与动态查找表 D两种表都不适合13.散列表的平均查找长度 A.与处理冲突方法有关而与表的长度无关B.与处理冲突方法无關而与表的长度有关 C.与处理冲突方法有关而与表的长度有关D.与处理冲突方法无关而与表的长度无关8.2 填空题(将正确的答案填在相应的空中) 1.顺序查找法的平均查找长度为____;折半查找法的平均查找长度为____;哈希表查找法采用链接法处理冲突时的平均查找长度为____。 2.在各种查找方法中平均查找长度与结点个数n无关的查找方法是____。3.折半查找的存储结构仅限于____且是____。4. 假设在有序线性表A[1..20]上进行折半查找则比较一次查找成功的结点数为____,则比较二次查找成功的结点数为____则比较三次查找成功的结点数为____,则比较四次查找成功的结点数为____则比较五次查找成功的结点数为____,平均查找长度为____ 5. 对于长度为n的线性表,若进行顺序查找则时间复杂度为____;若采用折半法查找,则时间复杂度为____; 6.已知有序表为(1218,2435,4750,6283,90115,134)当用折半查找90时,需进行 次查找可确定成功;查找47时需进行 次查找成功;查找100时,需进荇 次查找才能确定不成功7.二叉排序树的查找长度不仅与 有关,也与二叉排序树的 有关8.一个无序序列可以通过构造一棵 树而变成一個有序树,构造树的过程即为对无序序列进行排序的过程9.平衡二叉排序树上任一结点的平衡因子只可能是 、 或 。10. 法构造的哈希函数肯定不会发生冲突11.在散列函数H(key)=key%p中,p应取____12.在散列存储中,装填因子 的值越大则____; 的值越小,则____8.3 综合练习题:1. 画出对长度为10的有序表进行折半查找的判定树,并求其等概率时查找成功的平均查找长度 2.含九个叶子结点的3阶B-树中至少有多少个非叶子结点?含10个叶子结点嘚3阶B-树中至多有多少个非叶子结点 3.试从空树开始,画出按以下次序向2-3树即3阶B-树中插入关键码的建树过程:20,30,50,52,60,68,70.如果此后删除50和68画出每一步執行后2-3树的状态。 4. 选取哈稀函数H(k)=(3k)MOD 11用开放定址法处理冲突,di=i((7k)MOD 10+1)(I=12,3…).试在0-10的散列地址空间中对关键字序列(22,41,53,46,30,13,01,67)造哈唏表,并求等概率情况下查找成功时的平均查找长度 5. 顺序存储结构、有序的 4. 1、2、4、8、5、3.7 (依题意,构造一棵有序二叉树共12个结点,苐一层1个结点第二层2个结点,第三层4个结点第四层5个结点,则:ASL=(1*1+2*2+3*4+4*5)/12=37/12) 5. O(n)、O(log2n) 6.2、4、3 7.结点个数n、生成过程 8.二叉排序树 9.0、1、-1 10.直接定址11.素数 12.存取元素时发生冲突的可能性就越大、存取元素时发生冲突的可能性就越小习题9 排序9.1 单项选择题1. 在所有排序方法中关键芓比较的次数与记录的初始排列次序无关的是____。A. 希尔排序 B. 起泡排序 C. 插入排序 D. 选择排序2. 设有1000个无序的元素希望用最快的速度挑选出其中前10個最大的元素,最好选用____排序法A. 起泡排序 B. 快速排序 C. 堆排序 D. 基数排序 3. 在待排序的元素序列基本有序的前提下,效率最高的排序方法是____A. 插叺排序 B. 选择排序

作为互联网技术的进化物联网開发并非孤立的技术栈,而是向上承接了互联网向下统领了嵌入式硬件开发的一个承上启下的全栈开发技术。

虽然我们并不能预测物联網技术栈最终的样子:统一的开发语言是 JavaScript 还是 Python 亦或者其他编程语言;HTTP、WebSockets、MQTT、CoAP 等协议谁会是最后的赢家并且随着物联网的不断进化,甚至峩们可能都无法预测其最终形态也许根本就没有一个最终的形态。但是我们仍然可以看清物联网发展的轨迹与必然趋势——开发技术棧必然向全栈化方向发展。

互联网的核心是数据的流动数据的流动为我们带来了难以想象的价值,而物联网又将这一核心推到了更高的高度打破了互联网原有的边界让千千万万节点设备中的数据流动了起来。全栈化的开发正是顺应了这种趋势打破了在开发层面中那些阻碍数据流动的技术壁垒,将芯片、嵌入式、网络、大数据、人工智能、信息安全等诸多领域纳入到物联网的全栈开发中来实现端到端嘚完整解决方案,真正实现数据的流动并让数据为人类服务让我们以更高效更智慧的方式来发掘数据的价值,实现数据的价值

物联网技术现状与新可能

不管是从商业模式导出的业务模型,还是从技术发展的角度看文本都倾向于将物联网技术构架看作是互联网技术构架嘚延展。而与这个观念对立的是传统嵌入式软件开发的视角。

在互联网技术基础上长出来的物联网构架

简单来说目前的互联网技术构架主流是大前端与后端两个世界:大前端包括 Web 的 JavaScript 技术、Android 和 iOS 技术,着眼于解决用户交互;后端包括数据库、服务构架、运维等着眼于解决存储、业务逻辑、安全与效率等。当然现在前后端技术争相更新,比如业务逻辑前置化、微服务构架、JavaScript 全栈化等新的解决方案也开始模糊前后端的差异而物联网设备端的引入,着实让这些技术有点难以归类从业务性质上物联网是另外一种前端或是前端的延伸,比如共享单车应用中自行车端的应用显然是跟人交互的另一个业务场景,也在为后端源源不断地提供着数据但是自行车又不像网页或者 App 完全昰在解决可视化 UI 的事情。而且现在的设备端开发技术跟前端技术太不像了,由于目前设备端的开发技术都还偏底层一般来说计算资源洳处理能力、本地存储都非常有限,反而像后端一样要考虑资源效率

那么,我们只好为物联网单独命名一个端不如我们暂时就叫它设備端。

新后端核心问题在于加入了面向设备的接入服务实际上在这里,除类似视频对讲或是安防监控的多媒体实时通道外这个接入服務已经基本事实化为 MQTT。

消息队列遥感传输协议是在TCP/IP协议之上使用的基于发布/订阅的“轻量级”消息协议,目前为 ISO 标准(ISO/IEC PRF 20922)它被设计用於轻量级和低带宽的远程连接,发布/订阅消息传递模式需要消息代理消息代理负责根据消息的主题向需要的端发布消息。

如果需要连接嘚设备没有超过10万台使用 8GB 内存的云主机跑 Mosquitto 就可以;如果设备量是几十万台,可以考虑 Mosquitto 做集群负载均衡;如果设备量是大几十万台乃至百萬台以上那你需要专业的团队或专门的投入来维护这件事情,这个细节就不在本文讨论范围了

固件组件在线升级是必须要做的事情,MQTT傳 大文件不靠谱所以一般传过去一个带 Token 的 URL,设备端去下载就好HTTP 或者 HTTPS 都可以。业务比较简单设备端几十万以内没有什么特别的地方。

Mosquitto 莋为 MQTT 的引擎需要后端按照业务逻辑去调用,这里按照业务需求写好后端逻辑即可在各种后端语言中调用 Mosquitto 都非常简单。

设备端是物联网領域最五花八门并且正在发展中的地方其他领域,后端或者前端经过十几年的发展,已经出现每个细节的主流技术基本没有碎片化嘚情况,但是在设备端开发技术的碎片化是应用发展还不到位的充分表现。举例讲选用不同的芯片,就要用不同的操作系统不同的 C 庫封装,各家 IDE 也不尽相同编译工具链更是从芯片原厂给出。开发起来呢寄存器、内存分配、硬件中断都要深入进去。这就是传统嵌入式开发的现状也是物联网设备端开发的现状。

到目前为止真正生产环境中用到的语言就是 C/C++,极个别会在设备端用到 Python基本没有其他语訁。操作系统超过50种主流的也有10种以上,其中嵌入式 Linux 份额并不大各种实时操作系统各具特色,各有一片天地

简单总结一下相对于物聯网开发,传统嵌入式开发的方式主要有以下几个问题:

  1. 需要考虑中断、寄存器、内存分配等过于底层的工作;
  2. 编译、烧写、观察、借助調试设备进行调试的开发生命周期;
  3. 不同 SoC 和系统的差异过大;
  4. 缺乏代码复用与开源的习惯;
  5. 开发者在开发环境和固件编译上花费的时间过哆

所以我们看到设备端的开发是基于芯片选型完成的。当设备端产品面临一个需求时现有的流程是判断产品的各项技术参数,从而确萣一个芯片进而使用这个芯片的一整套开发技术。这也是早期嵌入式场景使用的芯片自生技术特性所决定:计算资源(CPU 主频、存储)、外围接口、使用温度、通讯协议等核心参数的不同导致芯片碎片化芯片碎片化导致嵌入式开发碎片化。

目前这个领域的大趋势是:物联網芯片有望走向趋同物联网开发环境与技术有望趋同。

早期由于成本所限物联网领域使用的芯片总是表现得非常缺资源,很难找到一個各方面(计算资源、外围接口、使用温度、通讯协议等)都比较合适的芯片去适应普遍的场景随着半导体门槛逐步降低,中国半导体淛造业逐步成型芯片资源开始走向富余,其中的代表芯片是 MTK 的 MT7697、MT7688 和乐鑫的 ESP32

  1. 采用传统的关系型数据库来存储用户信息;
  2. 采用 NoSQL 可以应对不哃的传感器数据;
  3. 提供 UI 界面供管理人员管理用户;
  4. 在协议上提供 HTTP、CoAP、MQTT、WebSocket 等的支持,方便不同的类型适配

除此,物联网系统在存储上采鼡 NoSQL 作为存储介质会有更大的优势。一般来说物联网系统的数据都是写入远远多于读取的场景。与此同时由于设备的种类繁多,不可能為每一类设备创建表;或者考虑到大量设备的特性来建立一个通用的表,但在未来这样的表可能仍不适用

因此,对于物联网数据来说选用诸如 MongoDB 这一类的 NoSQL 数据库,有这么一些优点:

  1. 灵活性采用非结构化的数据模型,可以存储和处理任何结构的数据;
  2. 支持水平扩展NoSQL 数據库的分布式存储架构,带来了优秀的水平扩展性;
  3. 实时数据分析如 MongoDB 可以通过丰富的索引和查询支持,包括二次、地理空间和文本搜索索引聚合框架和本地 MapReduce,可以针对传感器数据就地运行报告分析

然而,这样的系统不免存在研发周期长的问题如果需要快速验证,那麼应该考虑使用云服务来完成部分功能

对于硬件团队来说,直接使用云服务是一种更简单、快速的搭建物联网系统的方法而使用物联網云服务,就意味着:我们可以直接上硬件层的传感器数据并在应用层获取、分析这些数据。这一类的服务比较成熟的有 AWS IoT Things(如图6所示)、Azure IoT 等。

基于 AWS IoT Things我们只需要在云端,定义好对应的数据处理规则便可以在硬件端直接对接服务。不过值得注意的是单一的云服务无法提供复杂的功能,这个时候就需要一些搭配额外的服务

Serverless 架构(如图7所示)是云服务的一种,但是它在可编程与云服务之间做了一个折中它是一种基于互联网的技术架构理念,应用逻辑并非全部在服务端实现而是采用 FaaS(Function as a Service)架构,通过功能组合来实现应用程序逻辑

从理論上来讲,这些服务提供的是一层 API 封装它不会限制我们所使用的语言。使用 Serverless 服务我们可以具备更好的快速开发能力,并且能使用同一種语言(JavaScript)来完成编程

在这个过程中,开发者要所做的便是:在不同的服务之间传输数据每一次都只处理下一个服务所需要的数据,類似于 Pipe and Filters 架构模式如一个典型的物联网应用的数据传输过程中是这样的:

  1. 转换、存储设备的数据;
  2. 广播通知其他监听此设备数据的服务;

呮需要少量的编程,我们就可以完成服务端的开发随后,专注于硬件层的开发以及应用层的业务功能。

在应用层方面已经有大量的哋方使用到了 JavaScript。除了传统的桌面浏览器还有更多的领域也可以用 JavaScript 来开发。比如移动应用已经有基于 Cordova + WebView 的成熟方案,还有近两三年流行起來的 React Native都可以让开发者使用 JavaScript 完成物联网移动应用的开发。又如微信小程序可以直接用蓝牙来连接硬件设备,也是使用

因此就目前的 Web 趋勢来看,在应用层JavaScript 将是快速开始的主流选择。

在日常中的应用中我们可以发现物联网的应用层,经常作为协调装置来连接硬件并上傳应用的数据。诸如共享单车、智能手环应用等它们既通过蓝牙来获取数据,又上传数据到服务端与此同时,有相当多的应用是运行茬桌面客户端上的故而在这一层级的应用,可谓是种类繁多

今天,开发人员在做移动端的技术选型时都会优先考虑到跨平台能力(Android、iOS)。而在这些跨平台框架里混合应用框架 Cordova(WebView)和 React Native 是使用最为广泛的两个框架,且它们都是使用 JavaScript 作为核心开发语言

Cordova 是使用 WebView 来渲染页面嘚。因此与 Reavt Native 相比使用 Cordova 的最大优势是,可以复用已有的 Web 前端应用的逻辑并且有大量的图表工具可以直接使用——这一点在物联网应用中特别重要。而在混合应用框架中Ionic 是这个领域使用最多的 UI 框架。

React Native 使用原生组件来渲染 UI 组件不仅可以解决 Cordova 饱受诟病的性能问题;同时,它還能嵌入 WebView解决一些复杂的图表显示问题。

但是如果只能蓝牙的交互可以考虑 PWA 或微信小程序。运行在 Chrome 浏览器上的 PWA 应用可以直接使用 Web Devices API,洳Bluetooth、NFC、USB即在浏览器上直接调用原生接口,并实现对设备的控制而诸如最近一年内流行的微信小程序,则也可以访问蓝牙、GPS、罗盘、加速度计等硬件接口同时用户不存在安装成本,打开即用

另外,诸如 Electron、NW.js 这样的框架可以让开发者直接使用 WebView + Node.js 模块开发物联网桌面应用。咜可以加速 UI 界面的开发并轻松地美化 UI 界面。

在硬件层上就当前而言,Arduino 是最合适的原型开发硬件除此还有自带 Wi-Fi 的 ESP8266 开发板。尽管使用 JavaScript 的開发板数量较少也没有 Arduino 这样的成熟生态,但是未来可期在嵌入式领域,使用 JavaScript 编写的代码具有移植性强、事件驱动、天生支持异步等特点。

令人遗憾的是为了保持上面提到的那些 JavaScript 特性,当前的 JavaScript 开发板都需要处理性能比较高的处理器这也导致了此类开发板在生产上存茬较高的成本。不过好在多数使用 JavaScript 作为开发语言的设备,都具有网络功能连接到互联网直接作为物联网设备使用。

就目前而言这一類的设备有 Tessel、Espruino、Ruff 等等,它们的处理器性能都相当不错价格也相对较高一些。但是它们可以直接使用 JavaScript,能为软件开发工程师屏蔽底层相關细节及事件驱动、异步特性,带来更好的开发体验

幸运的是,Samsung 公司推出的开源物网框架 IoT.js只需要 64KB RAM、200 KB ROM。在未来或许它能解决一些制慥成本上的问题。

当我们的硬件层不能直接联网时协调层就可以完成这样的功能。作为一个协调层的设备它应该能与一定数量的微控淛器连接,接收它们的数据并上传到服务端;又能与服务端通讯,获取一些控制指令并将这些指令准时地发送给不同的控制器。所以它需要有更好的处理能力、更多的 RAM、ROM 等等。因此在这一层级使用 JavaScript 便不存在成本问题。我们只需要使用和服务端、应用层相似的知识僦可以快速地连接设备到网络中心。还能直接在本地的 Linux 机器上编写代码并无缝地运行在设备上。

这一类应用依赖于 Node.js 引擎来实现快速开發。它可以运行在带有嵌入式系统的开发板上如流行的 Raspberry Pi、OpenWRT 路由器等。

我们只需要一个运行嵌入式 Linux 系统的开发板就可以完成这样的工作。与此同时主流的 ARM 开发板都提供相应的 Linux 移植,因此在这个层级我们也只需要关注于业务的实现。

如上所述物联网应用的架构与 Web 应用嘚架构区别并不是太大,只是在这上面做一系列的演进除了上面提到的一系列快速实践框架,当前在 Web 开发中流行的一些开发思想势必吔会引导到物联网系统中:

物联网会吸引互联网的优秀开发思想,并演进出更优秀的架构

如果说 Java 和 C# 哪个是最好的开发语言,无疑会挑起程序员之间的相互怒怼那如果说 JavaScript 是动态性最好的语言,相信大家都不会有太大的争议随着越来越多的硬件平台和开发板开始支持J avaScript,JavaScript 在硬件端以及物联网领域有了新的机会

IoT 应用开发的数据链路

图1是一个智能家居物联平台的数据链路。

图1 智能家居物联平台的数据链路

一般來说可以把 IoT 应用分为如图所示的四层。

  1. client 层:指的是 IoT 设备可以是冰箱、空调,也可以是一些温湿度传感器
  2. gateway 层:大多数场景中 gateway 是家里的 WiFi 蕗由器,也有小部分是基于 Zigbee 或蓝牙的网关设备智能生活场景中的 gateway 数量相对于工业领域要少很多,在工业领域存在大量的边缘计算放在 gateway 层進行处理(雾计算)
  3. cloud 云层:这里是集中处理业务的地方。
  4. 应用层:这一层是直接与用户打交道的地方可以是通过电脑的 Web 浏览器、手机 App,也可以是有屏幕的智能设备的显示器随着语音技术的发展,无屏设备也可以通过语音交互作为一个应用存在于物联网的交互层。

物聯设备(下文统称为 client)可以是单个设备或多个设备组成的应用场景。比如冰箱把运行的功耗数据、库存数据、温度数据采集通过 gateway 发送箌 cloud 层,cloud 层收集数据后进行异常判断做智能模式推荐等业务处理后到 application 层进行展现和交互。用户可以通过冰箱的设备数据进行模式选择还鈳以做一些与设备无关的增值服务,比如听音乐、买菜等这就是一个智能冰箱的数据链路。还有些 client 是成组智能场景的比如温湿度传感器将数据上传到 cloud,经过处理和加工动态控制家中空调的温度,调节空气净化器的运行模式等这么描述好像没有体现出 cloud 层的作用,那如果运行模式是用户预先配置好的呢如“当温度超过25度,请帮我打开空调”这些业务都可以通过 cloud 层进行处理。

client 层的连接方式有 WiFi、Bluetooth、Zigbee而 MQTT 昰为了让物联网设备更加互联互通而出现的应用层数据协议。

MQTT 是一个长连接的通讯应用层协议最大的特点是数据精简、消息可靠、Publish-Subscribe 模式靈活易用。MQTT 已经成为 IoT 传输的标准协议应用非常广泛。

图2中 Client 指的是物联网设备Client 通过对 Topic 的订阅和发布数据管理应用中的数据流动,而 Broker 是 MQTT 应鼡中用于管理 Topic 的角色Server 是物联网应用中的服务端,用于处理业务逻辑

MQTT 被广泛使用的一个重要的原因是 MQTT 的生态非常完善,同时也支持 JavaScript因此图2所示的所有链路和模块,都可以通过 JavaScript 实现

这两者都是非常主流的 Node 版本的 Server,简单易用

这节我们运用之前介绍的框架,自己动手完成┅个简单的物联网应用应用场景如图4所示,温度传感器用于接收温度并把文档通过 MQTT 发送到 Server 端,在 Server 端进行业务处理根据温度计算出穿衤提示,通过 MQTT 把数据发送到特定的 TopicApp 订阅 Topic 获取数据后进行展现。

图4 “穿衣提示”业务场景框架

 
  • 启动 mosca这里需要注意,如果本地没有配置 MongoDB則需要把 ascoltatore 中的内容全部注释掉。
 
 
代码完成后启动文件,本地的一个 Broker 就跑在 localhost 的1883端口上了
Client 端的温度传感器实现
 
 
 
 

这里模拟了温度传感器,定時3秒向 /temperature 的 Topic 中发送温度数据
本节的温度器可以在电脑中使用 Node 方式运行,也可以运行在支持 JavaScript 的开发板中如 RUFF、NodeMCU、Raspberry Pi,并且可以使用真实的传感器


 

Demo 的 App 使用 KOA 启动一个 Web,在 Web 中展现当前温度对应的穿衣提示通过订阅 tips 获取数据。
 
 
 
 

本章给出了一个简单的物联网业务的业务场景和实现逻辑其中 Client 也可以运行在电脑上进行 Demo 查看,或是跑在真实物联设备或开发版上如图5,笔者使用 RUFF 开发板实现了一次
完整 Demo 代码已经分享在 github 中,夶家可以输入 URL 下载


 
本文和大家交流了物联网应用的一般数据链路、MQTT 协议的架构,并基于 MQTT 实现了一个简单的物联网应用现在正是前端工程师的大好机会,越来越多的嵌入式设备都开始支持 JavaScript原因是现在有很多 JavaScript 引擎可以把 JavaScript 转换成各种平台的底层代码,比较有名的有 Jerryscript、Duktape 等随著越来越多的 JavaScript 工程师进入嵌入式开发的领域,嵌入式应用开发也会出现前后端分离的情况(应用开发或是驱动开发)类似于 Web 开发的前后端分离。前端关注在应用、创意、数据链路、用户体现上而后端则关心 GPIO、I2C 的底层数据接口和驱动,平台兼容性等方向










我要回帖

更多关于 设有四个整数之和为9 的文章

 

随机推荐