AI:人工智能时代的一些思考


人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。
  • 最近阅读了阮一峰写的一本书,书名叫未来世界的幸存者,书中对技术进步带来的变革有着深度的思考,以“2016年3月,谷歌公司的围棋程序 AlphaGo战胜了世界冠军李世石”这一热点事件触发思考技术变革对将来人们生活的影响。的确,现今,互联网进入了AI(人工智能)全新的时代,从PC时代到移动互联网时代,再到人工智能时代,与此带来的新名词也越来越多,VR、AR、MR等一系列新技术正在影响着我们的方方面面。
  • 然而技术的变革和进步也对我们的前端开发工程师提出更高的要求,那前端是所有端中与用户最亲近的,面对技术变革的机遇和挑战,我们该做些什么,该怎么做提高自己的技术能力呢?我想这些都是我们要即将面对和思考实践的。
  • 下面就分享下算法与数据结构的基础知识。

算法与数据结构

当“人工智能”、“AlphaGo”、“无人驾驶””等词语不断在人们视野中出现的时候,意味着我们正步入一个算法的时代。计算机通过提供给人类每天要面临的各种选择的最优解,从而让我们能更加高效的生活在这个信息爆炸的时代。而对于大多数非算法专业领域的程序员来说,也逐渐意识到了算法的重要性。学习算法,从而更好的应用算法,通过算法去优化代码,提高程序效率。

1. 计算机

计算机是一门研究用计算机进行信息表示和处理的科学。这里面涉及到两个问题:信息的表示,信息的处理。编写解决实际问题的程序的一般过程:
1. 如何用数据形式描述问题?—即由问题抽象出一个适当的数学模型;
2. 问题所涉及的数据量大小及数据之间的关系;
3. 如何在计算机中存储数据及体现数据之间的关系?
4. 处理问题时需要对数据作何种运算?
5. 所编写的程序的性能是否良好?

2. 数据结构

数据结构(Data Structure):是指相互之间具有(存在)一定联系(关系)的数据元素的集合。元素之间的相互联系(关系)称为逻辑结构。数据元素之间的逻辑结构有四种基本类型。


① 集合:结构中的数据元素除了“同属于一个集合”外,没有其它关系。
② 线性结构:结构中的数据元素之间存在一对一的关系。
③ 树型结构:结构中的数据元素之间存在一对多的关系。
④ 图状结构或网状结构:结构中的数据元素之间存在多对多的关系。

3. 数据结构的存储方式

数据结构在计算机内存中的存储包括数据元素的存储和元素之间的关系的表示。
元素之间的关系在计算机中有两种不同的表示方法:顺序表示和非顺序表示。由此得出两种不同的存储结构:顺序存储结构和链式存储结构。
– 顺序存储结构:用数据元素在存储器中的相对位置来表示数据元素之间的逻辑结构(关系)。
– 链式存储结构:在每一个数据元素中增加一个存放另一个元素地址的指针(pointer ),用该指针来表示数据元素之间的逻辑结构(关系)。

例:设有数据集合A={3.0,2.3,5.0,-8.5,11.0} ,两种不同的存储结构。
顺序结构:数据元素存放的地址是连续的;
链式结构:数据元素存放的地址是否连续没有要求。
数据的逻辑结构和物理结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。

4. 数据结构的三个组成部分:

逻辑结构: 数据元素之间逻辑关系的描述
D_S=(D,S)
存储结构: 数据元素在计算机中的存储及其逻辑关系的表现称为数据的存储结构或物理结构。
数据操作: 对数据要进行的运算。

5. 算法

算法(Algorithm):是对特定问题求解方法(步骤)的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。算法具有以下五个特性:
① 有穷性: 一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
② 确定性:算法中每一条指令必须有确切的含义。不存在二义性。且算法只有一个入口和一个出口。
③ 可行性: 一个算法是能行的。即算法描述的操作都可以通过已经实现的基本运算执行有限次来实现。
④ 输入: 一个算法有零个或多个输入,这些输入取自于某个特定的对象集合。
⑤ 输出: 一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量。

6. 评价一个好的算法有以下几个标准
① 正确性(Correctness ): 算法应满足具体问题的需求。
② 可读性(Readability): 算法应容易供人阅读和交流。可读性好的算法有助于对算法的理解和修改。
③ 健壮性(Robustness): 算法应具有容错处理。当输入非法或错误数据时,算法应能适当地作出反应或进行处理,而不会产生莫名其妙的输出结果。
④ 通用性(Generality): 算法应具有一般性 ,即算法的处理结果对于一般的数据集合都成立。
⑤ 效率与存储量需求: 效率指的是算法执行的时间;存储量需求指算法执行过程中所需要的最大存储空间。一般地,这两者与问题的规模有关。

7. 时间复杂度

算法中基本操作重复执行的次数是问题规模n的某个函数,其时间量度记作 T(n)=O(f(n)),称作算法的渐近时间复杂度(Asymptotic Time complexity),简称时间复杂度。
一般地,常用最深层循环内的语句中的原操作的执行频度(重复执行的次数)来表示。
表示时间复杂度的阶有:
O(1) :常量时间阶 O (n):线性时间阶
O(㏒n) :对数时间阶 O(n㏒n) :线性对数时间阶
O (nk): k≥2 ,k次方时间阶
例1 两个n阶方阵的乘法

for(i=1,i<=n; ++i)    for(j=1; j<=n; ++j)        { c[i][j]=0 ;            for(k=1; k<=n; ++k)              c[i][j]+=a[i][k]*b[k][j] ; }          复制代码
由于是一个三重循环,每个循环从1到n,则总次数为: n×n×n=n3 时间复杂度为T(n)=O(n3)
例2 

 {++x; s=0 ;}复制代码
将x自增看成是基本操作,则语句频度为1,即时间复杂度为O(1) 。
如果将s=0也看成是基本操作,则语句频度为2,其时间复杂度仍为O(1),即常量阶。
例3

for(i=1; i<=n; ++i){ ++x; s+=x ; }复制代码
语句频度为:2n,其时间复杂度为:O(n) ,即为线性阶。
例4 

for(i=1; i<=n; ++i)    for(j=1; j<=n; ++j)             { ++x; s+=x ; }复制代码
语句频度为:n*n*2 ,其时间复杂度为:O(n2) ,即为平方阶。
比较关系:

O(1)<O(㏒n)<O(n)<O(n㏒n)<O(n2)<O(n3)复制代码

8. 空间复杂度

指算法编写成程序后,在计算机中运行时所需存储空间大小的度量。记作: S(n)=O(f(n))
其中: n为问题的规模(或大小)
该存储空间一般包括三个方面:
指令常数变量所占用的存储空间;
输入数据所占用的存储空间;
辅助(存储)空间。
一般地,算法的空间复杂度指的是辅助空间。
一维数组a[n]: 空间复杂度 O(n)
二维数组a[n][m]: 空间复杂度 O(n*m)

习题
例5

 for(i=2;i<=n;++i)

    for(j=2;j<=i-1;++j){     ++x; a[i,j]=x; }复制代码


算法的学习方法

把所有经典算法写一遍
看算法有关源码
加入算法学习社区,相互鼓励学习
看经典书籍
刷题

常见的数据结构

数组
数组是相同数据类型的元素按一定顺序排列的集合,是一块连续的内存空间。

链表
链表是一种非连续、非顺序的结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,链表由一系列结点组成。这些节点不必在内存中相连。每个节点由数据部分Data和链部分Next,Next指向下一个节点,这样当添加或者删除时,只需要改变相关节点的Next的指向,效率很高。



队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,亦即所谓的先进先出(FIFO)。
生活中形象举例:在火车站排队买票,在超市排队结账等。

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。它体现了后进先出(LIFO)的特点。
栈的应用非常广泛,在日常生活中,有许多类似栈的例子,如刷洗盘子时,依次把每个洗净的盘子放到洗好的盘子上。相当于进栈;取用盘子时,从一摞盘子上一个接一个地向下拿,相当于出栈。



集合
集合是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素,其主要特性是元素不可重复。

散列表
散列表也叫哈希表,是根据关键键值(Keyvalue)进行访问的数据结构,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数。

树(tree)是包含n(n>0)个节点的有穷集合,其中:
每个元素称为节点(node);
有一个特定的节点被称为根节点或树根(root)。
除根节点之外的其余数据元素被分为m(m≥0)个互不相交的结合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。


树这种数据结构在计算机世界中有广泛的应用,比如操作系统中用到了红黑树,数据库用到了B+树,编译器中的语法树,内存管理用到了堆(本质上也是树),信息论中的哈夫曼编码等。

二叉树
定义
二叉树是每个节点最多有两棵子树的树结构。通常子树被称作“左子树”和“右子树”。二叉树常被用于实现二叉查找树和二叉堆。

相关性质
二叉树的每个结点至多只有2棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
二叉树的第i层至多有2^(i-1)个结点;深度为k的二叉树至多有2^k-1个结点。
一棵深度为k,且有2^k-1个节点的二叉树称之为 满二叉树 ;
深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为 完全二叉树 。



树和二叉树的区别
(1) 二叉树每个节点最多有2个子节点,树则无限制。
(2) 二叉树中节点的子树分为左子树和右子树,即使某节点只有一棵子树,也要指明该子树是左子树还是右子树,即二叉树是有序的。
(3) 树决不能为空,它至少有一个节点,而一棵二叉树可以是空的。

     数据结构里最重要的两个结构就是树和图。比如一个公司由上到下的成员职位、一天中要做的事、一生的计划、你的目标可以分为一个个小的目标等等都是相当于数据结构中的树的应用。图是描述事物之间关系的,当你要想去某个地方时,GPS系统为什么能给指出一条两地之间的路线,这就是利用了图的存储和遍历运算,求出最优解。在现实生活中很多复杂的关系都可以用图来描述并利用图去解决一些问题。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值